summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2011-11-08 20:40:44 +0400
committerAndrew Dolgov <[email protected]>2011-11-08 20:40:44 +0400
commit81bea17aefb26859f825b9293c7c99192874806e (patch)
treefb244408ca271affa2899adb634788802c9a89d8
parent870a70e109ac9e80a88047044530de53d0404ec7 (diff)
upgrade Dojo to 1.6.1
-rw-r--r--FeedTree.js2
-rw-r--r--lib/dijit/Calendar.js844
-rw-r--r--lib/dijit/CheckedMenuItem.js60
-rw-r--r--lib/dijit/ColorPalette.js147
-rw-r--r--lib/dijit/Declaration.js122
-rw-r--r--lib/dijit/Dialog.js827
-rw-r--r--lib/dijit/DialogUnderlay.js132
-rw-r--r--lib/dijit/Editor.js1231
-rw-r--r--lib/dijit/InlineEditBox.js794
-rw-r--r--lib/dijit/LICENSE2
-rw-r--r--lib/dijit/Menu.js1009
-rw-r--r--lib/dijit/MenuBar.js97
-rw-r--r--lib/dijit/MenuBarItem.js25
-rw-r--r--lib/dijit/MenuItem.js245
-rw-r--r--lib/dijit/MenuSeparator.js36
-rw-r--r--lib/dijit/PopupMenuBarItem.js14
-rw-r--r--lib/dijit/PopupMenuItem.js99
-rw-r--r--lib/dijit/ProgressBar.js203
-rw-r--r--lib/dijit/TitlePane.js341
-rw-r--r--lib/dijit/Toolbar.js54
-rw-r--r--lib/dijit/ToolbarSeparator.js33
-rw-r--r--lib/dijit/Tooltip.js571
-rw-r--r--lib/dijit/TooltipDialog.js188
-rw-r--r--lib/dijit/Tree.js2276
-rw-r--r--lib/dijit/_Calendar.js16
-rw-r--r--lib/dijit/_Contained.js91
-rw-r--r--lib/dijit/_Container.js190
-rw-r--r--lib/dijit/_CssStateMixin.js395
-rw-r--r--lib/dijit/_DialogMixin.js89
-rw-r--r--lib/dijit/_HasDropDown.js633
-rw-r--r--lib/dijit/_KeyNavContainer.js338
-rw-r--r--lib/dijit/_PaletteMixin.js406
-rw-r--r--lib/dijit/_Templated.js503
-rw-r--r--lib/dijit/_TimePicker.js726
-rw-r--r--lib/dijit/_Widget.js807
-rw-r--r--lib/dijit/_WidgetBase.js826
-rw-r--r--lib/dijit/_base.js9
-rw-r--r--lib/dijit/_base/focus.js803
-rw-r--r--lib/dijit/_base/manager.js718
-rw-r--r--lib/dijit/_base/place.js449
-rw-r--r--lib/dijit/_base/popup.js533
-rw-r--r--lib/dijit/_base/scroll.js17
-rw-r--r--lib/dijit/_base/sniff.js15
-rw-r--r--lib/dijit/_base/typematic.js262
-rw-r--r--lib/dijit/_base/wai.js191
-rw-r--r--lib/dijit/_base/window.js13
-rw-r--r--lib/dijit/_editor/RichText.js3112
-rw-r--r--lib/dijit/_editor/_Plugin.js342
-rw-r--r--lib/dijit/_editor/html.js318
-rw-r--r--lib/dijit/_editor/nls/ar/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/ar/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/ar/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ca/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/ca/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/ca/commands.js2
-rw-r--r--lib/dijit/_editor/nls/cs/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/cs/commands.js2
-rw-r--r--lib/dijit/_editor/nls/da/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/da/commands.js2
-rw-r--r--lib/dijit/_editor/nls/de/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/el/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/es/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/es/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/fi/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/fr/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/fr/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/fr/commands.js2
-rw-r--r--lib/dijit/_editor/nls/he/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/he/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/he/commands.js2
-rw-r--r--lib/dijit/_editor/nls/hu/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/it/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/it/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/it/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ja/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/ja/commands.js2
-rw-r--r--lib/dijit/_editor/nls/kk/FontChoice.js1
-rw-r--r--lib/dijit/_editor/nls/kk/LinkDialog.js1
-rw-r--r--lib/dijit/_editor/nls/kk/commands.js1
-rw-r--r--lib/dijit/_editor/nls/ko/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/ko/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/ko/commands.js2
-rw-r--r--lib/dijit/_editor/nls/nb/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/nb/commands.js2
-rw-r--r--lib/dijit/_editor/nls/nl/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/pl/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/pl/commands.js2
-rw-r--r--lib/dijit/_editor/nls/pt-pt/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/pt-pt/commands.js2
-rw-r--r--lib/dijit/_editor/nls/pt/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/pt/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ro/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/ro/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ru/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/ru/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/sk/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/sl/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/sl/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/sl/commands.js2
-rw-r--r--lib/dijit/_editor/nls/sv/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/th/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/th/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/tr/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/zh-tw/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/zh-tw/commands.js2
-rw-r--r--lib/dijit/_editor/nls/zh/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/zh/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/plugins/AlwaysShowToolbar.js293
-rw-r--r--lib/dijit/_editor/plugins/EnterKeyHandling.js1007
-rw-r--r--lib/dijit/_editor/plugins/FontChoice.js812
-rw-r--r--lib/dijit/_editor/plugins/FullScreen.js647
-rw-r--r--lib/dijit/_editor/plugins/LinkDialog.js714
-rw-r--r--lib/dijit/_editor/plugins/NewPage.js93
-rw-r--r--lib/dijit/_editor/plugins/Print.js166
-rw-r--r--lib/dijit/_editor/plugins/TabIndent.js80
-rw-r--r--lib/dijit/_editor/plugins/TextColor.js143
-rw-r--r--lib/dijit/_editor/plugins/ToggleDir.js98
-rw-r--r--lib/dijit/_editor/plugins/ViewSource.js844
-rw-r--r--lib/dijit/_editor/range.js950
-rw-r--r--lib/dijit/_editor/selection.js620
-rw-r--r--lib/dijit/_tree/dndSource.js15
-rw-r--r--lib/dijit/dijit-all.js77
-rw-r--r--lib/dijit/dijit-all.js.uncompressed.js28580
-rw-r--r--lib/dijit/dijit.js38
-rw-r--r--lib/dijit/dijit.js.uncompressed.js5961
-rw-r--r--lib/dijit/form/Button.js463
-rw-r--r--lib/dijit/form/CheckBox.js262
-rw-r--r--lib/dijit/form/ComboBox.js1812
-rw-r--r--lib/dijit/form/ComboButton.js9
-rw-r--r--lib/dijit/form/CurrencyTextBox.js103
-rw-r--r--lib/dijit/form/DateTextBox.js34
-rw-r--r--lib/dijit/form/DropDownButton.js9
-rw-r--r--lib/dijit/form/FilteringSelect.js301
-rw-r--r--lib/dijit/form/Form.js231
-rw-r--r--lib/dijit/form/HorizontalRule.js92
-rw-r--r--lib/dijit/form/HorizontalRuleLabels.js115
-rw-r--r--lib/dijit/form/HorizontalSlider.js526
-rw-r--r--lib/dijit/form/MappedTextBox.js9
-rw-r--r--lib/dijit/form/MultiSelect.js148
-rw-r--r--lib/dijit/form/NumberSpinner.js89
-rw-r--r--lib/dijit/form/NumberTextBox.js370
-rw-r--r--lib/dijit/form/RadioButton.js10
-rw-r--r--lib/dijit/form/RangeBoundTextBox.js9
-rw-r--r--lib/dijit/form/Select.js419
-rw-r--r--lib/dijit/form/SimpleTextarea.js144
-rw-r--r--lib/dijit/form/Slider.js13
-rw-r--r--lib/dijit/form/TextBox.js616
-rw-r--r--lib/dijit/form/Textarea.js252
-rw-r--r--lib/dijit/form/TimeTextBox.js81
-rw-r--r--lib/dijit/form/ToggleButton.js9
-rw-r--r--lib/dijit/form/ValidationTextBox.js675
-rw-r--r--lib/dijit/form/VerticalRule.js30
-rw-r--r--lib/dijit/form/VerticalRuleLabels.js30
-rw-r--r--lib/dijit/form/VerticalSlider.js39
-rw-r--r--lib/dijit/form/_DateTimeTextBox.js374
-rw-r--r--lib/dijit/form/_FormMixin.js601
-rw-r--r--lib/dijit/form/_FormSelectWidget.js867
-rw-r--r--lib/dijit/form/_FormWidget.js515
-rw-r--r--lib/dijit/form/_Spinner.js167
-rw-r--r--lib/dijit/form/nls/da/validate.js2
-rw-r--r--lib/dijit/form/nls/kk/ComboBox.js1
-rw-r--r--lib/dijit/form/nls/kk/Textarea.js1
-rw-r--r--lib/dijit/form/nls/kk/validate.js1
-rw-r--r--lib/dijit/form/nls/pl/Textarea.js2
-rw-r--r--lib/dijit/form/nls/sl/ComboBox.js2
-rw-r--r--lib/dijit/form/nls/sl/Textarea.js2
-rw-r--r--lib/dijit/form/nls/sl/validate.js2
-rw-r--r--lib/dijit/icons/commonIcons.css22
-rw-r--r--lib/dijit/icons/commonIcons_rtl.css14
-rw-r--r--lib/dijit/icons/editorIcons.css25
-rw-r--r--lib/dijit/icons/editorIcons_rtl.css17
-rw-r--r--lib/dijit/layout/AccordionContainer.js686
-rw-r--r--lib/dijit/layout/AccordionPane.js28
-rw-r--r--lib/dijit/layout/BorderContainer.js830
-rw-r--r--lib/dijit/layout/ContentPane.js860
-rw-r--r--lib/dijit/layout/LayoutContainer.js96
-rw-r--r--lib/dijit/layout/LinkPane.js51
-rw-r--r--lib/dijit/layout/ScrollingTabController.js662
-rw-r--r--lib/dijit/layout/SplitContainer.js913
-rw-r--r--lib/dijit/layout/StackContainer.js460
-rw-r--r--lib/dijit/layout/StackController.js484
-rw-r--r--lib/dijit/layout/TabContainer.js77
-rw-r--r--lib/dijit/layout/TabController.js216
-rw-r--r--lib/dijit/layout/_ContentPaneResizeMixin.js260
-rw-r--r--lib/dijit/layout/_LayoutWidget.js411
-rw-r--r--lib/dijit/layout/_TabContainerBase.js193
-rw-r--r--lib/dijit/lib/main.js20
-rw-r--r--lib/dijit/nls/dijit-all_ROOT.js1
-rw-r--r--lib/dijit/nls/dijit-all_ar.js1
-rw-r--r--lib/dijit/nls/dijit-all_ca.js1
-rw-r--r--lib/dijit/nls/dijit-all_cs.js1
-rw-r--r--lib/dijit/nls/dijit-all_da.js1
-rw-r--r--lib/dijit/nls/dijit-all_de-de.js1
-rw-r--r--lib/dijit/nls/dijit-all_de.js1
-rw-r--r--lib/dijit/nls/dijit-all_el.js1
-rw-r--r--lib/dijit/nls/dijit-all_en-gb.js1
-rw-r--r--lib/dijit/nls/dijit-all_en-us.js1
-rw-r--r--lib/dijit/nls/dijit-all_en.js1
-rw-r--r--lib/dijit/nls/dijit-all_es-es.js1
-rw-r--r--lib/dijit/nls/dijit-all_es.js1
-rw-r--r--lib/dijit/nls/dijit-all_fi-fi.js1
-rw-r--r--lib/dijit/nls/dijit-all_fi.js1
-rw-r--r--lib/dijit/nls/dijit-all_fr-fr.js1
-rw-r--r--lib/dijit/nls/dijit-all_fr.js1
-rw-r--r--lib/dijit/nls/dijit-all_he-il.js1
-rw-r--r--lib/dijit/nls/dijit-all_he.js1
-rw-r--r--lib/dijit/nls/dijit-all_hu.js1
-rw-r--r--lib/dijit/nls/dijit-all_it-it.js1
-rw-r--r--lib/dijit/nls/dijit-all_it.js1
-rw-r--r--lib/dijit/nls/dijit-all_ja-jp.js1
-rw-r--r--lib/dijit/nls/dijit-all_ja.js1
-rw-r--r--lib/dijit/nls/dijit-all_ko-kr.js1
-rw-r--r--lib/dijit/nls/dijit-all_ko.js1
-rw-r--r--lib/dijit/nls/dijit-all_nb.js1
-rw-r--r--lib/dijit/nls/dijit-all_nl-nl.js1
-rw-r--r--lib/dijit/nls/dijit-all_nl.js1
-rw-r--r--lib/dijit/nls/dijit-all_pl.js1
-rw-r--r--lib/dijit/nls/dijit-all_pt-br.js1
-rw-r--r--lib/dijit/nls/dijit-all_pt-pt.js1
-rw-r--r--lib/dijit/nls/dijit-all_pt.js1
-rw-r--r--lib/dijit/nls/dijit-all_ru.js1
-rw-r--r--lib/dijit/nls/dijit-all_sk.js1
-rw-r--r--lib/dijit/nls/dijit-all_sl.js1
-rw-r--r--lib/dijit/nls/dijit-all_sv.js1
-rw-r--r--lib/dijit/nls/dijit-all_th.js1
-rw-r--r--lib/dijit/nls/dijit-all_tr.js1
-rw-r--r--lib/dijit/nls/dijit-all_xx.js1
-rw-r--r--lib/dijit/nls/dijit-all_zh-cn.js1
-rw-r--r--lib/dijit/nls/dijit-all_zh-tw.js1
-rw-r--r--lib/dijit/nls/dijit-all_zh.js1
-rw-r--r--lib/dijit/nls/kk/common.js1
-rw-r--r--lib/dijit/nls/kk/loading.js1
-rw-r--r--lib/dijit/nls/sl/loading.js2
-rw-r--r--lib/dijit/package.json24
-rw-r--r--lib/dijit/resources/_modules.js20
-rw-r--r--lib/dijit/robot.js9
-rw-r--r--lib/dijit/robotx.js32
-rw-r--r--lib/dijit/themes/a11y/colors3x4-rtl.pngbin282 -> 0 bytes
-rw-r--r--lib/dijit/themes/a11y/colors7x10-rtl.pngbin808 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/Calendar.css370
-rw-r--r--lib/dijit/themes/claro/Calendar.less273
-rw-r--r--lib/dijit/themes/claro/Calendar_rtl.css14
-rw-r--r--lib/dijit/themes/claro/Calendar_rtl.less19
-rw-r--r--lib/dijit/themes/claro/ColorPalette.css45
-rw-r--r--lib/dijit/themes/claro/ColorPalette.less44
-rw-r--r--lib/dijit/themes/claro/Common.css95
-rw-r--r--lib/dijit/themes/claro/Common.less76
-rw-r--r--lib/dijit/themes/claro/Dialog.css265
-rw-r--r--lib/dijit/themes/claro/Dialog.less203
-rw-r--r--lib/dijit/themes/claro/Dialog_rtl.css10
-rw-r--r--lib/dijit/themes/claro/Dialog_rtl.less13
-rw-r--r--lib/dijit/themes/claro/Editor.css62
-rw-r--r--lib/dijit/themes/claro/Editor.less59
-rw-r--r--lib/dijit/themes/claro/Editor_rtl.css6
-rw-r--r--lib/dijit/themes/claro/Editor_rtl.less9
-rw-r--r--lib/dijit/themes/claro/InlineEditBox.css19
-rw-r--r--lib/dijit/themes/claro/InlineEditBox.less25
-rw-r--r--lib/dijit/themes/claro/Menu.css235
-rw-r--r--lib/dijit/themes/claro/Menu.less188
-rw-r--r--lib/dijit/themes/claro/Menu_rtl.css8
-rw-r--r--lib/dijit/themes/claro/Menu_rtl.less11
-rw-r--r--lib/dijit/themes/claro/ProgressBar.css61
-rw-r--r--lib/dijit/themes/claro/ProgressBar.less56
-rw-r--r--lib/dijit/themes/claro/README64
-rw-r--r--lib/dijit/themes/claro/TimePicker.css164
-rw-r--r--lib/dijit/themes/claro/TimePicker.less124
-rw-r--r--lib/dijit/themes/claro/TimePicker_rtl.css8
-rw-r--r--lib/dijit/themes/claro/TimePicker_rtl.less12
-rw-r--r--lib/dijit/themes/claro/TitlePane.css79
-rw-r--r--lib/dijit/themes/claro/TitlePane.less74
-rw-r--r--lib/dijit/themes/claro/TitlePane_rtl.css4
-rw-r--r--lib/dijit/themes/claro/TitlePane_rtl.less7
-rw-r--r--lib/dijit/themes/claro/Toolbar.css233
-rw-r--r--lib/dijit/themes/claro/Toolbar.less157
-rw-r--r--lib/dijit/themes/claro/Toolbar_rtl.css30
-rw-r--r--lib/dijit/themes/claro/Toolbar_rtl.less32
-rw-r--r--lib/dijit/themes/claro/Tree.css156
-rw-r--r--lib/dijit/themes/claro/Tree.less133
-rw-r--r--lib/dijit/themes/claro/claro.css4715
-rw-r--r--lib/dijit/themes/claro/claro_rtl.css396
-rw-r--r--lib/dijit/themes/claro/compile.js62
-rw-r--r--lib/dijit/themes/claro/document.css118
-rw-r--r--lib/dijit/themes/claro/document.less45
-rw-r--r--lib/dijit/themes/claro/form/Button.css185
-rw-r--r--lib/dijit/themes/claro/form/Button.less154
-rw-r--r--lib/dijit/themes/claro/form/Button_rtl.css23
-rw-r--r--lib/dijit/themes/claro/form/Button_rtl.less16
-rw-r--r--lib/dijit/themes/claro/form/Checkbox.css91
-rw-r--r--lib/dijit/themes/claro/form/Checkbox.less79
-rw-r--r--lib/dijit/themes/claro/form/Common.css227
-rw-r--r--lib/dijit/themes/claro/form/Common.less194
-rw-r--r--lib/dijit/themes/claro/form/Common_rtl.css11
-rw-r--r--lib/dijit/themes/claro/form/Common_rtl.less13
-rw-r--r--lib/dijit/themes/claro/form/NumberSpinner.css160
-rw-r--r--lib/dijit/themes/claro/form/NumberSpinner.less150
-rw-r--r--lib/dijit/themes/claro/form/RadioButton.css96
-rw-r--r--lib/dijit/themes/claro/form/RadioButton.less84
-rw-r--r--lib/dijit/themes/claro/form/Select.css124
-rw-r--r--lib/dijit/themes/claro/form/Select.less124
-rw-r--r--lib/dijit/themes/claro/form/Select_rtl.css4
-rw-r--r--lib/dijit/themes/claro/form/Select_rtl.less6
-rw-r--r--lib/dijit/themes/claro/form/Slider.css422
-rw-r--r--lib/dijit/themes/claro/form/Slider.less362
-rw-r--r--lib/dijit/themes/claro/form/Slider_rtl.css20
-rw-r--r--lib/dijit/themes/claro/form/Slider_rtl.less33
-rw-r--r--lib/dijit/themes/claro/images/loading.gifbin751 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/images/tooltip.pngbin1941 -> 1818 bytes
-rw-r--r--lib/dijit/themes/claro/images/tooltipGradient.pngbin0 -> 1030 bytes
-rw-r--r--lib/dijit/themes/claro/layout/AccordionContainer.css145
-rw-r--r--lib/dijit/themes/claro/layout/AccordionContainer.less116
-rw-r--r--lib/dijit/themes/claro/layout/BorderContainer.css130
-rw-r--r--lib/dijit/themes/claro/layout/BorderContainer.less128
-rw-r--r--lib/dijit/themes/claro/layout/ContentPane.css39
-rw-r--r--lib/dijit/themes/claro/layout/ContentPane.less43
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer.css536
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer.less408
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer_rtl.css72
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer_rtl.less81
-rw-r--r--lib/dijit/themes/claro/layout/images/tabBottom.pngbin753 -> 718 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabTop.pngbin748 -> 721 bytes
-rw-r--r--lib/dijit/themes/claro/variables.less189
-rw-r--r--lib/dijit/themes/dijit.css880
-rw-r--r--lib/dijit/themes/dijit_rtl.css62
-rw-r--r--lib/dijit/themes/nihilo/Calendar.css66
-rw-r--r--lib/dijit/themes/nihilo/Calendar_rtl.css4
-rw-r--r--lib/dijit/themes/nihilo/ColorPalette.css4
-rw-r--r--lib/dijit/themes/nihilo/Common.css6
-rw-r--r--lib/dijit/themes/nihilo/Dialog.css84
-rw-r--r--lib/dijit/themes/nihilo/Dialog_rtl.css1
-rw-r--r--lib/dijit/themes/nihilo/Editor.css9
-rw-r--r--lib/dijit/themes/nihilo/Editor_rtl.css8
-rw-r--r--lib/dijit/themes/nihilo/Menu.css27
-rw-r--r--lib/dijit/themes/nihilo/Menu_rtl.css8
-rw-r--r--lib/dijit/themes/nihilo/ProgressBar.css21
-rw-r--r--lib/dijit/themes/nihilo/TimePicker.css13
-rw-r--r--lib/dijit/themes/nihilo/TimePicker_rtl.css2
-rw-r--r--lib/dijit/themes/nihilo/TitlePane.css13
-rw-r--r--lib/dijit/themes/nihilo/TitlePane_rtl.css6
-rw-r--r--lib/dijit/themes/nihilo/Toolbar.css23
-rw-r--r--lib/dijit/themes/nihilo/Tree.css37
-rw-r--r--lib/dijit/themes/nihilo/Tree_rtl.css12
-rw-r--r--lib/dijit/themes/nihilo/form/Button.css43
-rw-r--r--lib/dijit/themes/nihilo/form/Button_rtl.css3
-rw-r--r--lib/dijit/themes/nihilo/form/Checkbox.css47
-rw-r--r--lib/dijit/themes/nihilo/form/Common.css33
-rw-r--r--lib/dijit/themes/nihilo/form/RadioButton.css46
-rw-r--r--lib/dijit/themes/nihilo/form/Select.css18
-rw-r--r--lib/dijit/themes/nihilo/form/Slider.css35
-rw-r--r--lib/dijit/themes/nihilo/form/Slider_rtl.css11
-rw-r--r--lib/dijit/themes/nihilo/form/TimeTextBox.css2
-rw-r--r--lib/dijit/themes/nihilo/layout/AccordionContainer.css11
-rw-r--r--lib/dijit/themes/nihilo/layout/AccordionContainer_rtl.css5
-rw-r--r--lib/dijit/themes/nihilo/layout/BorderContainer.css35
-rw-r--r--lib/dijit/themes/nihilo/layout/ContentPane.css10
-rw-r--r--lib/dijit/themes/nihilo/layout/SplitContainer.css17
-rw-r--r--lib/dijit/themes/nihilo/layout/TabContainer.css247
-rw-r--r--lib/dijit/themes/nihilo/layout/TabContainer_rtl.css19
-rw-r--r--lib/dijit/themes/nihilo/nihilo.css3444
-rw-r--r--lib/dijit/themes/nihilo/nihilo_rtl.css251
-rw-r--r--lib/dijit/themes/soria/Calendar.css66
-rw-r--r--lib/dijit/themes/soria/Calendar_rtl.css4
-rw-r--r--lib/dijit/themes/soria/ColorPalette.css4
-rw-r--r--lib/dijit/themes/soria/Common.css6
-rw-r--r--lib/dijit/themes/soria/Dialog.css84
-rw-r--r--lib/dijit/themes/soria/Dialog_rtl.css2
-rw-r--r--lib/dijit/themes/soria/Editor.css10
-rw-r--r--lib/dijit/themes/soria/Editor_rtl.css6
-rw-r--r--lib/dijit/themes/soria/Menu.css27
-rw-r--r--lib/dijit/themes/soria/Menu_rtl.css4
-rw-r--r--lib/dijit/themes/soria/ProgressBar.css21
-rw-r--r--lib/dijit/themes/soria/TimePicker.css11
-rw-r--r--lib/dijit/themes/soria/TimePicker_rtl.css2
-rw-r--r--lib/dijit/themes/soria/TitlePane.css14
-rw-r--r--lib/dijit/themes/soria/TitlePane_rtl.css6
-rw-r--r--lib/dijit/themes/soria/Toolbar.css27
-rw-r--r--lib/dijit/themes/soria/Tree.css37
-rw-r--r--lib/dijit/themes/soria/Tree_rtl.css12
-rw-r--r--lib/dijit/themes/soria/form/Button.css35
-rw-r--r--lib/dijit/themes/soria/form/Button_rtl.css2
-rw-r--r--lib/dijit/themes/soria/form/Checkbox.css47
-rw-r--r--lib/dijit/themes/soria/form/Common.css33
-rw-r--r--lib/dijit/themes/soria/form/RadioButton.css46
-rw-r--r--lib/dijit/themes/soria/form/Select.css18
-rw-r--r--lib/dijit/themes/soria/form/Slider.css36
-rw-r--r--lib/dijit/themes/soria/form/Slider_rtl.css11
-rw-r--r--lib/dijit/themes/soria/form/TimeTextBox.css2
-rw-r--r--lib/dijit/themes/soria/layout/AccordionContainer.css13
-rw-r--r--lib/dijit/themes/soria/layout/AccordionContainer_rtl.css5
-rw-r--r--lib/dijit/themes/soria/layout/BorderContainer.css36
-rw-r--r--lib/dijit/themes/soria/layout/ContentPane.css10
-rw-r--r--lib/dijit/themes/soria/layout/SplitContainer.css17
-rw-r--r--lib/dijit/themes/soria/layout/TabContainer.css178
-rw-r--r--lib/dijit/themes/soria/layout/TabContainer_rtl.css19
-rw-r--r--lib/dijit/themes/soria/soria.css3384
-rw-r--r--lib/dijit/themes/soria/soria_rtl.css252
-rw-r--r--lib/dijit/themes/tundra/Calendar.css69
-rw-r--r--lib/dijit/themes/tundra/Calendar_rtl.css4
-rw-r--r--lib/dijit/themes/tundra/ColorPalette.css4
-rw-r--r--lib/dijit/themes/tundra/Common.css8
-rw-r--r--lib/dijit/themes/tundra/Dialog.css80
-rw-r--r--lib/dijit/themes/tundra/Dialog_rtl.css2
-rw-r--r--lib/dijit/themes/tundra/Editor.css6
-rw-r--r--lib/dijit/themes/tundra/Editor_rtl.css6
-rw-r--r--lib/dijit/themes/tundra/Menu.css25
-rw-r--r--lib/dijit/themes/tundra/Menu_rtl.css4
-rw-r--r--lib/dijit/themes/tundra/ProgressBar.css15
-rw-r--r--lib/dijit/themes/tundra/TimePicker.css12
-rw-r--r--lib/dijit/themes/tundra/TimePicker_rtl.css2
-rw-r--r--lib/dijit/themes/tundra/TitlePane.css12
-rw-r--r--lib/dijit/themes/tundra/TitlePane_rtl.css4
-rw-r--r--lib/dijit/themes/tundra/Toolbar.css31
-rw-r--r--lib/dijit/themes/tundra/Tree.css34
-rw-r--r--lib/dijit/themes/tundra/Tree_rtl.css8
-rw-r--r--lib/dijit/themes/tundra/form/Button.css40
-rw-r--r--lib/dijit/themes/tundra/form/Checkbox.css31
-rw-r--r--lib/dijit/themes/tundra/form/Common.css40
-rw-r--r--lib/dijit/themes/tundra/form/RadioButton.css28
-rw-r--r--lib/dijit/themes/tundra/form/Select.css18
-rw-r--r--lib/dijit/themes/tundra/form/Slider.css40
-rw-r--r--lib/dijit/themes/tundra/form/Slider_rtl.css13
-rw-r--r--lib/dijit/themes/tundra/layout/AccordionContainer.css8
-rw-r--r--lib/dijit/themes/tundra/layout/BorderContainer.css22
-rw-r--r--lib/dijit/themes/tundra/layout/ContentPane.css10
-rw-r--r--lib/dijit/themes/tundra/layout/SplitContainer.css3
-rw-r--r--lib/dijit/themes/tundra/layout/TabContainer.css128
-rw-r--r--lib/dijit/themes/tundra/layout/TabContainer_rtl.css21
-rw-r--r--lib/dijit/themes/tundra/tundra.css3476
-rw-r--r--lib/dijit/themes/tundra/tundra_rtl.css225
-rw-r--r--lib/dijit/tree/ForestStoreModel.js345
-rw-r--r--lib/dijit/tree/TreeStoreModel.js510
-rw-r--r--lib/dijit/tree/_dndContainer.js216
-rw-r--r--lib/dijit/tree/_dndSelector.js392
-rw-r--r--lib/dijit/tree/dndSource.js762
-rw-r--r--lib/dijit/tree/model.js143
-rwxr-xr-xlib/dojo-src/rebuild-dojo.sh5
-rw-r--r--lib/dojo/AdapterRegistry.js7
-rw-r--r--lib/dojo/DeferredList.js6
-rw-r--r--lib/dojo/LICENSE2
-rw-r--r--lib/dojo/NodeList-data.js175
-rw-r--r--lib/dojo/NodeList-fx.js35
-rw-r--r--lib/dojo/NodeList-html.js13
-rw-r--r--lib/dojo/NodeList-manipulate.js21
-rw-r--r--lib/dojo/NodeList-traverse.js33
-rw-r--r--lib/dojo/OpenAjax.js42
-rw-r--r--lib/dojo/Stateful.js35
-rw-r--r--lib/dojo/_base.js6
-rw-r--r--lib/dojo/_base/Color.js5
-rw-r--r--lib/dojo/_base/Deferred.js106
-rw-r--r--lib/dojo/_base/NodeList.js83
-rw-r--r--lib/dojo/_base/_loader/bootstrap.js33
-rw-r--r--lib/dojo/_base/_loader/hostenv_browser.js37
-rw-r--r--lib/dojo/_base/_loader/hostenv_ff_ext.js6
-rw-r--r--lib/dojo/_base/_loader/hostenv_rhino.js20
-rw-r--r--lib/dojo/_base/_loader/hostenv_spidermonkey.js22
-rw-r--r--lib/dojo/_base/_loader/loader.js176
-rw-r--r--lib/dojo/_base/_loader/loader_debug.js2
-rw-r--r--lib/dojo/_base/_loader/loader_xd.js40
-rw-r--r--lib/dojo/_base/array.js39
-rw-r--r--lib/dojo/_base/browser.js17
-rw-r--r--lib/dojo/_base/connect.js93
-rw-r--r--lib/dojo/_base/declare.js26
-rw-r--r--lib/dojo/_base/event.js124
-rw-r--r--lib/dojo/_base/fx.js3
-rw-r--r--lib/dojo/_base/html.js266
-rw-r--r--lib/dojo/_base/json.js15
-rw-r--r--lib/dojo/_base/lang.js35
-rw-r--r--lib/dojo/_base/query-sizzle.js32
-rw-r--r--lib/dojo/_base/query.js261
-rw-r--r--lib/dojo/_base/window.js20
-rw-r--r--lib/dojo/_base/xhr.js117
-rw-r--r--lib/dojo/_firebug/firebug.js108
-rw-r--r--lib/dojo/back.js65
-rw-r--r--lib/dojo/behavior.js89
-rw-r--r--lib/dojo/build.txt7
-rw-r--r--lib/dojo/cache.js11
-rw-r--r--lib/dojo/cldr/monetary.js4
-rw-r--r--lib/dojo/cldr/nls/ar/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/ar/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/ar/number.js2
-rw-r--r--lib/dojo/cldr/nls/ca/number.js2
-rw-r--r--lib/dojo/cldr/nls/cs/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/cs/number.js2
-rw-r--r--lib/dojo/cldr/nls/da/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/da/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/da/islamic.js1
-rw-r--r--lib/dojo/cldr/nls/da/number.js2
-rw-r--r--lib/dojo/cldr/nls/de/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/de/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/de/islamic.js1
-rw-r--r--lib/dojo/cldr/nls/de/number.js2
-rw-r--r--lib/dojo/cldr/nls/el/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/el/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/el/hebrew.js1
-rw-r--r--lib/dojo/cldr/nls/el/number.js2
-rw-r--r--lib/dojo/cldr/nls/en-au/currency.js2
-rw-r--r--lib/dojo/cldr/nls/en-au/number.js2
-rw-r--r--lib/dojo/cldr/nls/en-ca/currency.js2
-rw-r--r--lib/dojo/cldr/nls/en-gb/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/en-gb/islamic.js1
-rw-r--r--lib/dojo/cldr/nls/en-gb/number.js2
-rw-r--r--lib/dojo/cldr/nls/en/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/en/currency.js2
-rw-r--r--lib/dojo/cldr/nls/en/islamic.js1
-rw-r--r--lib/dojo/cldr/nls/en/number.js2
-rw-r--r--lib/dojo/cldr/nls/es/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/es/islamic.js1
-rw-r--r--lib/dojo/cldr/nls/es/number.js2
-rw-r--r--lib/dojo/cldr/nls/fi/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/fi/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/fi/hebrew.js1
-rw-r--r--lib/dojo/cldr/nls/fi/islamic.js1
-rw-r--r--lib/dojo/cldr/nls/fi/number.js2
-rw-r--r--lib/dojo/cldr/nls/fr-ch/gregorian.js1
-rw-r--r--lib/dojo/cldr/nls/fr-ch/number.js1
-rw-r--r--lib/dojo/cldr/nls/fr/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/fr/number.js2
-rw-r--r--lib/dojo/cldr/nls/he/number.js2
-rw-r--r--lib/dojo/cldr/nls/hu/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/hu/number.js2
-rw-r--r--lib/dojo/cldr/nls/it/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/it/number.js2
-rw-r--r--lib/dojo/cldr/nls/ja/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/ja/number.js2
-rw-r--r--lib/dojo/cldr/nls/ko/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/ko/number.js2
-rw-r--r--lib/dojo/cldr/nls/nb/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/nb/number.js2
-rw-r--r--lib/dojo/cldr/nls/nl/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/nl/number.js2
-rw-r--r--lib/dojo/cldr/nls/number.js2
-rw-r--r--lib/dojo/cldr/nls/pl/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/pl/number.js2
-rw-r--r--lib/dojo/cldr/nls/pt-pt/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/pt-pt/number.js2
-rw-r--r--lib/dojo/cldr/nls/pt/number.js2
-rw-r--r--lib/dojo/cldr/nls/ro/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/ro/currency.js1
-rw-r--r--lib/dojo/cldr/nls/ro/gregorian.js1
-rw-r--r--lib/dojo/cldr/nls/ro/number.js1
-rw-r--r--lib/dojo/cldr/nls/ru/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/ru/number.js2
-rw-r--r--lib/dojo/cldr/nls/sk/number.js2
-rw-r--r--lib/dojo/cldr/nls/sl/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/sl/number.js2
-rw-r--r--lib/dojo/cldr/nls/sv/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/sv/number.js2
-rw-r--r--lib/dojo/cldr/nls/th/number.js2
-rw-r--r--lib/dojo/cldr/nls/tr/number.js2
-rw-r--r--lib/dojo/cldr/nls/zh-hant/buddhist.js1
-rw-r--r--lib/dojo/cldr/nls/zh-hant/currency.js1
-rw-r--r--lib/dojo/cldr/nls/zh-hant/gregorian.js1
-rw-r--r--lib/dojo/cldr/nls/zh-hant/islamic.js1
-rw-r--r--lib/dojo/cldr/nls/zh-hant/number.js1
-rw-r--r--lib/dojo/cldr/nls/zh-hk/currency.js1
-rw-r--r--lib/dojo/cldr/nls/zh-hk/gregorian.js1
-rw-r--r--lib/dojo/cldr/nls/zh-hk/number.js1
-rw-r--r--lib/dojo/cldr/nls/zh-tw/currency.js2
-rw-r--r--lib/dojo/cldr/nls/zh-tw/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/zh/gregorian.js2
-rw-r--r--lib/dojo/cldr/nls/zh/number.js2
-rw-r--r--lib/dojo/cldr/supplemental.js17
-rw-r--r--lib/dojo/colors.js10
-rw-r--r--lib/dojo/cookie.js16
-rw-r--r--lib/dojo/currency.js15
-rw-r--r--lib/dojo/data/ItemFileReadStore.js195
-rw-r--r--lib/dojo/data/ItemFileWriteStore.js85
-rw-r--r--lib/dojo/data/ObjectStore.js487
-rw-r--r--lib/dojo/data/api/Identity.js31
-rw-r--r--lib/dojo/data/api/Notification.js33
-rw-r--r--lib/dojo/data/api/Read.js161
-rw-r--r--lib/dojo/data/api/Request.js13
-rw-r--r--lib/dojo/data/api/Write.js41
-rw-r--r--lib/dojo/data/util/filter.js10
-rw-r--r--lib/dojo/data/util/simpleFetch.js26
-rw-r--r--lib/dojo/data/util/sorter.js22
-rw-r--r--lib/dojo/date.js14
-rw-r--r--lib/dojo/date/locale.js51
-rw-r--r--lib/dojo/date/stamp.js10
-rw-r--r--lib/dojo/dnd/Avatar.js6
-rw-r--r--lib/dojo/dnd/Container.js13
-rw-r--r--lib/dojo/dnd/Manager.js20
-rw-r--r--lib/dojo/dnd/Moveable.js29
-rw-r--r--lib/dojo/dnd/Mover.js48
-rw-r--r--lib/dojo/dnd/Selector.js4
-rw-r--r--lib/dojo/dnd/Source.js8
-rw-r--r--lib/dojo/dnd/TimedMoveable.js6
-rw-r--r--lib/dojo/dnd/autoscroll.js32
-rw-r--r--lib/dojo/dnd/common.js4
-rw-r--r--lib/dojo/dnd/move.js112
-rw-r--r--lib/dojo/dojo.js4
-rw-r--r--lib/dojo/dojo.js.uncompressed.js1448
-rw-r--r--lib/dojo/fx.js34
-rw-r--r--lib/dojo/fx/Toggler.js15
-rw-r--r--lib/dojo/fx/easing.js60
-rw-r--r--lib/dojo/gears.js6
-rw-r--r--lib/dojo/hash.js38
-rw-r--r--lib/dojo/html.js101
-rw-r--r--lib/dojo/i18n.js22
-rw-r--r--lib/dojo/io/iframe.js70
-rw-r--r--lib/dojo/io/script.js22
-rw-r--r--lib/dojo/jaxer.js3
-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/nls/fi/colors.js2
-rw-r--r--lib/dojo/nls/kk/colors.js1
-rw-r--r--lib/dojo/nls/pl/colors.js2
-rw-r--r--lib/dojo/nls/pt-pt/colors.js2
-rw-r--r--lib/dojo/nls/pt/colors.js2
-rw-r--r--lib/dojo/nls/sl/colors.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_ROOT.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_ar.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_ca.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_cs.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_da.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_de-de.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_de.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_el.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_en-gb.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_en-us.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_en.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_es-es.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_es.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_fi-fi.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_fi.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_fr-fr.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_fr.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_he-il.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_he.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_hu.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_it-it.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_it.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_ja-jp.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_ja.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_ko-kr.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_ko.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_nb.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_nl-nl.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_nl.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_pl.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_pt-br.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_pt-pt.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_pt.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_ru.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_sk.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_sl.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_sv.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_th.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_tr.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_xx.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_zh-cn.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_zh-tw.js2
-rw-r--r--lib/dojo/nls/tt-rss-layer_zh.js2
-rw-r--r--lib/dojo/nls/zh/colors.js2
-rw-r--r--lib/dojo/number.js32
-rw-r--r--lib/dojo/package.json21
-rw-r--r--lib/dojo/parser.js302
-rw-r--r--lib/dojo/regexp.js14
-rw-r--r--lib/dojo/resources/_modules.js4
-rw-r--r--lib/dojo/robot.js6
-rw-r--r--lib/dojo/robotx.js77
-rw-r--r--lib/dojo/rpc/JsonService.js5
-rw-r--r--lib/dojo/rpc/JsonpService.js11
-rw-r--r--lib/dojo/rpc/RpcService.js11
-rw-r--r--lib/dojo/store/Cache.js152
-rw-r--r--lib/dojo/store/DataStore.js142
-rw-r--r--lib/dojo/store/JsonRest.js146
-rw-r--r--lib/dojo/store/Memory.js164
-rw-r--r--lib/dojo/store/Observable.js173
-rw-r--r--lib/dojo/store/README10
-rw-r--r--lib/dojo/store/api/Store.js304
-rw-r--r--lib/dojo/store/util/QueryResults.js67
-rw-r--r--lib/dojo/store/util/SimpleQueryEngine.js116
-rw-r--r--lib/dojo/string.js22
-rw-r--r--lib/dojo/tt-rss-layer.js4
-rw-r--r--lib/dojo/tt-rss-layer.js.uncompressed.js8906
-rw-r--r--lib/dojo/uacss.js6
-rw-r--r--lib/dojo/window.js18
680 files changed, 51633 insertions, 73825 deletions
diff --git a/FeedTree.js b/FeedTree.js
index ca1002549..c9a0cc81c 100644
--- a/FeedTree.js
+++ b/FeedTree.js
@@ -175,7 +175,7 @@ dojo.declare("fox.FeedTree", dijit.Tree, {
if (treeNode) {
treeNode = treeNode[0];
if (!is_cat) this._expandNode(treeNode);
- this._selectNode(treeNode);
+ this.set("selectedNodes", [treeNode]);
}
},
setFeedIcon: function(feed, is_cat, src) {
diff --git a/lib/dijit/Calendar.js b/lib/dijit/Calendar.js
index fa82770ee..b092ed797 100644
--- a/lib/dijit/Calendar.js
+++ b/lib/dijit/Calendar.js
@@ -1,12 +1,12 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.Calendar"]=true;
+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");
@@ -14,252 +14,596 @@ dojo.require("dojo.date.locale");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.require("dijit._CssStateMixin");
-dojo.declare("dijit.Calendar",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{templateString:dojo.cache("dijit","templates/Calendar.html","<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" dojoAttachEvent=\"onkeypress: _onKeyPress\">\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\" waiRole=\"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 class=\"dijitVisible\">\n\t\t\t\t\t<div class=\"dijitPopup dijitMenu dijitMenuPassive dijitHidden\" dojoAttachPoint=\"monthDropDown\" dojoAttachEvent=\"onmouseup: _onMonthSelect, onmouseover: _onMenuHover, onmouseout: _onMenuHover\">\n\t\t\t\t\t\t<div class=\"dijitCalendarMonthLabelTemplate dijitCalendarMonthLabel\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel dijitInline dijitVisible\" dojoAttachEvent=\"onmousedown: _onMonthToggle\"></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\" waiRole=\"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\"></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"),value:new Date(),datePackage:"dojo.date",dayWidth:"narrow",tabIndex:"0",baseClass:"dijitCalendar",cssStateNodes:{"decrementMonth":"dijitCalendarArrow","incrementMonth":"dijitCalendarArrow","previousYearLabelNode":"dijitCalendarPreviousYear","nextYearLabelNode":"dijitCalendarNextYear"},attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{tabIndex:"domNode"}),setValue:function(_1){
-dojo.deprecated("dijit.Calendar:setValue() is deprecated. Use set('value', ...) instead.","","2.0");
-this.set("value",_1);
-},_getValueAttr:function(){
-var _2=new this.dateClassObj(this.value);
-_2.setHours(0,0,0,0);
-if(_2.getDate()<this.value.getDate()){
-_2=this.dateFuncObj.add(_2,"hour",1);
-}
-return _2;
-},_setValueAttr:function(_3){
-if(!this.value||this.dateFuncObj.compare(_3,this.value)){
-_3=new this.dateClassObj(_3);
-_3.setHours(1);
-this.displayMonth=new this.dateClassObj(_3);
-if(!this.isDisabledDate(_3,this.lang)){
-this.value=_3;
-this.onChange(this.get("value"));
-}
-dojo.attr(this.domNode,"aria-label",this.dateLocaleModule.format(_3,{selector:"date",formatLength:"full"}));
-this._populateGrid();
-}
-},_setText:function(_4,_5){
-while(_4.firstChild){
-_4.removeChild(_4.firstChild);
-}
-_4.appendChild(dojo.doc.createTextNode(_5));
-},_populateGrid:function(){
-var _6=this.displayMonth;
-_6.setDate(1);
-var _7=_6.getDay(),_8=this.dateFuncObj.getDaysInMonth(_6),_9=this.dateFuncObj.getDaysInMonth(this.dateFuncObj.add(_6,"month",-1)),_a=new this.dateClassObj(),_b=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
-if(_b>_7){
-_b-=7;
-}
-dojo.query(".dijitCalendarDateTemplate",this.domNode).forEach(function(_c,i){
-i+=_b;
-var _d=new this.dateClassObj(_6),_e,_f="dijitCalendar",adj=0;
-if(i<_7){
-_e=_9-_7+i+1;
-adj=-1;
-_f+="Previous";
-}else{
-if(i>=(_7+_8)){
-_e=i-_7-_8+1;
-adj=1;
-_f+="Next";
-}else{
-_e=i-_7+1;
-_f+="Current";
-}
-}
-if(adj){
-_d=this.dateFuncObj.add(_d,"month",adj);
-}
-_d.setDate(_e);
-if(!this.dateFuncObj.compare(_d,_a,"date")){
-_f="dijitCalendarCurrentDate "+_f;
-}
-if(this._isSelectedDate(_d,this.lang)){
-_f="dijitCalendarSelectedDate "+_f;
-}
-if(this.isDisabledDate(_d,this.lang)){
-_f="dijitCalendarDisabledDate "+_f;
-}
-var _10=this.getClassForDate(_d,this.lang);
-if(_10){
-_f=_10+" "+_f;
-}
-_c.className=_f+"Month dijitCalendarDateTemplate";
-_c.dijitDateValue=_d.valueOf();
-var _11=dojo.query(".dijitCalendarDateLabel",_c)[0],_12=_d.getDateLocalized?_d.getDateLocalized(this.lang):_d.getDate();
-this._setText(_11,_12);
-},this);
-var _13=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang,_6);
-this._setText(this.monthLabelNode,_13[_6.getMonth()]);
-dojo.query(".dijitCalendarMonthLabelTemplate",this.domNode).forEach(function(_14,i){
-dojo.toggleClass(_14,"dijitHidden",!(i in _13));
-this._setText(_14,_13[i]);
-},this);
-var y=_6.getFullYear()-1;
-var d=new this.dateClassObj();
-dojo.forEach(["previous","current","next"],function(_15){
-d.setFullYear(y++);
-this._setText(this[_15+"YearLabelNode"],this.dateLocaleModule.format(d,{selector:"year",locale:this.lang}));
-},this);
-var _16=this;
-var _17=function(_18,_19,adj){
-_16._connects.push(dijit.typematic.addMouseListener(_16[_18],_16,function(_1a){
-if(_1a>=0){
-_16._adjustDisplay(_19,adj);
-}
-},0.8,500));
-};
-_17("incrementMonth","month",1);
-_17("decrementMonth","month",-1);
-_17("nextYearLabelNode","year",1);
-_17("previousYearLabelNode","year",-1);
-},goToToday:function(){
-this.set("value",new this.dateClassObj());
-},constructor:function(_1b){
-var _1c=(_1b.datePackage&&(_1b.datePackage!="dojo.date"))?_1b.datePackage+".Date":"Date";
-this.dateClassObj=dojo.getObject(_1c,false);
-this.datePackage=_1b.datePackage||this.datePackage;
-this.dateFuncObj=dojo.getObject(this.datePackage,false);
-this.dateLocaleModule=dojo.getObject(this.datePackage+".locale",false);
-},postMixInProperties:function(){
-if(isNaN(this.value)){
-delete this.value;
-}
-this.inherited(arguments);
-},postCreate:function(){
-this.inherited(arguments);
-dojo.setSelectable(this.domNode,false);
-var _1d=dojo.hitch(this,function(_1e,n){
-var _1f=dojo.query(_1e,this.domNode)[0];
-for(var i=0;i<n;i++){
-_1f.parentNode.appendChild(_1f.cloneNode(true));
-}
+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");
+ }
});
-_1d(".dijitCalendarDayLabelTemplate",6);
-_1d(".dijitCalendarDateTemplate",6);
-_1d(".dijitCalendarWeekTemplate",5);
-var _20=this.dateLocaleModule.getNames("days",this.dayWidth,"standAlone",this.lang);
-var _21=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
-dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_22,i){
-this._setText(_22,_20[(i+_21)%7]);
-},this);
-var _23=new this.dateClassObj(this.value);
-var _24=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang,_23);
-_1d(".dijitCalendarMonthLabelTemplate",_24.length-1);
-dojo.query(".dijitCalendarMonthLabelTemplate",this.domNode).forEach(function(_25,i){
-dojo.attr(_25,"month",i);
-if(i in _24){
-this._setText(_25,_24[i]);
-}
-dojo.place(_25.cloneNode(true),this.monthLabelSpacer);
-},this);
-this.value=null;
-this.set("value",_23);
-},_onMenuHover:function(e){
-dojo.stopEvent(e);
-dojo.toggleClass(e.target,"dijitMenuItemHover");
-},_adjustDisplay:function(_26,_27){
-this.displayMonth=this.dateFuncObj.add(this.displayMonth,_26,_27);
-this._populateGrid();
-},_onMonthToggle:function(evt){
-dojo.stopEvent(evt);
-if(evt.type=="mousedown"){
-var _28=dojo.position(this.monthLabelNode);
-var dim={width:_28.w+"px",top:-this.displayMonth.getMonth()*_28.h+"px"};
-if((dojo.isIE&&dojo.isQuirks)||dojo.isIE<7){
-dim.left=-_28.w/2+"px";
-}
-dojo.style(this.monthDropDown,dim);
-this._popupHandler=this.connect(document,"onmouseup","_onMonthToggle");
-}else{
-this.disconnect(this._popupHandler);
-delete this._popupHandler;
-}
-dojo.toggleClass(this.monthDropDown,"dijitHidden");
-dojo.toggleClass(this.monthLabelNode,"dijitVisible");
-},_onMonthSelect:function(evt){
-this._onMonthToggle(evt);
-this.displayMonth.setMonth(dojo.attr(evt.target,"month"));
-this._populateGrid();
-},_onDayClick:function(evt){
-dojo.stopEvent(evt);
-for(var _29=evt.target;_29&&!_29.dijitDateValue;_29=_29.parentNode){
-}
-if(_29&&!dojo.hasClass(_29,"dijitCalendarDisabledDate")){
-this.set("value",_29.dijitDateValue);
-this.onValueSelected(this.get("value"));
-}
-},_onDayMouseOver:function(evt){
-var _2a=dojo.hasClass(evt.target,"dijitCalendarDateLabel")?evt.target.parentNode:evt.target;
-if(_2a&&(_2a.dijitDateValue||_2a==this.previousYearLabelNode||_2a==this.nextYearLabelNode)){
-dojo.addClass(_2a,"dijitCalendarHoveredDate");
-this._currentNode=_2a;
-}
-},_onDayMouseOut:function(evt){
-if(!this._currentNode){
-return;
-}
-if(evt.relatedTarget&&evt.relatedTarget.parentNode==this._currentNode){
-return;
-}
-dojo.removeClass(this._currentNode,"dijitCalendarHoveredDate");
-if(dojo.hasClass(this._currentNode,"dijitCalendarActiveDate")){
-dojo.removeClass(this._currentNode,"dijitCalendarActiveDate");
-}
-this._currentNode=null;
-},_onDayMouseDown:function(evt){
-var _2b=evt.target.parentNode;
-if(_2b&&_2b.dijitDateValue){
-dojo.addClass(_2b,"dijitCalendarActiveDate");
-this._currentNode=_2b;
-}
-},_onDayMouseUp:function(evt){
-var _2c=evt.target.parentNode;
-if(_2c&&_2c.dijitDateValue){
-dojo.removeClass(_2c,"dijitCalendarActiveDate");
-}
-},_onKeyPress:function(evt){
-var dk=dojo.keys,_2d=-1,_2e,_2f=this.value;
-switch(evt.keyCode){
-case dk.RIGHT_ARROW:
-_2d=1;
-case dk.LEFT_ARROW:
-_2e="day";
-if(!this.isLeftToRight()){
-_2d*=-1;
-}
-break;
-case dk.DOWN_ARROW:
-_2d=1;
-case dk.UP_ARROW:
-_2e="week";
-break;
-case dk.PAGE_DOWN:
-_2d=1;
-case dk.PAGE_UP:
-_2e=evt.ctrlKey?"year":"month";
-break;
-case dk.END:
-_2f=this.dateFuncObj.add(_2f,"month",1);
-_2e="day";
-case dk.HOME:
-_2f=new Date(_2f).setDate(1);
-break;
-case dk.ENTER:
-this.onValueSelected(this.get("value"));
-break;
-case dk.ESCAPE:
-default:
-return;
-}
-dojo.stopEvent(evt);
-if(_2e){
-_2f=this.dateFuncObj.add(_2f,_2e,_2d);
-}
-this.set("value",_2f);
-},onValueSelected:function(_30){
-},onChange:function(_31){
-},_isSelectedDate:function(_32,_33){
-return !this.dateFuncObj.compare(_32,this.value,"date");
-},isDisabledDate:function(_34,_35){
-},getClassForDate:function(_36,_37){
-}});
+
}
diff --git a/lib/dijit/CheckedMenuItem.js b/lib/dijit/CheckedMenuItem.js
index a84837897..ab24dfb95 100644
--- a/lib/dijit/CheckedMenuItem.js
+++ b/lib/dijit/CheckedMenuItem.js
@@ -1,24 +1,54 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.CheckedMenuItem"]=true;
+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,{templateString:dojo.cache("dijit","templates/CheckedMenuItem.html","<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"presentation\">&nbsp;</td>\n</tr>\n"),checked:false,_setCheckedAttr:function(_1){
-dojo.toggleClass(this.domNode,"dijitCheckedMenuItemChecked",_1);
-dijit.setWaiState(this.domNode,"checked",_1);
-this.checked=_1;
-},onChange:function(_2){
-},_onClick:function(e){
-if(!this.disabled){
-this.set("checked",!this.checked);
-this.onChange(this.checked);
-}
-this.inherited(arguments);
-}});
+
+
+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);
+ }
+ });
+
}
diff --git a/lib/dijit/ColorPalette.js b/lib/dijit/ColorPalette.js
index 62aae00df..62c9d8df6 100644
--- a/lib/dijit/ColorPalette.js
+++ b/lib/dijit/ColorPalette.js
@@ -1,31 +1,142 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.ColorPalette"]=true;
+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,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],{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"]]},_imagePaths:{"7x10":dojo.moduleUrl("dijit.themes","a11y/colors7x10.png"),"3x4":dojo.moduleUrl("dijit.themes","a11y/colors3x4.png"),"7x10-rtl":dojo.moduleUrl("dijit.themes","a11y/colors7x10-rtl.png"),"3x4-rtl":dojo.moduleUrl("dijit.themes","a11y/colors3x4-rtl.png")},templateString:dojo.cache("dijit","templates/ColorPalette.html","<div class=\"dijitInline dijitColorPalette\">\n\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\" alt=\"\"/>\n\t<table class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\">\n\t\t<tbody dojoAttachPoint=\"gridNode\"></tbody>\n\t</table>\n</div>\n"),baseClass:"dijitColorPalette",dyeClass:"dijit._Color",buildRendering:function(){
-this.inherited(arguments);
-this.imageNode.setAttribute("src",this._imagePaths[this.palette+(this.isLeftToRight()?"":"-rtl")].toString());
-var _1=dojo.i18n.getLocalization("dojo","colors",this.lang);
-this._preparePalette(this._palettes[this.palette],_1);
-}});
-dojo.declare("dijit._Color",dojo.Color,{constructor:function(_2){
-this._alias=_2;
-this.setColor(dojo.Color.named[_2]);
-},getValue:function(){
-return this.toHex();
-},fillCell:function(_3,_4){
-dojo.create("img",{src:_4,"class":"dijitPaletteImg",alt:this._alias},_3);
-}});
+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);
+ }
+});
+
}
diff --git a/lib/dijit/Declaration.js b/lib/dijit/Declaration.js
index 57cbfd031..1cfa8ecad 100644
--- a/lib/dijit/Declaration.js
+++ b/lib/dijit/Declaration.js
@@ -1,36 +1,106 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.Declaration"]=true;
+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,{_noScript:true,widgetClass:"",defaults:null,mixins:[],buildRendering:function(){
-var _1=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef),_2=dojo.query("> script[type^='dojo/method'][event]",_1).orphan(),_3=dojo.query("> script[type^='dojo/method']",_1).orphan(),_4=dojo.query("> script[type^='dojo/connect']",_1).orphan(),_5=_1.nodeName;
-var _6=this.defaults||{};
-dojo.forEach(_2,function(s){
-var _7=s.getAttribute("event"),_8=dojo.parser._functionFromScript(s);
-_6[_7]=_8;
-});
-this.mixins=this.mixins.length?dojo.map(this.mixins,function(_9){
-return dojo.getObject(_9);
-}):[dijit._Widget,dijit._Templated];
-_6.widgetsInTemplate=true;
-_6._skipNodeCache=true;
-_6.templateString="<"+_5+" class='"+_1.className+"' dojoAttachPoint='"+(_1.getAttribute("dojoAttachPoint")||"")+"' dojoAttachEvent='"+(_1.getAttribute("dojoAttachEvent")||"")+"' >"+_1.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_5+">";
-dojo.query("[dojoType]",_1).forEach(function(_a){
-_a.removeAttribute("dojoType");
-});
-var wc=dojo.declare(this.widgetClass,this.mixins,_6);
-var _b=_4.concat(_3);
-dojo.forEach(_b,function(s){
-var _c=s.getAttribute("event")||"postscript",_d=dojo.parser._functionFromScript(s);
-dojo.connect(wc.prototype,_c,_d);
-});
-}});
+
+
+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);
+ });
+ }
+ }
+);
+
}
diff --git a/lib/dijit/Dialog.js b/lib/dijit/Dialog.js
index a35d523bf..22d2dbedf 100644
--- a/lib/dijit/Dialog.js
+++ b/lib/dijit/Dialog.js
@@ -1,12 +1,12 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.Dialog"]=true;
+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");
@@ -19,238 +19,593 @@ 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,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit._DialogBase",[dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin,dijit._CssStateMixin],{templateString:dojo.cache("dijit","templates/Dialog.html","<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"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=\"onclick: onCancel\" title=\"${buttonCancel}\">\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 _1=dojo.i18n.getLocalization("dijit","common");
-dojo.mixin(this,_1);
-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){
-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 _2=this.domNode;
-if(this.titleBar&&this.draggable){
-this._moveable=(dojo.isIE==6)?new dojo.dnd.TimedMoveable(_2,{handle:this.titleBar}):new dojo.dnd.Moveable(_2,{handle:this.titleBar,timeout:0});
-dojo.subscribe("/dnd/move/stop",this,"_endDrag");
-}else{
-dojo.addClass(_2,"dijitDialogFixed");
-}
-this.underlayAttrs={dialogId:this.id,"class":dojo.map(this["class"].split(/\s/),function(s){
-return s+"_underlay";
-}).join(" ")};
-this._fadeIn=dojo.fadeIn({node:_2,duration:this.duration,beforeBegin:dojo.hitch(this,function(){
-var _3=dijit._underlay;
-if(!_3){
-_3=dijit._underlay=new dijit.DialogUnderlay(this.underlayAttrs);
-}else{
-_3.set(this.underlayAttrs);
-}
-var ds=dijit._dialogStack,_4=948+ds.length*2;
-if(ds.length==1){
-_3.show();
-}
-dojo.style(dijit._underlay.domNode,"zIndex",_4);
-dojo.style(this.domNode,"zIndex",_4+1);
-}),onEnd:dojo.hitch(this,function(){
-if(this.autofocus){
-this._getFocusItems(this.domNode);
-dijit.focus(this._firstFocusItem);
-}
-})});
-this._fadeOut=dojo.fadeOut({node:_2,duration:this.duration,onEnd:dojo.hitch(this,function(){
-_2.style.display="none";
-var ds=dijit._dialogStack;
-if(ds.length==0){
-dijit._underlay.hide();
-}else{
-dojo.style(dijit._underlay.domNode,"zIndex",948+ds.length*2);
-dijit._underlay.set(ds[ds.length-1].underlayAttrs);
-}
-if(this.refocus){
-var _5=this._savedFocus;
-if(ds.length>0){
-var pd=ds[ds.length-1];
-if(!dojo.isDescendant(_5.node,pd.domNode)){
-pd._getFocusItems(pd.domNode);
-_5=pd._firstFocusItem;
-}
-}
-dijit.focus(_5);
-}
-})});
-},uninitialize:function(){
-var _6=false;
-if(this._fadeIn&&this._fadeIn.status()=="playing"){
-_6=true;
-this._fadeIn.stop();
-}
-if(this._fadeOut&&this._fadeOut.status()=="playing"){
-_6=true;
-this._fadeOut.stop();
-}
-if((this.open||_6)&&!dijit._underlay._destroyed){
-dijit._underlay.hide();
-}
-if(this._moveable){
-this._moveable.destroy();
-}
-this.inherited(arguments);
-},_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.marginBox(this.domNode);
-var _7=dojo.window.getBox();
-if(mb.w>=_7.w||mb.h>=_7.h){
-var w=Math.min(mb.w,Math.floor(_7.w*0.75)),h=Math.min(mb.h,Math.floor(_7.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 _8=this.domNode,_9=dojo.window.getBox(),p=this._relativePosition,bb=p?null:dojo._getBorderBox(_8),l=Math.floor(_9.l+(p?p.x:(_9.w-bb.w)/2)),t=Math.floor(_9.t+(p?p.y:(_9.h-bb.h)/2));
-dojo.style(_8,{left:l+"px",top:t+"px"});
-}
-},_onKey:function(_a){
-var ds=dijit._dialogStack;
-if(ds[ds.length-1]!=this){
-return;
-}
-if(_a.charOrCode){
-var dk=dojo.keys;
-var _b=_a.target;
-if(_a.charOrCode===dk.TAB){
-this._getFocusItems(this.domNode);
-}
-var _c=(this._firstFocusItem==this._lastFocusItem);
-if(_b==this._firstFocusItem&&_a.shiftKey&&_a.charOrCode===dk.TAB){
-if(!_c){
-dijit.focus(this._lastFocusItem);
-}
-dojo.stopEvent(_a);
-}else{
-if(_b==this._lastFocusItem&&_a.charOrCode===dk.TAB&&!_a.shiftKey){
-if(!_c){
-dijit.focus(this._firstFocusItem);
-}
-dojo.stopEvent(_a);
-}else{
-while(_b){
-if(_b==this.domNode||dojo.hasClass(_b,"dijitPopup")){
-if(_a.charOrCode==dk.ESCAPE){
-this.onCancel();
-}else{
-return;
-}
-}
-_b=_b.parentNode;
-}
-if(_a.charOrCode!==dk.TAB){
-dojo.stopEvent(_a);
-}else{
-if(!dojo.isOpera){
-try{
-this._firstFocusItem.focus();
-}
-catch(e){
-}
-}
-}
-}
-}
-}
-},show:function(){
-if(this.open){
-return;
-}
-if(!this._alreadyInitialized){
-this._setup();
-this._alreadyInitialized=true;
-}
-if(this._fadeOut.status()=="playing"){
-this._fadeOut.stop();
-}
-this._modalconnects.push(dojo.connect(window,"onscroll",this,"layout"));
-this._modalconnects.push(dojo.connect(window,"onresize",this,function(){
-var _d=dojo.window.getBox();
-if(!this._oldViewport||_d.h!=this._oldViewport.h||_d.w!=this._oldViewport.w){
-this.layout();
-this._oldViewport=_d;
-}
-}));
-this._modalconnects.push(dojo.connect(dojo.doc.documentElement,"onkeypress",this,"_onKey"));
-dojo.style(this.domNode,{opacity:0,display:""});
-this.open=true;
-this._onShow();
-this._size();
-this._position();
-dijit._dialogStack.push(this);
-this._fadeIn.play();
-this._savedFocus=dijit.getFocus(this);
-},hide:function(){
-var ds=dijit._dialogStack;
-if(!this._alreadyInitialized||this!=ds[ds.length-1]){
-return;
-}
-if(this._fadeIn.status()=="playing"){
-this._fadeIn.stop();
-}
-ds.pop();
-this._fadeOut.play();
-if(this._scrollConnected){
-this._scrollConnected=false;
-}
-dojo.forEach(this._modalconnects,dojo.disconnect);
-this._modalconnects=[];
-if(this._relativePosition){
-delete this._relativePosition;
-}
-this.open=false;
-this.onHide();
-},layout:function(){
-if(this.domNode.style.display!="none"){
-if(dijit._underlay){
-dijit._underlay.layout();
-}
-this._position();
-}
-},destroy:function(){
-dojo.forEach(this._modalconnects,dojo.disconnect);
-if(this.refocus&&this.open){
-setTimeout(dojo.hitch(dijit,"focus",this._savedFocus),25);
-}
-this.inherited(arguments);
-}});
-dojo.declare("dijit.Dialog",[dijit.layout.ContentPane,dijit._DialogBase],{});
-dijit._dialogStack=[];
+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
+];
+
}
diff --git a/lib/dijit/DialogUnderlay.js b/lib/dijit/DialogUnderlay.js
index 0056462a5..72557800d 100644
--- a/lib/dijit/DialogUnderlay.js
+++ b/lib/dijit/DialogUnderlay.js
@@ -1,42 +1,112 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.DialogUnderlay"]=true;
+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],{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");
-},_setClassAttr:function(_1){
-this.node.className="dijitDialogUnderlay "+_1;
-},postCreate:function(){
-dojo.body().appendChild(this.domNode);
-},layout:function(){
-var is=this.node.style,os=this.domNode.style;
-os.display="none";
-var _2=dojo.window.getBox();
-os.top=_2.t+"px";
-os.left=_2.l+"px";
-is.width=_2.w+"px";
-is.height=_2.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();
-this.domNode.style.display="none";
-},uninitialize:function(){
-if(this.bgIframe){
-this.bgIframe.destroy();
-}
-this.inherited(arguments);
-}});
+
+
+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";
+ }
+ }
+);
+
}
diff --git a/lib/dijit/Editor.js b/lib/dijit/Editor.js
index 69258eade..b77dd7165 100644
--- a/lib/dijit/Editor.js
+++ b/lib/dijit/Editor.js
@@ -1,12 +1,12 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.Editor"]=true;
+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");
@@ -17,457 +17,778 @@ dojo.require("dijit._editor.range");
dojo.require("dijit._Container");
dojo.require("dojo.i18n");
dojo.require("dijit.layout._LayoutWidget");
-dojo.require("dijit._editor.range");
-dojo.requireLocalization("dijit._editor","commands",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.Editor",dijit._editor.RichText,{plugins:null,extraPlugins:null,constructor:function(){
-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"];
-}
-this._plugins=[];
-this._editInterval=this.editActionInterval*1000;
-if(dojo.isIE){
-this.events.push("onBeforeDeactivate");
-this.events.push("onBeforeActivate");
-}
-},postCreate:function(){
-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.setValueDeferred=new dojo.Deferred();
-this.inherited(arguments);
-this.commands=dojo.i18n.getLocalization("dijit._editor","commands",this.lang);
-if(!this.toolbar){
-this.toolbar=new dijit.Toolbar({dir:this.dir,lang:this.lang});
-this.header.appendChild(this.toolbar.domNode);
-}
-dojo.forEach(this.plugins,this.addPlugin,this);
-this.setValueDeferred.callback(true);
-dojo.addClass(this.iframe.parentNode,"dijitEditorIFrameContainer");
-dojo.addClass(this.iframe,"dijitEditorIFrame");
-dojo.attr(this.iframe,"allowTransparency",true);
-if(dojo.isWebKit){
-dojo.style(this.domNode,"KhtmlUserSelect","none");
-}
-this.toolbar.startup();
-this.onNormalizedDisplayChanged();
-},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(_1,_2){
-var _3=dojo.isString(_1)?{name:_1}:_1;
-if(!_3.setEditor){
-var o={"args":_3,"plugin":null,"editor":this};
-dojo.publish(dijit._scopeName+".Editor.getPlugin",[o]);
-if(!o.plugin){
-var pc=dojo.getObject(_3.name);
-if(pc){
-o.plugin=new pc(_3);
-}
-}
-if(!o.plugin){
-console.warn("Cannot find plugin",_1);
-return;
-}
-_1=o.plugin;
-}
-if(arguments.length>1){
-this._plugins[_2]=_1;
-}else{
-this._plugins.push(_1);
-}
-_1.setEditor(this);
-if(dojo.isFunction(_1.setToolbar)){
-_1.setToolbar(this.toolbar);
-}
-},startup:function(){
-},resize:function(_4){
-if(_4){
-dijit.layout._LayoutWidget.prototype.resize.apply(this,arguments);
-}
-},layout:function(){
-var _5=(this._contentBox.h-(this.getHeaderHeight()+this.getFooterHeight()+dojo._getPadBorderExtents(this.iframe.parentNode).h+dojo._getMarginExtents(this.iframe.parentNode).h));
-this.editingArea.style.height=_5+"px";
-if(this.iframe){
-this.iframe.style.height="100%";
-}
-this._layoutMode=true;
-},_onIEMouseDown:function(e){
-var _6;
-var b=this.document.body;
-var _7=b.clientWidth;
-var _8=b.clientHeight;
-var _9=b.clientLeft;
-var _a=b.offsetWidth;
-var _b=b.offsetHeight;
-var _c=b.offsetLeft;
-bodyDir=b.dir?b.dir.toLowerCase():"";
-if(bodyDir!="rtl"){
-if(_7<_a&&e.x>_7&&e.x<_a){
-_6=true;
-}
-}else{
-if(e.x<_9&&e.x>_c){
-_6=true;
-}
-}
-if(!_6){
-if(_8<_b&&e.y>_8&&e.y<_b){
-_6=true;
-}
-}
-if(!_6){
-delete this._cursorToStart;
-delete this._savedSelection;
-if(e.target.tagName=="BODY"){
-setTimeout(dojo.hitch(this,"placeCursorAtEnd"),0);
-}
-this.inherited(arguments);
-}
-},onBeforeActivate:function(e){
-this._restoreSelection();
-},onBeforeDeactivate:function(e){
-if(this.customUndo){
-this.endEditing(true);
-}
-if(e.target.tagName!="BODY"){
-this._saveSelection();
-}
-},customUndo:dojo.isIE||dojo.isWebKit,editActionInterval:3,beginEditing:function(_d){
-if(!this._inEditing){
-this._inEditing=true;
-this._beginEditing(_d);
-}
-if(this.editActionInterval>0){
-if(this._editTimer){
-clearTimeout(this._editTimer);
-}
-this._editTimer=setTimeout(dojo.hitch(this,this.endEditing),this._editInterval);
-}
-},_steps:[],_undoedSteps:[],execCommand:function(_e){
-if(this.customUndo&&(_e=="undo"||_e=="redo")){
-return this[_e]();
-}else{
-if(this.customUndo){
-this.endEditing();
-this._beginEditing();
-}
-var r;
-try{
-r=this.inherited("execCommand",arguments);
-if(dojo.isWebKit&&_e=="paste"&&!r){
-throw {code:1011};
-}
-}
-catch(e){
-if(e.code==1011&&/copy|cut|paste/.test(_e)){
-var _f=dojo.string.substitute,_10={cut:"X",copy:"C",paste:"V"};
-alert(_f(this.commands.systemShortcut,[this.commands[_e],_f(this.commands[dojo.isMac?"appleKey":"ctrlKey"],[_10[_e]])]));
-}
-r=false;
-}
-if(this.customUndo){
-this._endEditing();
-}
-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("queryCommandEnabled",arguments);
-}
-},_moveToBookmark:function(b){
-var _11=b.mark;
-var _12=b.mark;
-var col=b.isCollapsed;
-var r,_13,_14,sel;
-if(_12){
-if(dojo.isIE){
-if(dojo.isArray(_12)){
-_11=[];
-dojo.forEach(_12,function(n){
-_11.push(dijit.range.getNode(n,this.editNode));
-},this);
-dojo.withGlobal(this.window,"moveToBookmark",dijit,[{mark:_11,isCollapsed:col}]);
-}else{
-if(_12.startContainer&&_12.endContainer){
-sel=dijit.range.getSelection(this.window);
-if(sel&&sel.removeAllRanges){
-sel.removeAllRanges();
-r=dijit.range.create(this.window);
-_13=dijit.range.getNode(_12.startContainer,this.editNode);
-_14=dijit.range.getNode(_12.endContainer,this.editNode);
-if(_13&&_14){
-r.setStart(_13,_12.startOffset);
-r.setEnd(_14,_12.endOffset);
-sel.addRange(r);
-}
-}
-}
-}
-}else{
-sel=dijit.range.getSelection(this.window);
-if(sel&&sel.removeAllRanges){
-sel.removeAllRanges();
-r=dijit.range.create(this.window);
-_13=dijit.range.getNode(_12.startContainer,this.editNode);
-_14=dijit.range.getNode(_12.endContainer,this.editNode);
-if(_13&&_14){
-r.setStart(_13,_12.startOffset);
-r.setEnd(_14,_12.endOffset);
-sel.addRange(r);
-}
-}
-}
-}
-},_changeToStep:function(_15,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(_16){
-if(this._editTimer){
-clearTimeout(this._editTimer);
-}
-if(this._inEditing){
-this._endEditing(_16);
-this._inEditing=false;
-}
-},_getBookmark:function(){
-var b=dojo.withGlobal(this.window,dijit.getBookmark);
-var tmp=[];
-if(b&&b.mark){
-var _17=b.mark;
-if(dojo.isIE){
-var sel=dijit.range.getSelection(this.window);
-if(!dojo.isArray(_17)){
-if(sel){
-var _18;
-if(sel.rangeCount){
-_18=sel.getRangeAt(0);
-}
-if(_18){
-b.mark=_18.cloneRange();
-}else{
-b.mark=dojo.withGlobal(this.window,dijit.getBookmark);
-}
-}
-}else{
-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){
-if(this._steps.length===0){
-this._steps.push({"text":dijit._editor.getChildrenHtml(this.editNode),"bookmark":this._getBookmark()});
-}
-},_endEditing:function(_19){
-var v=dijit._editor.getChildrenHtml(this.editNode);
-this._undoedSteps=[];
-this._steps.push({text:v,bookmark:this._getBookmark()});
-},onKeyDown:function(e){
-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){
-if(k==90||k==122){
-dojo.stopEvent(e);
-this.undo();
-return;
-}else{
-if(k==89||k==121){
-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:
-case 86:
-if(e.ctrlKey&&!e.altKey&&!e.metaKey){
-this.endEditing();
-if(e.keyCode==88){
-this.beginEditing("cut");
-setTimeout(dojo.hitch(this,this.endEditing),1);
-}else{
-this.beginEditing("paste");
-setTimeout(dojo.hitch(this,this.endEditing),1);
-}
-break;
-}
-default:
-if(!e.ctrlKey&&!e.altKey&&!e.metaKey&&(e.keyCode<dojo.keys.F1||e.keyCode>dojo.keys.F15)){
-this.beginEditing();
-break;
-}
-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;
-case ks.CTRL:
-case ks.SHIFT:
-case ks.TAB:
-break;
-}
-},_onBlur:function(){
-this.inherited("_onBlur",arguments);
-this.endEditing(true);
-},_saveSelection:function(){
-this._savedSelection=this._getBookmark();
-},_restoreSelection:function(){
-if(this._savedSelection){
-delete this._cursorToStart;
-if(dojo.withGlobal(this.window,"isCollapsed",dijit)){
-this._moveToBookmark(this._savedSelection);
-}
-delete this._savedSelection;
-}
-},onClick:function(){
-this.endEditing(true);
-this.inherited(arguments);
-},_setDisabledAttr:function(_1a){
-if(!this.disabled&&_1a){
-this._buttonEnabledPlugins=dojo.filter(this._plugins,function(p){
-if(p&&p.button&&!p.button.get("disabled")){
-p.button.set("disabled",true);
-return true;
-}
-return false;
-});
-}else{
-if(this.disabled&&!_1a){
-dojo.forEach(this._buttonEnabledPlugins,function(p){
-p.button.attr("disabled",false);
-p.updateState&&p.updateState();
-});
-}
-}
-this.inherited(arguments);
-},_setStateClass:function(){
-this.inherited(arguments);
-if(this.document&&this.document.body){
-dojo.style(this.document.body,"color",dojo.style(this.iframe,"color"));
-}
-}});
-dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
-if(o.plugin){
-return;
-}
-var _1b=o.args,p;
-var _1c=dijit._editor._Plugin;
-var _1d=_1b.name;
-switch(_1d){
-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 _1c({command:_1d});
-break;
-case "bold":
-case "italic":
-case "underline":
-case "strikethrough":
-case "subscript":
-case "superscript":
-p=new _1c({buttonClass:dijit.form.ToggleButton,command:_1d});
-break;
-case "|":
-p=new _1c({button:new dijit.ToolbarSeparator(),setEditor:function(_1e){
-this.editor=_1e;
-}});
-}
-o.plugin=p;
+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;
});
+
}
diff --git a/lib/dijit/InlineEditBox.js b/lib/dijit/InlineEditBox.js
index 5d26498a4..1f569efbe 100644
--- a/lib/dijit/InlineEditBox.js
+++ b/lib/dijit/InlineEditBox.js
@@ -1,231 +1,589 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.InlineEditBox"]=true;
+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,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.InlineEditBox",dijit._Widget,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:"dijit.form.TextBox",editorWrapper:"dijit._InlineEditor",editorParams:{},onChange:function(_1){
-},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 _2={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};
-for(var _3 in _2){
-this.connect(this.displayNode,_3,_2[_3]);
-}
-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(_4){
-dojo.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");
-this.set("disabled",_4);
-},_setDisabledAttr:function(_5){
-this.disabled=_5;
-dijit.setWaiState(this.domNode,"disabled",_5);
-if(_5){
-this.displayNode.removeAttribute("tabIndex");
-}else{
-this.displayNode.setAttribute("tabIndex",0);
-}
-dojo.toggleClass(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_5);
-},_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 _6=dojo.create("span",null,this.domNode,"before");
-var _7=dojo.getObject(this.editorWrapper);
-this.wrapperWidget=new _7({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")},_6);
-}
-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.destroy();
-delete this.wrapperWidget;
-}
-this.inherited(arguments);
-},_showText:function(_8){
-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(_8){
-dijit.focus(this.displayNode);
-}
-},save:function(_9){
-if(this.disabled||!this.editing){
-return;
-}
-this.editing=false;
-var ww=this.wrapperWidget;
-var _a=ww.getValue();
-this.set("value",_a);
-setTimeout(dojo.hitch(this,"onChange",_a),0);
-this._showText(_9);
-},setValue:function(_b){
-dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");
-return this.set("value",_b);
-},_setValueAttr:function(_c){
-this.value=_c=dojo.trim(_c);
-if(!this.renderAsHtml){
-_c=_c.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");
-}
-this.displayNode.innerHTML=_c||this.noValueIndicator;
-},getValue:function(){
-dojo.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");
-return this.get("value");
-},cancel:function(_d){
-if(this.disabled||!this.editing){
-return;
-}
-this.editing=false;
-setTimeout(dojo.hitch(this,"onCancel"),0);
-this._showText(_d);
-}});
-dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit","templates/InlineEditBox.html","<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\"\n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" label=\"${buttonSave}\"></button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\" label=\"${buttonCancel}\"></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(_e){
-if(!this[_e]){
-this[_e]=this.messages[_e];
-}
-},this);
-},postCreate:function(){
-var _f=dojo.getObject(this.editor);
-var _10=this.sourceStyle,_11="line-height:"+_10.lineHeight+";",_12=dojo.getComputedStyle(this.domNode);
-dojo.forEach(["Weight","Family","Size","Style"],function(_13){
-var _14=_10["font"+_13],_15=_12["font"+_13];
-if(_15!=_14){
-_11+="font-"+_13+":"+_10["font"+_13]+";";
-}
-},this);
-dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(_16){
-this.domNode.style[_16]=_10[_16];
-},this);
-var _17=this.inlineEditBox.width;
-if(_17=="100%"){
-_11+="width:100%;";
-this.domNode.style.display="block";
-}else{
-_11+="width:"+(_17+(Number(_17)==_17?"px":""))+";";
-}
-var _18=dojo.delegate(this.inlineEditBox.editorParams,{style:_11,dir:this.dir,lang:this.lang});
-_18["displayedValue" in _f.prototype?"displayedValue":"value"]=this.value;
-var ew=(this.editWidget=new _f(_18,this.editorPlaceholder));
-if(this.inlineEditBox.autoSave){
-dojo.destroy(this.buttonContainer);
-this.connect(ew,"onChange","_onChange");
-this.connect(ew,"onKeyPress","_onKeyPress");
-}else{
-if("intermediateChanges" in _f.prototype){
-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);
-}});
+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);
+ }
+});
+
}
diff --git a/lib/dijit/LICENSE b/lib/dijit/LICENSE
index 4c93ded6b..aa6b39f8c 100644
--- a/lib/dijit/LICENSE
+++ b/lib/dijit/LICENSE
@@ -13,7 +13,7 @@ The text of the AFL and BSD licenses is reproduced below.
The "New" BSD License:
**********************
-Copyright (c) 2005-2010, The Dojo Foundation
+Copyright (c) 2005-2011, The Dojo Foundation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/lib/dijit/Menu.js b/lib/dijit/Menu.js
index 83a2ddbad..c5a48660e 100644
--- a/lib/dijit/Menu.js
+++ b/lib/dijit/Menu.js
@@ -1,325 +1,716 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.Menu"]=true;
+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.declare("dijit._MenuBase",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{parentMenu:null,popupDelay:500,startup:function(){
-if(this._started){
-return;
-}
-dojo.forEach(this.getChildren(),function(_1){
-_1.startup();
-});
-this.startupKeyNavChildren();
-this.inherited(arguments);
-},onExecute:function(){
-},onCancel:function(_2){
-},_moveToPopup:function(_3){
-if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){
-this.focusedChild._onClick(_3);
-}else{
-var _4=this._getTopMenu();
-if(_4&&_4._isMenuBar){
-_4.focusNext();
-}
-}
-},_onPopupHover:function(_5){
-if(this.currentPopup&&this.currentPopup._pendingClose_timer){
-var _6=this.currentPopup.parentMenu;
-if(_6.focusedChild){
-_6.focusedChild._setSelected(false);
-}
-_6.focusedChild=this.currentPopup.from_item;
-_6.focusedChild._setSelected(true);
-this._stopPendingCloseTimer(this.currentPopup);
-}
-},onItemHover:function(_7){
-if(this.isActive){
-this.focusChild(_7);
-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(_7);
-}
-this._hoveredChild=_7;
-},_onChildBlur:function(_8){
-this._stopPopupTimer();
-_8._setSelected(false);
-var _9=_8.popup;
-if(_9){
-this._stopPendingCloseTimer(_9);
-_9._pendingClose_timer=setTimeout(function(){
-_9._pendingClose_timer=null;
-if(_9.parentMenu){
-_9.parentMenu.currentPopup=null;
-}
-dijit.popup.close(_9);
-},this.popupDelay);
-}
-},onItemUnhover:function(_a){
-if(this.isActive){
-this._stopPopupTimer();
-}
-if(this._hoveredChild==_a){
-this._hoveredChild=null;
-}
-},_stopPopupTimer:function(){
-if(this.hover_timer){
-clearTimeout(this.hover_timer);
-this.hover_timer=null;
-}
-},_stopPendingCloseTimer:function(_b){
-if(_b._pendingClose_timer){
-clearTimeout(_b._pendingClose_timer);
-_b._pendingClose_timer=null;
-}
-},_stopFocusTimer:function(){
-if(this._focus_timer){
-clearTimeout(this._focus_timer);
-this._focus_timer=null;
-}
-},_getTopMenu:function(){
-for(var _c=this;_c.parentMenu;_c=_c.parentMenu){
-}
-return _c;
-},onItemClick:function(_d,_e){
-if(typeof this.isShowingNow=="undefined"){
-this._markActive();
-}
-this.focusChild(_d);
-if(_d.disabled){
-return false;
-}
-if(_d.popup){
-this._openPopup();
-}else{
-this.onExecute();
-_d.onClick(_e);
-}
-},_openPopup:function(){
-this._stopPopupTimer();
-var _f=this.focusedChild;
-if(!_f){
-return;
-}
-var _10=_f.popup;
-if(_10.isShowingNow){
-return;
-}
-if(this.currentPopup){
-this._stopPendingCloseTimer(this.currentPopup);
-dijit.popup.close(this.currentPopup);
-}
-_10.parentMenu=this;
-_10.from_item=_f;
-var _11=this;
-dijit.popup.open({parent:this,popup:_10,around:_f.domNode,orient:this._orient||(this.isLeftToRight()?{"TR":"TL","TL":"TR","BR":"BL","BL":"BR"}:{"TL":"TR","TR":"TL","BL":"BR","BR":"BL"}),onCancel:function(){
-_11.focusChild(_f);
-_11._cleanUp();
-_f._setSelected(true);
-_11.focusedChild=_f;
-},onExecute:dojo.hitch(this,"_cleanUp")});
-this.currentPopup=_10;
-_10.connect(_10.domNode,"onmouseenter",dojo.hitch(_11,"_onPopupHover"));
-if(_10.focus){
-_10._focus_timer=setTimeout(dojo.hitch(_10,function(){
-this._focus_timer=null;
-this.focus();
-}),0);
-}
-},_markActive:function(){
-this.isActive=true;
-dojo.addClass(this.domNode,"dijitMenuActive");
-dojo.removeClass(this.domNode,"dijitMenuPassive");
-},onOpen:function(e){
-this.isShowingNow=true;
-this._markActive();
-},_markInactive:function(){
-this.isActive=false;
-dojo.removeClass(this.domNode,"dijitMenuActive");
-dojo.addClass(this.domNode,"dijitMenuPassive");
-},onClose:function(){
-this._stopFocusTimer();
-this._markInactive();
-this.isShowingNow=false;
-this.parentMenu=null;
-},_closeChild:function(){
-this._stopPopupTimer();
-if(this.focusedChild){
-this.focusedChild._setSelected(false);
-this.focusedChild._onUnhover();
-this.focusedChild=null;
-}
-if(this.currentPopup){
-dijit.popup.close(this.currentPopup);
-this.currentPopup=null;
-}
-},_onItemFocus:function(_12){
-if(this._hoveredChild&&this._hoveredChild!=_12){
-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\" waiRole=\"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(_13){
-var win=dojo.window.get(this._iframeContentDocument(_13))||this._iframeContentDocument(_13)["__parent__"]||(_13.name&&dojo.doc.frames[_13.name])||null;
-return win;
-},_iframeContentDocument:function(_14){
-var doc=_14.contentDocument||(_14.contentWindow&&_14.contentWindow.document)||(_14.name&&dojo.doc.frames[_14.name]&&dojo.doc.frames[_14.name].document)||null;
-return doc;
-},bindDomNode:function(_15){
-_15=dojo.byId(_15);
-var cn;
-if(_15.tagName.toLowerCase()=="iframe"){
-var _16=_15,win=this._iframeContentWindow(_16);
-cn=dojo.withGlobal(win,dojo.body);
-}else{
-cn=(_15==dojo.body()?dojo.doc.documentElement:_15);
-}
-var _17={node:_15,iframe:_16};
-dojo.attr(_15,"_dijitMenu"+this.id,this._bindings.push(_17));
-var _18=dojo.hitch(this,function(cn){
-return [dojo.connect(cn,this.leftClickToOpen?"onclick":"oncontextmenu",this,function(evt){
-dojo.stopEvent(evt);
-this._scheduleOpen(evt.target,_16,{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,_16);
-}
-})];
-});
-_17.connects=cn?_18(cn):[];
-if(_16){
-_17.onloadHandler=dojo.hitch(this,function(){
-var win=this._iframeContentWindow(_16);
-cn=dojo.withGlobal(win,dojo.body);
-_17.connects=_18(cn);
-});
-if(_16.addEventListener){
-_16.addEventListener("load",_17.onloadHandler,false);
-}else{
-_16.attachEvent("onload",_17.onloadHandler);
-}
-}
-},unBindDomNode:function(_19){
-var _1a;
-try{
-_1a=dojo.byId(_19);
-}
-catch(e){
-return;
-}
-var _1b="_dijitMenu"+this.id;
-if(_1a&&dojo.hasAttr(_1a,_1b)){
-var bid=dojo.attr(_1a,_1b)-1,b=this._bindings[bid];
-dojo.forEach(b.connects,dojo.disconnect);
-var _1c=b.iframe;
-if(_1c){
-if(_1c.removeEventListener){
-_1c.removeEventListener("load",b.onloadHandler,false);
-}else{
-_1c.detachEvent("onload",b.onloadHandler);
-}
-}
-dojo.removeAttr(_1a,_1b);
-delete this._bindings[bid];
-}
-},_scheduleOpen:function(_1d,_1e,_1f){
-if(!this._openTimer){
-this._openTimer=setTimeout(dojo.hitch(this,function(){
-delete this._openTimer;
-this._openMyself({target:_1d,iframe:_1e,coords:_1f});
-}),1);
-}
-},_openMyself:function(_20){
-var _21=_20.target,_22=_20.iframe,_23=_20.coords;
-if(_23){
-if(_22){
-var od=_21.ownerDocument,ifc=dojo.position(_22,true),win=this._iframeContentWindow(_22),_24=dojo.withGlobal(win,"_docScroll",dojo);
-var cs=dojo.getComputedStyle(_22),tp=dojo._toPixelValue,_25=(dojo.isIE&&dojo.isQuirks?0:tp(_22,cs.paddingLeft))+(dojo.isIE&&dojo.isQuirks?tp(_22,cs.borderLeftWidth):0),top=(dojo.isIE&&dojo.isQuirks?0:tp(_22,cs.paddingTop))+(dojo.isIE&&dojo.isQuirks?tp(_22,cs.borderTopWidth):0);
-_23.x+=ifc.x+_25-_24.x;
-_23.y+=ifc.y+top-_24.y;
-}
-}else{
-_23=dojo.position(_21,true);
-_23.x+=10;
-_23.y+=10;
-}
-var _26=this;
-var _27=dijit.getFocus(this);
-function _28(){
-if(_26.refocus){
-dijit.focus(_27);
-}
-dijit.popup.close(_26);
-};
-dijit.popup.open({popup:this,x:_23.x,y:_23.y,onExecute:_28,onCancel:_28,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);
-}});
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);
+ }
+}
+);
+
}
diff --git a/lib/dijit/MenuBar.js b/lib/dijit/MenuBar.js
index d7eb35438..06d236b66 100644
--- a/lib/dijit/MenuBar.js
+++ b/lib/dijit/MenuBar.js
@@ -1,38 +1,77 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.MenuBar"]=true;
+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,{templateString:dojo.cache("dijit","templates/MenuBar.html","<div class=\"dijitMenuBar dijitMenuPassive\" dojoAttachPoint=\"containerNode\" waiRole=\"menubar\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress: _onKeyPress\"></div>\n"),baseClass:"dijitMenuBar",_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]);
-this._orient=this.isLeftToRight()?{BL:"TL"}:{BR:"TR"};
-},focusChild:function(_1){
-var _2=this.focusedChild,_3=_2&&_2.popup&&_2.popup.isShowingNow;
-this.inherited(arguments);
-if(_3&&_1.popup&&!_1.disabled){
-this._openPopup();
-}
-},_onKeyPress:function(_4){
-if(_4.ctrlKey||_4.altKey){
-return;
-}
-switch(_4.charOrCode){
-case dojo.keys.DOWN_ARROW:
-this._moveToPopup(_4);
-dojo.stopEvent(_4);
-}
-},onItemClick:function(_5,_6){
-if(_5.popup&&_5.popup.isShowingNow){
-_5.popup.onCancel();
-}else{
-this.inherited(arguments);
-}
-}});
+
+
+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);
+ }
+ }
+});
+
}
diff --git a/lib/dijit/MenuBarItem.js b/lib/dijit/MenuBarItem.js
index 77088bff2..2c7372dcd 100644
--- a/lib/dijit/MenuBarItem.js
+++ b/lib/dijit/MenuBarItem.js
@@ -1,14 +1,29 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.MenuBarItem"]=true;
+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\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span dojoAttachPoint=\"containerNode\"></span>\n</div>\n"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"containerNode",type:"innerHTML"}})});
-dojo.declare("dijit.MenuBarItem",[dijit.MenuItem,dijit._MenuBarItemMixin],{});
+
+
+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)
+
+});
+
}
diff --git a/lib/dijit/MenuItem.js b/lib/dijit/MenuItem.js
index 1f890b5f4..966b2b46b 100644
--- a/lib/dijit/MenuItem.js
+++ b/lib/dijit/MenuItem.js
@@ -1,69 +1,200 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.MenuItem"]=true;
+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],{templateString:dojo.cache("dijit","templates/MenuItem.html","<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"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(_1){
-if(_1&&!("label" in this.params)){
-this.set("label",_1.innerHTML);
-}
-},postCreate:function(){
-this.inherited(arguments);
-dojo.setSelectable(this.domNode,false);
-var _2=this.id+"_text";
-dojo.attr(this.containerNode,"id",_2);
-if(this.accelKeyNode){
-dojo.attr(this.accelKeyNode,"id",this.id+"_accel");
-_2+=" "+this.id+"_accel";
-}
-dijit.setWaiState(this.domNode,"labelledby",_2);
-},_onHover:function(){
-this.getParent().onItemHover(this);
-},_onUnhover:function(){
-this.getParent().onItemUnhover(this);
-this._hovering=false;
-this._setStateClass();
-},_onClick:function(_3){
-this.getParent().onItemClick(this,_3);
-dojo.stopEvent(_3);
-},onClick:function(_4){
-},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(_5){
-dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_5);
-},setLabel:function(_6){
-dojo.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");
-this.set("label",_6);
-},setDisabled:function(_7){
-dojo.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");
-this.set("disabled",_7);
-},_setDisabledAttr:function(_8){
-this.disabled=_8;
-dijit.setWaiState(this.focusNode,"disabled",_8?"true":"false");
-},_setAccelKeyAttr:function(_9){
-this.accelKey=_9;
-this.accelKeyNode.style.display=_9?"":"none";
-this.accelKeyNode.innerHTML=_9;
-dojo.attr(this.containerNode,"colSpan",_9?"1":"2");
-}});
+
+
+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);
+ }
+ });
+
}
diff --git a/lib/dijit/MenuSeparator.js b/lib/dijit/MenuSeparator.js
index 34fa0bada..e532d9320 100644
--- a/lib/dijit/MenuSeparator.js
+++ b/lib/dijit/MenuSeparator.js
@@ -1,19 +1,39 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.MenuSeparator"]=true;
+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],{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"),postCreate:function(){
-dojo.setSelectable(this.domNode,false);
-},isFocusable:function(){
-return false;
-}});
+
+
+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
+ }
+ });
+
}
diff --git a/lib/dijit/PopupMenuBarItem.js b/lib/dijit/PopupMenuBarItem.js
index ce2eda546..38a5edd9b 100644
--- a/lib/dijit/PopupMenuBarItem.js
+++ b/lib/dijit/PopupMenuBarItem.js
@@ -1,14 +1,20 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.PopupMenuBarItem"]=true;
+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],{});
+
+
+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)
+});
+
}
diff --git a/lib/dijit/PopupMenuItem.js b/lib/dijit/PopupMenuItem.js
index 29a011cc0..da44a23f7 100644
--- a/lib/dijit/PopupMenuItem.js
+++ b/lib/dijit/PopupMenuItem.js
@@ -1,43 +1,74 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.PopupMenuItem"]=true;
+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(){
-if(this.srcNodeRef){
-var _1=dojo.query("*",this.srcNodeRef);
-dijit.PopupMenuItem.superclass._fillContent.call(this,_1[0]);
-this.dropDownContainer=this.srcNodeRef;
-}
-},startup:function(){
-if(this._started){
-return;
-}
-this.inherited(arguments);
-if(!this.popup){
-var _2=dojo.query("[widgetId]",this.dropDownContainer)[0];
-this.popup=dijit.byNode(_2);
-}
-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);
-}});
+
+
+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);
+ }
+ });
+
}
diff --git a/lib/dijit/ProgressBar.js b/lib/dijit/ProgressBar.js
index 54b48a3ab..3b4532060 100644
--- a/lib/dijit/ProgressBar.js
+++ b/lib/dijit/ProgressBar.js
@@ -1,59 +1,168 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.ProgressBar"]=true;
+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],{progress:"0",maximum:100,places:0,indeterminate:false,name:"",templateString:dojo.cache("dijit","templates/ProgressBar.html","<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"),_indeterminateHighContrastImagePath:dojo.moduleUrl("dijit","themes/a11y/indeterminate_progress.gif"),postCreate:function(){
-this.inherited(arguments);
-this.indeterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath.toString());
-this.update();
-},update:function(_1){
-dojo.mixin(this,_1||{});
-var _2=this.internalProgress;
-var _3=1,_4;
-if(this.indeterminate){
-_4="addClass";
-dijit.removeWaiState(_2,"valuenow");
-dijit.removeWaiState(_2,"valuemin");
-dijit.removeWaiState(_2,"valuemax");
-}else{
-_4="removeClass";
-if(String(this.progress).indexOf("%")!=-1){
-_3=Math.min(parseFloat(this.progress)/100,1);
-this.progress=_3*this.maximum;
-}else{
-this.progress=Math.min(this.progress,this.maximum);
-_3=this.progress/this.maximum;
-}
-var _5=this.report(_3);
-this.label.firstChild.nodeValue=_5;
-dijit.setWaiState(_2,"describedby",this.label.id);
-dijit.setWaiState(_2,"valuenow",this.progress);
-dijit.setWaiState(_2,"valuemin",0);
-dijit.setWaiState(_2,"valuemax",this.maximum);
-}
-dojo[_4](this.domNode,"dijitProgressBarIndeterminate");
-_2.style.width=(_3*100)+"%";
-this.onChange();
-},_setValueAttr:function(v){
-if(v==Infinity){
-this.update({indeterminate:true});
-}else{
-this.update({indeterminate:false,progress:v});
-}
-},_getValueAttr:function(){
-return this.progress;
-},report:function(_6){
-return dojo.number.format(_6,{type:"percent",places:this.places,locale:this.lang});
-},onChange:function(){
-}});
+
+
+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
+ }
+});
+
}
diff --git a/lib/dijit/TitlePane.js b/lib/dijit/TitlePane.js
index f3fc7fade..c29ac02f2 100644
--- a/lib/dijit/TitlePane.js
+++ b/lib/dijit/TitlePane.js
@@ -1,110 +1,257 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.TitlePane"]=true;
+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],{title:"",open:true,toggleable:true,tabIndex:"0",duration:dijit.defaultDuration,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\" waiRole=\"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\" waiRole=\"presentation\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\" waiRole=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\" 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"},id:""}),postCreate:function(){
-if(!this.open){
-this.hideNode.style.display=this.wipeNode.style.display="none";
-}
-if(this.toggleable){
-this._trackMouseState(this.titleBarNode,"dijitTitlePaneTitle");
-}
-this._setCss();
-dojo.setSelectable(this.titleNode,false);
-var _1=this.hideNode,_2=this.wipeNode;
-this._wipeIn=dojo.fx.wipeIn({node:this.wipeNode,duration:this.duration,beforeBegin:function(){
-_1.style.display="";
-}});
-this._wipeOut=dojo.fx.wipeOut({node:this.wipeNode,duration:this.duration,onEnd:function(){
-_1.style.display="none";
-}});
-this.inherited(arguments);
-},_setOpenAttr:function(_3){
-if(this.open!==_3){
-this.toggle();
-}
-dijit.setWaiState(this.containerNode,"hidden",this.open?"false":"true");
-dijit.setWaiState(this.focusNode,"pressed",this.open?"true":"false");
-},_setToggleableAttr:function(_4){
-this.toggleable=_4;
-dijit.setWaiRole(this.focusNode,_4?"button":"heading");
-if(_4){
-dijit.setWaiState(this.focusNode,"controls",this.id+"_pane");
-dojo.attr(this.focusNode,"tabIndex",this.tabIndex);
-}else{
-dojo.removeAttr(this.focusNode,"tabIndex");
-}
-this._setCss();
-},_setContentAttr:function(_5){
-if(!this.open||!this._wipeOut||this._wipeOut.status()=="playing"){
-this.inherited(arguments);
-}else{
-if(this._wipeIn&&this._wipeIn.status()=="playing"){
-this._wipeIn.stop();
-}
-dojo.marginBox(this.wipeNode,{h:dojo.marginBox(this.wipeNode).h});
-this.inherited(arguments);
-if(this._wipeIn){
-this._wipeIn.play();
-}else{
-this.hideNode.style.display="";
-}
-}
-},toggle:function(){
-dojo.forEach([this._wipeIn,this._wipeOut],function(_6){
-if(_6&&_6.status()=="playing"){
-_6.stop();
-}
+
+
+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);
+ }
});
-var _7=this[this.open?"_wipeOut":"_wipeIn"];
-if(_7){
-_7.play();
-}else{
-this.hideNode.style.display=this.open?"":"none";
-}
-this.open=!this.open;
-if(this.open){
-this._onShow();
-}else{
-this.onHide();
-}
-this._setCss();
-},_setCss:function(){
-var _8=this.titleBarNode||this.focusNode;
-if(this._titleBarClass){
-dojo.removeClass(_8,this._titleBarClass);
-}
-this._titleBarClass="dijit"+(this.toggleable?"":"Fixed")+(this.open?"Open":"Closed");
-dojo.addClass(_8,this._titleBarClass);
-this.arrowNodeInner.innerHTML=this.open?"-":"+";
-},_onTitleKey:function(e){
-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(){
-if(this.toggleable){
-this.toggle();
-}
-},setTitle:function(_9){
-dojo.deprecated("dijit.TitlePane.setTitle() is deprecated. Use set('title', ...) instead.","","2.0");
-this.set("title",_9);
-}});
+
}
diff --git a/lib/dijit/Toolbar.js b/lib/dijit/Toolbar.js
index e51f7eaf8..94184f989 100644
--- a/lib/dijit/Toolbar.js
+++ b/lib/dijit/Toolbar.js
@@ -1,25 +1,53 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.Toolbar"]=true;
+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.declare("dijit.Toolbar",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{templateString:"<div class=\"dijit\" waiRole=\"toolbar\" tabIndex=\"${tabIndex}\" dojoAttachPoint=\"containerNode\">"+"</div>",baseClass:"dijitToolbar",postCreate:function(){
-this.connectKeyNavHandlers(this.isLeftToRight()?[dojo.keys.LEFT_ARROW]:[dojo.keys.RIGHT_ARROW],this.isLeftToRight()?[dojo.keys.RIGHT_ARROW]:[dojo.keys.LEFT_ARROW]);
-this.inherited(arguments);
-},startup:function(){
-if(this._started){
-return;
-}
-this.startupKeyNavChildren();
-this.inherited(arguments);
-}});
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);
+ }
+}
+);
+
}
diff --git a/lib/dijit/ToolbarSeparator.js b/lib/dijit/ToolbarSeparator.js
index dca5792f7..39a29d50b 100644
--- a/lib/dijit/ToolbarSeparator.js
+++ b/lib/dijit/ToolbarSeparator.js
@@ -1,18 +1,35 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.ToolbarSeparator"]=true;
+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],{templateString:"<div class=\"dijitToolbarSeparator dijitInline\" waiRole=\"presentation\"></div>",postCreate:function(){
-dojo.setSelectable(this.domNode,false);
-},isFocusable:function(){
-return false;
-}});
+
+
+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;
+ }
+
+ });
+
}
diff --git a/lib/dijit/Tooltip.js b/lib/dijit/Tooltip.js
index fea9a0bc1..46b3a3805 100644
--- a/lib/dijit/Tooltip.js
+++ b/lib/dijit/Tooltip.js
@@ -1,155 +1,440 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.Tooltip"]=true;
+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],{duration:dijit.defaultDuration,templateString:dojo.cache("dijit","templates/Tooltip.html","<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\">\n\t<div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></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(_1,_2,_3,_4){
-if(this.aroundNode&&this.aroundNode===_2){
-return;
-}
-if(this.fadeOut.status()=="playing"){
-this._onDeck=arguments;
-return;
-}
-this.containerNode.innerHTML=_1;
-var _5=dijit.placeOnScreenAroundElement(this.domNode,_2,dijit.getPopupAroundAlignment((_3&&_3.length)?_3:dijit.Tooltip.defaultPosition,!_4),dojo.hitch(this,"orient"));
-dojo.style(this.domNode,"opacity",0);
-this.fadeIn.play();
-this.isShowingNow=true;
-this.aroundNode=_2;
-},orient:function(_6,_7,_8){
-_6.className="dijitTooltip "+{"BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_7+"-"+_8];
-},_onShow:function(){
-if(dojo.isIE){
-this.domNode.style.filter="";
-}
-},hide:function(_9){
-if(this._onDeck&&this._onDeck[1]==_9){
-this._onDeck=null;
-}else{
-if(this.aroundNode===_9){
-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(_a,_b,_c,_d){
-if(!dijit._masterTT){
-dijit._masterTT=new dijit._MasterTooltip();
-}
-return dijit._masterTT.show(_a,_b,_c,_d);
+
+
+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(_e){
-if(!dijit._masterTT){
-dijit._masterTT=new dijit._MasterTooltip();
-}
-return dijit._masterTT.hide(_e);
+
+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,{label:"",showDelay:400,connectId:[],position:[],constructor:function(){
-this._nodeConnectionsById={};
-},_setConnectIdAttr:function(_f){
-for(var _10 in this._nodeConnectionsById){
-this.removeTarget(_10);
-}
-dojo.forEach(dojo.isArrayLike(_f)?_f:[_f],this.addTarget,this);
-},_getConnectIdAttr:function(){
-var ary=[];
-for(var id in this._nodeConnectionsById){
-ary.push(id);
-}
-return ary;
-},addTarget:function(id){
-var _11=dojo.byId(id);
-if(!_11){
-return;
-}
-if(_11.id in this._nodeConnectionsById){
-return;
-}
-this._nodeConnectionsById[_11.id]=[this.connect(_11,"onmouseenter","_onTargetMouseEnter"),this.connect(_11,"onmouseleave","_onTargetMouseLeave"),this.connect(_11,"onfocus","_onTargetFocus"),this.connect(_11,"onblur","_onTargetBlur")];
-},removeTarget:function(_12){
-var id=_12.id||_12;
-if(id in this._nodeConnectionsById){
-dojo.forEach(this._nodeConnectionsById[id],this.disconnect,this);
-delete this._nodeConnectionsById[id];
-}
-},postCreate:function(){
-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 _13=e.target;
-this._showTimer=setTimeout(dojo.hitch(this,function(){
-this.open(_13);
-}),this.showDelay);
-}
-},_onUnHover:function(e){
-if(this._focus){
-return;
-}
-if(this._showTimer){
-clearTimeout(this._showTimer);
-delete this._showTimer;
-}
-this.close();
-},open:function(_14){
-if(this._showTimer){
-clearTimeout(this._showTimer);
-delete this._showTimer;
-}
-dijit.showTooltip(this.label||this.domNode.innerHTML,_14,this.position,!this.isLeftToRight());
-this._connectNode=_14;
-this.onShow(_14,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(_15,_16){
-},onHide:function(){
-},uninitialize:function(){
-this.close();
-this.inherited(arguments);
-}});
-dijit.Tooltip.defaultPosition=["after","before"];
+
+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"];
+
}
diff --git a/lib/dijit/TooltipDialog.js b/lib/dijit/TooltipDialog.js
index 13f69dbd3..38d551048 100644
--- a/lib/dijit/TooltipDialog.js
+++ b/lib/dijit/TooltipDialog.js
@@ -1,66 +1,146 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.TooltipDialog"]=true;
+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],{title:"",doLayout:false,autofocus:true,baseClass:"dijitTooltipDialog",_firstFocusItem:null,_lastFocusItem:null,templateString:dojo.cache("dijit","templates/TooltipDialog.html","<div waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presentation\"></div>\n</div>\n"),postCreate:function(){
-this.inherited(arguments);
-this.connect(this.containerNode,"onkeypress","_onKey");
-this.containerNode.title=this.title;
-},orient:function(_1,_2,_3){
-var c=this._currentOrientClass;
-if(c){
-dojo.removeClass(this.domNode,c);
-}
-c="dijitTooltipAB"+(_3.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_3.charAt(0)=="T"?"Below":"Above");
-dojo.addClass(this.domNode,c);
-this._currentOrientClass=c;
-},onOpen:function(_4){
-this.orient(this.domNode,_4.aroundCorner,_4.corner);
-this._onShow();
-if(this.autofocus){
-this._getFocusItems(this.containerNode);
-dijit.focus(this._firstFocusItem);
-}
-},onClose:function(){
-this.onHide();
-},_onKey:function(_5){
-var _6=_5.target;
-var dk=dojo.keys;
-if(_5.charOrCode===dk.TAB){
-this._getFocusItems(this.containerNode);
-}
-var _7=(this._firstFocusItem==this._lastFocusItem);
-if(_5.charOrCode==dk.ESCAPE){
-setTimeout(dojo.hitch(this,"onCancel"),0);
-dojo.stopEvent(_5);
-}else{
-if(_6==this._firstFocusItem&&_5.shiftKey&&_5.charOrCode===dk.TAB){
-if(!_7){
-dijit.focus(this._lastFocusItem);
-}
-dojo.stopEvent(_5);
-}else{
-if(_6==this._lastFocusItem&&_5.charOrCode===dk.TAB&&!_5.shiftKey){
-if(!_7){
-dijit.focus(this._firstFocusItem);
-}
-dojo.stopEvent(_5);
-}else{
-if(_5.charOrCode===dk.TAB){
-_5.stopPropagation();
-}
-}
-}
-}
-}});
+
+
+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();
+ }
+ }
+ }
+ );
+
}
diff --git a/lib/dijit/Tree.js b/lib/dijit/Tree.js
index 761d4c3fc..d702a3b94 100644
--- a/lib/dijit/Tree.js
+++ b/lib/dijit/Tree.js
@@ -1,12 +1,12 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.Tree"]=true;
+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");
@@ -16,663 +16,1619 @@ dojo.require("dijit._Container");
dojo.require("dijit._Contained");
dojo.require("dijit._CssStateMixin");
dojo.require("dojo.cookie");
-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\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t/><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" waiRole=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" waiRole=\"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"}}),postCreate:function(){
-this.inherited(arguments);
-this._setExpando();
-this._updateItemClasses(this.item);
-if(this.isExpandable){
-dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);
-}
-},_setIndentAttr:function(_1){
-this.indent=_1;
-var _2=(Math.max(_1,0)*this.tree._nodePixelIndent)+"px";
-dojo.style(this.domNode,"backgroundPosition",_2+" 0px");
-dojo.style(this.rowNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_2);
-dojo.forEach(this.getChildren(),function(_3){
-_3.set("indent",_1+1);
-});
-},markProcessing:function(){
-this.state="LOADING";
-this._setExpando(true);
-},unmarkProcessing:function(){
-this._setExpando(false);
-},_updateItemClasses:function(_4){
-var _5=this.tree,_6=_5.model;
-if(_5._v10Compat&&_4===_6.root){
-_4=null;
-}
-this._applyClassAndStyle(_4,"icon","Icon");
-this._applyClassAndStyle(_4,"label","Label");
-this._applyClassAndStyle(_4,"row","Row");
-},_applyClassAndStyle:function(_7,_8,_9){
-var _a="_"+_8+"Class";
-var _b=_8+"Node";
-if(this[_a]){
-dojo.removeClass(this[_b],this[_a]);
-}
-this[_a]=this.tree["get"+_9+"Class"](_7,this.isExpanded);
-if(this[_a]){
-dojo.addClass(this[_b],this[_a]);
-}
-dojo.style(this[_b],this.tree["get"+_9+"Style"](_7,this.isExpanded)||{});
-},_updateLayout:function(){
-var _c=this.getParent();
-if(!_c||_c.rowNode.style.display=="none"){
-dojo.addClass(this.domNode,"dijitTreeIsRoot");
-}else{
-dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());
-}
-},_setExpando:function(_d){
-var _e=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_f=["*","-","+","*"],idx=_d?0:(this.isExpandable?(this.isExpanded?1:2):3);
-dojo.removeClass(this.expandoNode,_e);
-dojo.addClass(this.expandoNode,_e[idx]);
-this.expandoNodeText.innerHTML=_f[idx];
-},expand:function(){
-if(this._expandDeferred){
-return this._expandDeferred;
-}
-this._wipeOut&&this._wipeOut.stop();
-this.isExpanded=true;
-dijit.setWaiState(this.labelNode,"expanded","true");
-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,_10=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration,onEnd:function(){
-def.callback(true);
-}});
-def=(this._expandDeferred=new dojo.Deferred(function(){
-_10.stop();
-}));
-_10.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(_11){
-var _12=this.tree,_13=_12.model,_14=[];
-dojo.forEach(this.getChildren(),function(_15){
-dijit._Container.prototype.removeChild.call(this,_15);
-},this);
-this.state="LOADED";
-if(_11&&_11.length>0){
-this.isExpandable=true;
-dojo.forEach(_11,function(_16){
-var id=_13.getIdentity(_16),_17=_12._itemNodesMap[id],_18;
-if(_17){
-for(var i=0;i<_17.length;i++){
-if(_17[i]&&!_17[i].getParent()){
-_18=_17[i];
-_18.set("indent",this.indent+1);
-break;
-}
-}
-}
-if(!_18){
-_18=this.tree._createTreeNode({item:_16,tree:_12,isExpandable:_13.mayHaveChildren(_16),label:_12.getLabel(_16),tooltip:_12.getTooltip(_16),dir:_12.dir,lang:_12.lang,indent:this.indent+1});
-if(_17){
-_17.push(_18);
-}else{
-_12._itemNodesMap[id]=[_18];
-}
-}
-this.addChild(_18);
-if(this.tree.autoExpand||this.tree._state(_16)){
-_14.push(_12._expandNode(_18));
-}
-},this);
-dojo.forEach(this.getChildren(),function(_19,idx){
-_19._updateLayout();
-});
-}else{
-this.isExpandable=false;
-}
-if(this._setExpando){
-this._setExpando(false);
-}
-this._updateItemClasses(this.item);
-if(this==_12.rootNode){
-var fc=this.tree.showRoot?this:this.getChildren()[0];
-if(fc){
-fc.setFocusable(true);
-_12.lastFocused=fc;
-}else{
-_12.domNode.setAttribute("tabIndex","0");
-}
-}
-return new dojo.DeferredList(_14);
-},removeChild:function(_1a){
-this.inherited(arguments);
-var _1b=this.getChildren();
-if(_1b.length==0){
-this.isExpandable=false;
-this.collapse();
-}
-dojo.forEach(_1b,function(_1c){
-_1c._updateLayout();
-});
-},makeExpandable:function(){
-this.isExpandable=true;
-this._setExpando(false);
-},_onLabelFocus:function(evt){
-this.tree._onNodeFocus(this);
-},setSelected:function(_1d){
-dijit.setWaiState(this.labelNode,"selected",_1d);
-dojo.toggleClass(this.rowNode,"dijitTreeRowSelected",_1d);
-},setFocusable:function(_1e){
-this.labelNode.setAttribute("tabIndex",_1e?"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"],path:[],selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:dojo.cache("dijit","templates/Tree.html","<div class=\"dijitTree dijitTreeContainer\" waiRole=\"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:null,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(_1f,_20){
-dojo.publish(this.id,[dojo.mixin({tree:this,event:_1f},_20||{})]);
-},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 _21={};
-for(var i=0;i<this.dndParams.length;i++){
-if(this[this.dndParams[i]]){
-_21[this.dndParams[i]]=this[this.dndParams[i]];
-}
-}
-this.dndController=new this.dndController(this,_21);
-}
-},_store2model:function(){
-this._v10Compat=true;
-dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");
-var _22={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};
-if(this.params.mayHaveChildren){
-_22.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");
-}
-if(this.params.getItemChildren){
-_22.getChildren=dojo.hitch(this,function(_23,_24,_25){
-this.getItemChildren((this._v10Compat&&_23===this.model.root)?null:_23,_24,_25);
-});
-}
-this.model=new dijit.tree.ForestStoreModel(_22);
-this.showRoot=Boolean(this.label);
-},onLoad:function(){
-},_load:function(){
-this.model.getRoot(dojo.hitch(this,function(_26){
-var rn=(this.rootNode=this.tree._createTreeNode({item:_26,tree:this,isExpandable:true,label:this.label||this.getLabel(_26),indent:this.showRoot?0:-1}));
-if(!this.showRoot){
-rn.rowNode.style.display="none";
-}
-this.domNode.appendChild(rn.domNode);
-var _27=this.model.getIdentity(_26);
-if(this._itemNodesMap[_27]){
-this._itemNodesMap[_27].push(rn);
-}else{
-this._itemNodesMap[_27]=[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(_28){
-if(!_28){
-return [];
-}
-var _29=dojo.isString(_28)?_28:this.model.getIdentity(_28);
-return [].concat(this._itemNodesMap[_29]);
-},_setSelectedItemAttr:function(_2a){
-var _2b=this.get("selectedItem");
-var _2c=(!_2a||dojo.isString(_2a))?_2a:this.model.getIdentity(_2a);
-if(_2c==_2b?this.model.getIdentity(_2b):null){
-return;
-}
-var _2d=this._itemNodesMap[_2c];
-this._selectNode((_2d&&_2d[0])||null);
-},_getSelectedItemAttr:function(){
-return this.selectedNode&&this.selectedNode.item;
-},_setPathAttr:function(_2e){
-var d=new dojo.Deferred();
-this._selectNode(null);
-if(!_2e||!_2e.length){
-d.resolve(true);
-return d;
-}
-this._loadDeferred.addCallback(dojo.hitch(this,function(){
-if(!this.rootNode){
-d.reject(new Error("!this.rootNode"));
-return;
-}
-if(_2e[0]!==this.rootNode.item&&(dojo.isString(_2e[0])&&_2e[0]!=this.model.getIdentity(this.rootNode.item))){
-d.reject(new Error(this.id+":path[0] doesn't match this.rootNode.item. Maybe you are using the wrong tree."));
-return;
-}
-_2e.shift();
-var _2f=this.rootNode;
-function _30(){
-var _31=_2e.shift(),_32=dojo.isString(_31)?_31:this.model.getIdentity(_31);
-dojo.some(this._itemNodesMap[_32],function(n){
-if(n.getParent()==_2f){
-_2f=n;
-return true;
-}
-return false;
-});
-if(_2e.length){
-this._expandNode(_2f).addCallback(dojo.hitch(this,_30));
-}else{
-this._selectNode(_2f);
-d.resolve(true);
-}
-};
-this._expandNode(_2f).addCallback(dojo.hitch(this,_30));
-}));
-return d;
-},_getPathAttr:function(){
-if(!this.selectedNode){
-return;
-}
-var res=[];
-var _33=this.selectedNode;
-while(_33&&_33!==this.rootNode){
-res.unshift(_33.item);
-_33=_33.getParent();
-}
-res.unshift(this.rootNode.item);
-return res;
-},mayHaveChildren:function(_34){
-},getItemChildren:function(_35,_36){
-},getLabel:function(_37){
-return this.model.getLabel(_37);
-},getIconClass:function(_38,_39){
-return (!_38||this.model.mayHaveChildren(_38))?(_39?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";
-},getLabelClass:function(_3a,_3b){
-},getRowClass:function(_3c,_3d){
-},getIconStyle:function(_3e,_3f){
-},getLabelStyle:function(_40,_41){
-},getRowStyle:function(_42,_43){
-},getTooltip:function(_44){
-return "";
-},_onKeyPress:function(e){
-if(e.altKey){
-return;
-}
-var dk=dojo.keys;
-var _45=dijit.getEnclosingWidget(e.target);
-if(!_45){
-return;
-}
-var key=e.charOrCode;
-if(typeof key=="string"){
-if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){
-this._onLetterKeyNav({node:_45,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[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:_45,item:_45.item,evt:e});
-dojo.stopEvent(e);
-}
-}
-},_onEnterKey:function(_46,evt){
-this._publish("execute",{item:_46.item,node:_46.node});
-this._selectNode(_46.node);
-this.onClick(_46.item,_46.node,evt);
-},_onDownArrow:function(_47){
-var _48=this._getNextNode(_47.node);
-if(_48&&_48.isTreeNode){
-this.focusNode(_48);
-}
-},_onUpArrow:function(_49){
-var _4a=_49.node;
-var _4b=_4a.getPreviousSibling();
-if(_4b){
-_4a=_4b;
-while(_4a.isExpandable&&_4a.isExpanded&&_4a.hasChildren()){
-var _4c=_4a.getChildren();
-_4a=_4c[_4c.length-1];
-}
-}else{
-var _4d=_4a.getParent();
-if(!(!this.showRoot&&_4d===this.rootNode)){
-_4a=_4d;
-}
-}
-if(_4a&&_4a.isTreeNode){
-this.focusNode(_4a);
-}
-},_onRightArrow:function(_4e){
-var _4f=_4e.node;
-if(_4f.isExpandable&&!_4f.isExpanded){
-this._expandNode(_4f);
-}else{
-if(_4f.hasChildren()){
-_4f=_4f.getChildren()[0];
-if(_4f&&_4f.isTreeNode){
-this.focusNode(_4f);
-}
-}
-}
-},_onLeftArrow:function(_50){
-var _51=_50.node;
-if(_51.isExpandable&&_51.isExpanded){
-this._collapseNode(_51);
-}else{
-var _52=_51.getParent();
-if(_52&&_52.isTreeNode&&!(!this.showRoot&&_52===this.rootNode)){
-this.focusNode(_52);
-}
-}
-},_onHomeKey:function(){
-var _53=this._getRootOrFirstNode();
-if(_53){
-this.focusNode(_53);
-}
-},_onEndKey:function(_54){
-var _55=this.rootNode;
-while(_55.isExpanded){
-var c=_55.getChildren();
-_55=c[c.length-1];
-}
-if(_55&&_55.isTreeNode){
-this.focusNode(_55);
-}
-},multiCharSearchDuration:250,_onLetterKeyNav:function(_56){
-var cs=this._curSearch;
-if(cs){
-cs.pattern=cs.pattern+_56.key;
-clearTimeout(cs.timer);
-}else{
-cs=this._curSearch={pattern:_56.key,startNode:_56.node};
-}
-var _57=this;
-cs.timer=setTimeout(function(){
-delete _57._curSearch;
-},this.multiCharSearchDuration);
-var _58=cs.startNode;
-do{
-_58=this._getNextNode(_58);
-if(!_58){
-_58=this._getRootOrFirstNode();
-}
-}while(_58!==cs.startNode&&(_58.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));
-if(_58&&_58.isTreeNode){
-if(_58!==cs.startNode){
-this.focusNode(_58);
-}
-}
-},_onClick:function(_59,e){
-var _5a=e.target,_5b=(_5a==_59.expandoNode||_5a==_59.expandoNodeText);
-if((this.openOnClick&&_59.isExpandable)||_5b){
-if(_59.isExpandable){
-this._onExpandoClick({node:_59});
-}
-}else{
-this._publish("execute",{item:_59.item,node:_59,evt:e});
-this.onClick(_59.item,_59,e);
-this.focusNode(_59);
-}
-if(!_5b){
-this._selectNode(_59);
-}
-dojo.stopEvent(e);
-},_onDblClick:function(_5c,e){
-var _5d=e.target,_5e=(_5d==_5c.expandoNode||_5d==_5c.expandoNodeText);
-if((this.openOnDblClick&&_5c.isExpandable)||_5e){
-if(_5c.isExpandable){
-this._onExpandoClick({node:_5c});
-}
-}else{
-this._publish("execute",{item:_5c.item,node:_5c,evt:e});
-this.onDblClick(_5c.item,_5c,e);
-this.focusNode(_5c);
-}
-if(!_5e){
-this._selectNode(_5c);
-}
-dojo.stopEvent(e);
-},_onExpandoClick:function(_5f){
-var _60=_5f.node;
-this.focusNode(_60);
-if(_60.isExpanded){
-this._collapseNode(_60);
-}else{
-this._expandNode(_60);
-}
-},onClick:function(_61,_62,evt){
-},onDblClick:function(_63,_64,evt){
-},onOpen:function(_65,_66){
-},onClose:function(_67,_68){
-},_getNextNode:function(_69){
-if(_69.isExpandable&&_69.isExpanded&&_69.hasChildren()){
-return _69.getChildren()[0];
-}else{
-while(_69&&_69.isTreeNode){
-var _6a=_69.getNextSibling();
-if(_6a){
-return _6a;
-}
-_69=_69.getParent();
-}
-return null;
-}
-},_getRootOrFirstNode:function(){
-return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];
-},_collapseNode:function(_6b){
-if(_6b._expandNodeDeferred){
-delete _6b._expandNodeDeferred;
-}
-if(_6b.isExpandable){
-if(_6b.state=="LOADING"){
-return;
-}
-_6b.collapse();
-this.onClose(_6b.item,_6b);
-if(_6b.item){
-this._state(_6b.item,false);
-this._saveState();
-}
-}
-},_expandNode:function(_6c,_6d){
-if(_6c._expandNodeDeferred&&!_6d){
-return _6c._expandNodeDeferred;
-}
-var _6e=this.model,_6f=_6c.item,_70=this;
-switch(_6c.state){
-case "UNCHECKED":
-_6c.markProcessing();
-var def=(_6c._expandNodeDeferred=new dojo.Deferred());
-_6e.getChildren(_6f,function(_71){
-_6c.unmarkProcessing();
-var _72=_6c.setChildItems(_71);
-var ed=_70._expandNode(_6c,true);
-_72.addCallback(function(){
-ed.addCallback(function(){
-def.callback();
-});
-});
-},function(err){
-console.error(_70,": error loading root children: ",err);
-});
-break;
-default:
-def=(_6c._expandNodeDeferred=_6c.expand());
-this.onOpen(_6c.item,_6c);
-if(_6f){
-this._state(_6f,true);
-this._saveState();
-}
-}
-return def;
-},focusNode:function(_73){
-dijit.focus(_73.labelNode);
-},_selectNode:function(_74){
-if(this.selectedNode&&!this.selectedNode._destroyed){
-this.selectedNode.setSelected(false);
-}
-if(_74){
-_74.setSelected(true);
-}
-this.selectedNode=_74;
-},_onNodeFocus:function(_75){
-if(_75&&_75!=this.lastFocused){
-if(this.lastFocused&&!this.lastFocused._destroyed){
-this.lastFocused.setFocusable(false);
-}
-_75.setFocusable(true);
-this.lastFocused=_75;
-}
-},_onNodeMouseEnter:function(_76){
-},_onNodeMouseLeave:function(_77){
-},_onItemChange:function(_78){
-var _79=this.model,_7a=_79.getIdentity(_78),_7b=this._itemNodesMap[_7a];
-if(_7b){
-var _7c=this.getLabel(_78),_7d=this.getTooltip(_78);
-dojo.forEach(_7b,function(_7e){
-_7e.set({item:_78,label:_7c,tooltip:_7d});
-_7e._updateItemClasses(_78);
-});
-}
-},_onItemChildrenChange:function(_7f,_80){
-var _81=this.model,_82=_81.getIdentity(_7f),_83=this._itemNodesMap[_82];
-if(_83){
-dojo.forEach(_83,function(_84){
-_84.setChildItems(_80);
-});
-}
-},_onItemDelete:function(_85){
-var _86=this.model,_87=_86.getIdentity(_85),_88=this._itemNodesMap[_87];
-if(_88){
-dojo.forEach(_88,function(_89){
-var _8a=_89.getParent();
-if(_8a){
-_8a.removeChild(_89);
-}
-_89.destroyRecursive();
-});
-delete this._itemNodesMap[_87];
-}
-},_initState:function(){
-if(this.persist){
-var _8b=dojo.cookie(this.cookieName);
-this._openedItemIds={};
-if(_8b){
-dojo.forEach(_8b.split(","),function(_8c){
-this._openedItemIds[_8c]=true;
-},this);
-}
-}
-},_state:function(_8d,_8e){
-if(!this.persist){
-return false;
-}
-var id=this.model.getIdentity(_8d);
-if(arguments.length===1){
-return this._openedItemIds[id];
-}
-if(_8e){
-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(_8f){
-if(_8f){
-dojo.marginBox(this.domNode,_8f);
-dojo.style(this.domNode,"overflow","auto");
-}
-this._nodePixelIndent=dojo.marginBox(this.tree.indentDetector).w;
-if(this.tree.rootNode){
-this.tree.rootNode.set("indent",this.showRoot?0:-1);
-}
-},_createTreeNode:function(_90){
-return new dijit._TreeNode(_90);
-}});
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
+
}
diff --git a/lib/dijit/_Calendar.js b/lib/dijit/_Calendar.js
index f9bb23918..b159d6ed9 100644
--- a/lib/dijit/_Calendar.js
+++ b/lib/dijit/_Calendar.js
@@ -1,14 +1,20 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._Calendar"]=true;
+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=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;
+
}
diff --git a/lib/dijit/_Contained.js b/lib/dijit/_Contained.js
index 50d9dc559..fcefca1f8 100644
--- a/lib/dijit/_Contained.js
+++ b/lib/dijit/_Contained.js
@@ -1,31 +1,76 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._Contained"]=true;
+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,{getParent:function(){
-var _1=dijit.getEnclosingWidget(this.domNode.parentNode);
-return _1&&_1.isContainer?_1:null;
-},_getSibling:function(_2){
-var _3=this.domNode;
-do{
-_3=_3[_2+"Sibling"];
-}while(_3&&_3.nodeType!=1);
-return _3&&dijit.byNode(_3);
-},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);
-}});
+
+
+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
+ }
+ }
+ );
+
}
diff --git a/lib/dijit/_Container.js b/lib/dijit/_Container.js
index ce8232cb3..23962688f 100644
--- a/lib/dijit/_Container.js
+++ b/lib/dijit/_Container.js
@@ -1,62 +1,144 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._Container"]=true;
+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,{isContainer:true,buildRendering:function(){
-this.inherited(arguments);
-if(!this.containerNode){
-this.containerNode=this.domNode;
-}
-},addChild:function(_1,_2){
-var _3=this.containerNode;
-if(_2&&typeof _2=="number"){
-var _4=this.getChildren();
-if(_4&&_4.length>=_2){
-_3=_4[_2-1].domNode;
-_2="after";
-}
-}
-dojo.place(_1.domNode,_3,_2);
-if(this._started&&!_1._started){
-_1.startup();
-}
-},removeChild:function(_5){
-if(typeof _5=="number"&&_5>0){
-_5=this.getChildren()[_5];
-}
-if(_5){
-var _6=_5.domNode;
-if(_6&&_6.parentNode){
-_6.parentNode.removeChild(_6);
-}
-}
-},hasChildren:function(){
-return this.getChildren().length>0;
-},destroyDescendants:function(_7){
-dojo.forEach(this.getChildren(),function(_8){
-_8.destroyRecursive(_7);
-});
-},_getSiblingOfChild:function(_9,_a){
-var _b=_9.domNode,_c=(_a>0?"nextSibling":"previousSibling");
-do{
-_b=_b[_c];
-}while(_b&&(_b.nodeType!=1||!dijit.byNode(_b)));
-return _b&&dijit.byNode(_b);
-},getIndexOfChild:function(_d){
-return dojo.indexOf(this.getChildren(),_d);
-},startup:function(){
-if(this._started){
-return;
-}
-dojo.forEach(this.getChildren(),function(_e){
-_e.startup();
-});
-this.inherited(arguments);
-}});
+
+
+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);
+ }
+ }
+);
+
}
diff --git a/lib/dijit/_CssStateMixin.js b/lib/dijit/_CssStateMixin.js
index 53144804f..2fdecdcdf 100644
--- a/lib/dijit/_CssStateMixin.js
+++ b/lib/dijit/_CssStateMixin.js
@@ -1,149 +1,264 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._CssStateMixin"]=true;
+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",[],{cssStateNodes:{},postCreate:function(){
-this.inherited(arguments);
-dojo.forEach(["onmouseenter","onmouseleave","onmousedown"],function(e){
-this.connect(this.domNode,e,"_cssMouseEvent");
-},this);
-this.connect(this,"set",function(_1,_2){
-if(arguments.length>=2&&{disabled:true,readOnly:true,checked:true,selected:true}[_1]){
-this._setStateClass();
-}
-});
-dojo.forEach(["_onFocus","_onBlur"],function(ap){
-this.connect(this,ap,"_setStateClass");
-},this);
-for(var ap in this.cssStateNodes){
-this._trackMouseState(this[ap],this.cssStateNodes[ap]);
-}
-this._setStateClass();
-},_cssMouseEvent:function(_3){
-if(!this.disabled){
-switch(_3.type){
-case "mouseenter":
-case "mouseover":
-this._hovering=true;
-this._active=this._mouseDown;
-break;
-case "mouseleave":
-case "mouseout":
-this._hovering=false;
-this._active=false;
-break;
-case "mousedown":
-this._active=true;
-this._mouseDown=true;
-var _4=this.connect(dojo.body(),"onmouseup",function(){
-this._active=false;
-this._mouseDown=false;
-this._setStateClass();
-this.disconnect(_4);
-});
-break;
-}
-this._setStateClass();
-}
-},_setStateClass:function(){
-var _5=this.baseClass.split(" ");
-function _6(_7){
-_5=_5.concat(dojo.map(_5,function(c){
-return c+_7;
-}),"dijit"+_7);
-};
-if(!this.isLeftToRight()){
-_6("Rtl");
-}
-if(this.checked){
-_6("Checked");
-}
-if(this.state){
-_6(this.state);
-}
-if(this.selected){
-_6("Selected");
-}
-if(this.disabled){
-_6("Disabled");
-}else{
-if(this.readOnly){
-_6("ReadOnly");
-}else{
-if(this._active){
-_6("Active");
-}else{
-if(this._hovering){
-_6("Hover");
-}
-}
-}
-}
-if(this._focused){
-_6("Focused");
-}
-var tn=this.stateNode||this.domNode,_8={};
-dojo.forEach(tn.className.split(" "),function(c){
-_8[c]=true;
-});
-if("_stateClasses" in this){
-dojo.forEach(this._stateClasses,function(c){
-delete _8[c];
-});
-}
-dojo.forEach(_5,function(c){
-_8[c]=true;
-});
-var _9=[];
-for(var c in _8){
-_9.push(c);
-}
-tn.className=_9.join(" ");
-this._stateClasses=_5;
-},_trackMouseState:function(_a,_b){
-var _c=false,_d=false,_e=false;
-var _f=this,cn=dojo.hitch(this,"connect",_a);
-function _10(){
-var _11=("disabled" in _f&&_f.disabled)||("readonly" in _f&&_f.readonly);
-dojo.toggleClass(_a,_b+"Hover",_c&&!_d&&!_11);
-dojo.toggleClass(_a,_b+"Active",_d&&!_11);
-dojo.toggleClass(_a,_b+"Focused",_e&&!_11);
-};
-cn("onmouseenter",function(){
-_c=true;
-_10();
-});
-cn("onmouseleave",function(){
-_c=false;
-_d=false;
-_10();
-});
-cn("onmousedown",function(){
-_d=true;
-_10();
-});
-cn("onmouseup",function(){
-_d=false;
-_10();
-});
-cn("onfocus",function(){
-_e=true;
-_10();
-});
-cn("onblur",function(){
-_e=false;
-_10();
-});
-this.connect(this,"set",function(_12,_13){
-if(_12=="disabled"||_12=="readOnly"){
-_10();
-}
+
+
+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);
+ }
});
-}});
+
}
diff --git a/lib/dijit/_DialogMixin.js b/lib/dijit/_DialogMixin.js
index f67e8d04c..0c3024a8a 100644
--- a/lib/dijit/_DialogMixin.js
+++ b/lib/dijit/_DialogMixin.js
@@ -1,27 +1,80 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._DialogMixin"]=true;
+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,{attributeMap:dijit._Widget.prototype.attributeMap,execute:function(_1){
-},onCancel:function(){
-},onExecute:function(){
-},_onSubmit:function(){
-this.onExecute();
-this.execute(this.get("value"));
-},_getFocusItems:function(_2){
-var _3=dijit._getTabNavigable(dojo.byId(_2));
-this._firstFocusItem=_3.lowest||_3.first||_2;
-this._lastFocusItem=_3.last||_3.highest||this._firstFocusItem;
-if(dojo.isMoz&&this._firstFocusItem.tagName.toLowerCase()=="input"&&dojo.getNodeProp(this._firstFocusItem,"type").toLowerCase()=="file"){
-dojo.attr(_2,"tabIndex","0");
-this._firstFocusItem=_2;
-}
-}});
+
+
+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;
+ }
+ }
+);
+
}
diff --git a/lib/dijit/_HasDropDown.js b/lib/dijit/_HasDropDown.js
index 6606acb00..e1e9c1ca2 100644
--- a/lib/dijit/_HasDropDown.js
+++ b/lib/dijit/_HasDropDown.js
@@ -1,208 +1,443 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._HasDropDown"]=true;
+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._base.place");
dojo.require("dijit._Widget");
-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;
-}
-this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseUp");
-this.toggleDropDown();
-},_onDropDownMouseUp:function(e){
-if(e&&this._docHandler){
-this.disconnect(this._docHandler);
-}
-var _1=this.dropDown,_2=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&&!_2){
-if(dojo.hasClass(t,"dijitPopup")){
-_2=true;
-}else{
-t=t.parentNode;
-}
-}
-if(_2){
-t=e.target;
-if(_1.onItemClick){
-var _3;
-while(t&&!(_3=dijit.byNode(t))){
-t=t.parentNode;
-}
-if(_3&&_3.onClick&&_3.getParent){
-_3.getParent().onItemClick(_3,e);
-}
-}
-return;
-}
-}
-}
-if(this._opened&&_1.focus){
-window.setTimeout(dojo.hitch(_1,"focus"),1);
-}
-},_onDropDownClick:function(e){
-if(this._stopClickEvents){
-dojo.stopEvent(e);
-}
-},_setupDropdown:function(){
-this._buttonNode=this._buttonNode||this.focusNode||this.domNode;
-this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;
-this._aroundNode=this._aroundNode||this.domNode;
-this.connect(this._buttonNode,"onmousedown","_onDropDownMouseDown");
-this.connect(this._buttonNode,"onclick","_onDropDownClick");
-this.connect(this._buttonNode,"onkeydown","_onDropDownKeydown");
-this.connect(this._buttonNode,"onkeyup","_onKey");
-if(this._setStateClass){
-this.connect(this,"openDropDown","_setStateClass");
-this.connect(this,"closeDropDown","_setStateClass");
-}
-var _4={"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"+_4+"ArrowButton");
-},postCreate:function(){
-this._setupDropdown();
-this.inherited(arguments);
-},destroyDescendants:function(){
-if(this.dropDown){
-if(!this.dropDown._destroyed){
-this.dropDown.destroyRecursive();
-}
-delete this.dropDown;
-}
-this.inherited(arguments);
-},_onDropDownKeydown:function(e){
-if(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.keyCode==dojo.keys.SPACE){
-e.preventDefault();
-}
-},_onKey:function(e){
-if(this.disabled||this.readOnly){
-return;
-}
-var d=this.dropDown;
-if(d&&this._opened&&d.handleKey){
-if(d.handleKey(e)===false){
-return;
-}
-}
-if(d&&this._opened&&e.keyCode==dojo.keys.ESCAPE){
-this.toggleDropDown();
-}else{
-if(d&&!this._opened&&(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.keyCode==dojo.keys.SPACE)){
-this.toggleDropDown();
-if(d.focus){
-setTimeout(dojo.hitch(d,"focus"),1);
-}
-}
-}
-},_onBlur:function(){
-this.closeDropDown();
-this.inherited(arguments);
-},isLoaded:function(){
-return true;
-},loadDropDown:function(_5){
-_5();
-},toggleDropDown:function(){
-if(this.disabled||this.readOnly){
-return;
-}
-this.focus();
-var _6=this.dropDown;
-if(!_6){
-return;
-}
-if(!this._opened){
-if(!this.isLoaded()){
-this.loadDropDown(dojo.hitch(this,"openDropDown"));
-return;
-}else{
-this.openDropDown();
-}
-}else{
-this.closeDropDown();
-}
-},openDropDown:function(){
-var _7=this.dropDown;
-var _8=_7.domNode;
-var _9=this;
-if(!this._preparedNode){
-dijit.popup.moveOffScreen(_8);
-this._preparedNode=true;
-if(_8.style.width){
-this._explicitDDWidth=true;
-}
-if(_8.style.height){
-this._explicitDDHeight=true;
-}
-}
-if(this.maxHeight||this.forceWidth||this.autoWidth){
-var _a={display:"",visibility:"hidden"};
-if(!this._explicitDDWidth){
-_a.width="";
-}
-if(!this._explicitDDHeight){
-_a.height="";
-}
-dojo.style(_8,_a);
-var mb=dojo.marginBox(_8);
-var _b=(this.maxHeight&&mb.h>this.maxHeight);
-dojo.style(_8,{overflowX:"hidden",overflowY:_b?"auto":"hidden"});
-if(_b){
-mb.h=this.maxHeight;
-if("w" in mb){
-mb.w+=16;
-}
-}else{
-delete mb.h;
-}
-delete mb.t;
-delete mb.l;
-if(this.forceWidth){
-mb.w=this.domNode.offsetWidth;
-}else{
-if(this.autoWidth){
-mb.w=Math.max(mb.w,this.domNode.offsetWidth);
-}else{
-delete mb.w;
-}
-}
-if(dojo.isFunction(_7.resize)){
-_7.resize(mb);
-}else{
-dojo.marginBox(_8,mb);
-}
-}
-var _c=dijit.popup.open({parent:this,popup:_7,around:this._aroundNode,orient:dijit.getPopupAroundAlignment((this.dropDownPosition&&this.dropDownPosition.length)?this.dropDownPosition:["below"],this.isLeftToRight()),onExecute:function(){
-_9.closeDropDown(true);
-},onCancel:function(){
-_9.closeDropDown(true);
-},onClose:function(){
-dojo.attr(_9._popupStateNode,"popupActive",false);
-dojo.removeClass(_9._popupStateNode,"dijitHasDropDownOpen");
-_9._opened=false;
-_9.state="";
-}});
-dojo.attr(this._popupStateNode,"popupActive","true");
-dojo.addClass(_9._popupStateNode,"dijitHasDropDownOpen");
-this._opened=true;
-this.state="Opened";
-return _c;
-},closeDropDown:function(_d){
-if(this._opened){
-if(_d){
-this.focus();
-}
-dijit.popup.close(this.dropDown);
-this._opened=false;
-this.state="";
-}
-}});
+
+
+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;
+ }
+ }
+
+ }
+);
+
}
diff --git a/lib/dijit/_KeyNavContainer.js b/lib/dijit/_KeyNavContainer.js
index 839ba8319..aa1bcad4b 100644
--- a/lib/dijit/_KeyNavContainer.js
+++ b/lib/dijit/_KeyNavContainer.js
@@ -1,95 +1,261 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._KeyNavContainer"]=true;
+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,{tabIndex:"0",_keyNavCodes:{},connectKeyNavHandlers:function(_1,_2){
-var _3=(this._keyNavCodes={});
-var _4=dojo.hitch(this,this.focusPrev);
-var _5=dojo.hitch(this,this.focusNext);
-dojo.forEach(_1,function(_6){
-_3[_6]=_4;
-});
-dojo.forEach(_2,function(_7){
-_3[_7]=_5;
-});
-this.connect(this.domNode,"onkeypress","_onContainerKeypress");
-this.connect(this.domNode,"onfocus","_onContainerFocus");
-},startupKeyNavChildren:function(){
-dojo.forEach(this.getChildren(),dojo.hitch(this,"_startupChild"));
-},addChild:function(_8,_9){
-dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);
-this._startupChild(_8);
-},focus:function(){
-this.focusFirstChild();
-},focusFirstChild:function(){
-var _a=this._getFirstFocusableChild();
-if(_a){
-this.focusChild(_a);
-}
-},focusNext:function(){
-var _b=this._getNextFocusableChild(this.focusedChild,1);
-this.focusChild(_b);
-},focusPrev:function(){
-var _c=this._getNextFocusableChild(this.focusedChild,-1);
-this.focusChild(_c,true);
-},focusChild:function(_d,_e){
-if(this.focusedChild&&_d!==this.focusedChild){
-this._onChildBlur(this.focusedChild);
-}
-_d.focus(_e?"end":"start");
-this.focusedChild=_d;
-},_startupChild:function(_f){
-_f.set("tabIndex","-1");
-this.connect(_f,"_onFocus",function(){
-_f.set("tabIndex",this.tabIndex);
-});
-this.connect(_f,"_onBlur",function(){
-_f.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 _10=this._keyNavCodes[evt.charOrCode];
-if(_10){
-_10();
-dojo.stopEvent(evt);
-}
-},_onChildBlur:function(_11){
-},_getFirstFocusableChild:function(){
-return this._getNextFocusableChild(null,1);
-},_getNextFocusableChild:function(_12,dir){
-if(_12){
-_12=this._getSiblingOfChild(_12,dir);
-}
-var _13=this.getChildren();
-for(var i=0;i<_13.length;i++){
-if(!_12){
-_12=_13[(dir>0)?0:(_13.length-1)];
-}
-if(_12.isFocusable()){
-return _12;
-}
-_12=this._getSiblingOfChild(_12,dir);
-}
-return null;
-}});
+
+
+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
+ }
+ }
+);
+
}
diff --git a/lib/dijit/_PaletteMixin.js b/lib/dijit/_PaletteMixin.js
index a12855d12..1511433eb 100644
--- a/lib/dijit/_PaletteMixin.js
+++ b/lib/dijit/_PaletteMixin.js
@@ -1,98 +1,326 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._PaletteMixin"]=true;
+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],{defaultTimeout:500,timeoutChangeRate:0.9,value:null,_selectedCell:-1,tabIndex:"0",cellClass:"dijitPaletteCell",dyeClass:"",_preparePalette:function(_1,_2){
-this._cells=[];
-var _3=this._blankGif;
-var _4=dojo.getObject(this.dyeClass);
-for(var _5=0;_5<_1.length;_5++){
-var _6=dojo.create("tr",{tabIndex:"-1"},this.gridNode);
-for(var _7=0;_7<_1[_5].length;_7++){
-var _8=_1[_5][_7];
-if(_8){
-var _9=new _4(_8);
-var _a=dojo.create("td",{"class":this.cellClass,tabIndex:"-1",title:_2[_8]});
-_9.fillCell(_a,_3);
-this.connect(_a,"ondijitclick","_onCellClick");
-this._trackMouseState(_a,this.cellClass);
-dojo.place(_a,_6);
-_a.index=this._cells.length;
-this._cells.push({node:_a,dye:_9});
-}
-}
-}
-this._xDim=_1[0].length;
-this._yDim=_1.length;
-var _b={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};
-for(var _c in _b){
-this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[_c],ctrlKey:false,altKey:false,shiftKey:false},this,function(){
-var _d=_b[_c];
-return function(_e){
-this._navigateByKey(_d,_e);
-};
-}(),this.timeoutChangeRate,this.defaultTimeout));
-}
-},postCreate:function(){
-this.inherited(arguments);
-this._setCurrent(this._cells[0].node);
-},focus:function(){
-dijit.focus(this._currentFocus);
-},_onCellClick:function(_f){
-var _10=_f.currentTarget,_11=this._getDye(_10).getValue();
-this._setCurrent(_10);
-setTimeout(dojo.hitch(this,function(){
-dijit.focus(_10);
-this._setValueAttr(_11,true);
-}));
-dojo.removeClass(_10,"dijitPaletteCellHover");
-dojo.stopEvent(_f);
-},_setCurrent:function(_12){
-if("_currentFocus" in this){
-dojo.attr(this._currentFocus,"tabIndex","-1");
-}
-this._currentFocus=_12;
-if(_12){
-dojo.attr(_12,"tabIndex",this.tabIndex);
-}
-},_setValueAttr:function(_13,_14){
-this.value=null;
-if(this._selectedCell>=0){
-dojo.removeClass(this._cells[this._selectedCell].node,"dijitPaletteCellSelected");
-}
-this._selectedCell=-1;
-if(_13){
-for(var i=0;i<this._cells.length;i++){
-if(_13==this._cells[i].dye.getValue()){
-this._selectedCell=i;
-this.value=_13;
-dojo.addClass(this._cells[i].node,"dijitPaletteCellSelected");
-if(_14||_14===undefined){
-this.onChange(_13);
-}
-break;
-}
-}
-}
-},onChange:function(_15){
-},_navigateByKey:function(_16,_17){
-if(_17==-1){
-return;
-}
-var _18=this._currentFocus.index+_16;
-if(_18<this._cells.length&&_18>-1){
-var _19=this._cells[_18].node;
-this._setCurrent(_19);
-setTimeout(dojo.hitch(dijit,"focus",_19),0);
-}
-},_getDye:function(_1a){
-return this._cells[_1a.index].dye;
-}});
+
+
+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
+ }
+ }
+);
+=====*/
+
}
diff --git a/lib/dijit/_Templated.js b/lib/dijit/_Templated.js
index 65ca20bfa..2e8d6b72f 100644
--- a/lib/dijit/_Templated.js
+++ b/lib/dijit/_Templated.js
@@ -1,184 +1,351 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._Templated"]=true;
+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,{templateString:null,templatePath:null,widgetsInTemplate:false,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){
-this._attachPoints=[];
-},_stringRepl:function(_1){
-var _2=this.declaredClass,_3=this;
-return dojo.string.substitute(_1,this,function(_4,_5){
-if(_5.charAt(0)=="!"){
-_4=dojo.getObject(_5.substr(1),false,_3);
-}
-if(typeof _4=="undefined"){
-throw new Error(_2+" template:"+_5);
-}
-if(_4==null){
-return "";
-}
-return _5.charAt(0)=="!"?_4:_4.toString().replace(/"/g,"&quot;");
-},this);
-},buildRendering:function(){
-var _6=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);
-var _7;
-if(dojo.isString(_6)){
-_7=dojo._toDom(this._stringRepl(_6));
-if(_7.nodeType!=1){
-throw new Error("Invalid template: "+_6);
-}
-}else{
-_7=_6.cloneNode(true);
-}
-this.domNode=_7;
-this._attachTemplateNodes(_7);
-if(this.widgetsInTemplate){
-var _8=dojo.parser,_9,_a;
-if(_8._query!="[dojoType]"){
-_9=_8._query;
-_a=_8._attrName;
-_8._query="[dojoType]";
-_8._attrName="dojoType";
-}
-var cw=(this._startupWidgets=dojo.parser.parse(_7,{noStart:!this._earlyTemplatedStartup,inherited:{dir:this.dir,lang:this.lang}}));
-if(_9){
-_8._query=_9;
-_8._attrName=_a;
-}
-this._supportingWidgets=dijit.findWidgets(_7);
-this._attachTemplateNodes(cw,function(n,p){
-return n[p];
-});
-}
-this._fillContent(this.srcNodeRef);
-},_fillContent:function(_b){
-var _c=this.containerNode;
-if(_b&&_c){
-while(_b.hasChildNodes()){
-_c.appendChild(_b.firstChild);
-}
-}
-},_attachTemplateNodes:function(_d,_e){
-_e=_e||function(n,p){
-return n.getAttribute(p);
-};
-var _f=dojo.isArray(_d)?_d:(_d.all||_d.getElementsByTagName("*"));
-var x=dojo.isArray(_d)?0:-1;
-for(;x<_f.length;x++){
-var _10=(x==-1)?_d:_f[x];
-if(this.widgetsInTemplate&&_e(_10,"dojoType")){
-continue;
-}
-var _11=_e(_10,"dojoAttachPoint");
-if(_11){
-var _12,_13=_11.split(/\s*,\s*/);
-while((_12=_13.shift())){
-if(dojo.isArray(this[_12])){
-this[_12].push(_10);
-}else{
-this[_12]=_10;
-}
-this._attachPoints.push(_12);
-}
-}
-var _14=_e(_10,"dojoAttachEvent");
-if(_14){
-var _15,_16=_14.split(/\s*,\s*/);
-var _17=dojo.trim;
-while((_15=_16.shift())){
-if(_15){
-var _18=null;
-if(_15.indexOf(":")!=-1){
-var _19=_15.split(":");
-_15=_17(_19[0]);
-_18=_17(_19[1]);
-}else{
-_15=_17(_15);
-}
-if(!_18){
-_18=_15;
-}
-this.connect(_10,_15,_18);
-}
-}
-}
-var _1a=_e(_10,"waiRole");
-if(_1a){
-dijit.setWaiRole(_10,_1a);
-}
-var _1b=_e(_10,"waiState");
-if(_1b){
-dojo.forEach(_1b.split(/\s*,\s*/),function(_1c){
-if(_1c.indexOf("-")!=-1){
-var _1d=_1c.split("-");
-dijit.setWaiState(_10,_1d[0],_1d[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(_1e){
-delete this[_1e];
-},this);
-this._attachPoints=[];
-this.inherited(arguments);
-}});
-dijit._Templated._templateCache={};
-dijit._Templated.getCachedTemplate=function(_1f,_20,_21){
-var _22=dijit._Templated._templateCache;
-var key=_20||_1f;
-var _23=_22[key];
-if(_23){
-try{
-if(!_23.ownerDocument||_23.ownerDocument==dojo.doc){
-return _23;
-}
-}
-catch(e){
-}
-dojo.destroy(_23);
-}
-if(!_20){
-_20=dojo.cache(_1f,{sanitize:true});
-}
-_20=dojo.string.trim(_20);
-if(_21||_20.match(/\$\{([^\}]+)\}/g)){
-return (_22[key]=_20);
-}else{
-var _24=dojo._toDom(_20);
-if(_24.nodeType!=1){
-throw new Error("Invalid template: "+_20);
-}
-return (_22[key]=_24);
-}
+
+
+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 _25=dijit._Templated._templateCache;
-for(var key in _25){
-var _26=_25[key];
-if(typeof _26=="object"){
-dojo.destroy(_26);
-}
-delete _25[key];
+ 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:""
});
-}
-dojo.extend(dijit._Widget,{dojoAttachEvent:"",dojoAttachPoint:"",waiRole:"",waiState:""});
+
}
diff --git a/lib/dijit/_TimePicker.js b/lib/dijit/_TimePicker.js
index fc3ae29a8..678223c45 100644
--- a/lib/dijit/_TimePicker.js
+++ b/lib/dijit/_TimePicker.js
@@ -1,265 +1,481 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._TimePicker"]=true;
+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",[dijit._Widget,dijit._Templated],{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\" wairole=\"presentation\" 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\" wairole=\"presentation\" role=\"presentation\">&nbsp;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div></div\n></div>\n"),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:dojo.date.stamp.toISOString,_filterString:"",setValue:function(_1){
-dojo.deprecated("dijit._TimePicker:setValue() is deprecated. Use set('value', ...) instead.","","2.0");
-this.set("value",_1);
-},_setValueAttr:function(_2){
-this.value=_2;
-this._showText();
-},onOpen:function(_3){
-if(this._beenOpened&&this.domNode.parentNode){
-var p=dijit.byId(this.domNode.parentNode.dijitPopupParent);
-if(p){
-var _4=p.get("displayedValue");
-if(_4&&!p.parse(_4,p.constraints)){
-this._filterString=_4;
-}else{
-this._filterString="";
-}
-this._showText();
-}
-}
-this._beenOpened=true;
-},isDisabledDate:function(_5,_6){
-return false;
-},_getFilteredNodes:function(_7,_8,_9){
-var _a=[],n,i=_7,_b=this._maxIncrement+Math.abs(i),_c=_9?-1:1,_d=_9?1:0,_e=_9?0:1;
-do{
-i=i-_d;
-n=this._createOption(i);
-if(n){
-_a.push(n);
-}
-i=i+_e;
-}while(_a.length<_8&&(i*_c)<_b);
-if(_9){
-_a.reverse();
-}
-return _a;
-},_showText:function(){
-this.timeMenu.innerHTML="";
-var _f=dojo.date.stamp.fromISOString;
-this._clickableIncrementDate=_f(this.clickableIncrement);
-this._visibleIncrementDate=_f(this.visibleIncrement);
-this._visibleRangeDate=_f(this.visibleRange);
-var _10=function(_11){
-return _11.getHours()*60*60+_11.getMinutes()*60+_11.getSeconds();
-};
-var _12=_10(this._clickableIncrementDate);
-var _13=_10(this._visibleIncrementDate);
-var _14=_10(this._visibleRangeDate);
-var _15=this.value.getTime();
-this._refDate=new Date(_15-_15%(_13*1000));
-this._refDate.setFullYear(1970,0,1);
-this._clickableIncrement=1;
-this._totalIncrements=_14/_12;
-this._visibleIncrement=_13/_12;
-this._maxIncrement=(60*60*24)/_12;
-var _16=this._getFilteredNodes(0,this._totalIncrements>>1,true);
-var _17=this._getFilteredNodes(0,this._totalIncrements>>1,false);
-if(_16.length<this._totalIncrements>>1){
-_16=_16.slice(_16.length/2);
-_17=_17.slice(0,_17.length/2);
-}
-dojo.forEach(_16.concat(_17),function(n){
-this.timeMenu.appendChild(n);
-},this);
-},postCreate:function(){
-if(this.constraints===dijit._TimePicker.prototype.constraints){
-this.constraints={};
-}
-dojo.mixin(this,this.constraints);
-if(!this.constraints.locale){
-this.constraints.locale=this.lang;
-}
-this.connect(this.timeMenu,dojo.isIE?"onmousewheel":"DOMMouseScroll","_mouseWheeled");
-var _18=this;
-var _19=function(){
-_18._connects.push(dijit.typematic.addMouseListener.apply(null,arguments));
-};
-_19(this.upArrow,this,this._onArrowUp,1,50);
-_19(this.downArrow,this,this._onArrowDown,1,50);
-var _1a=function(cb){
-return function(cnt){
-if(cnt>0){
-cb.call(this,arguments);
-}
-};
-};
-var _1b=function(_1c,cb){
-return function(e){
-dojo.stopEvent(e);
-dijit.typematic.trigger(e,this,_1c,_1a(cb),_1c,1,50);
-};
-};
-this.connect(this.upArrow,"onmouseover",_1b(this.upArrow,this._onArrowUp));
-this.connect(this.downArrow,"onmouseover",_1b(this.downArrow,this._onArrowDown));
-this.inherited(arguments);
-},_buttonMouse:function(e){
-dojo.toggleClass(e.currentTarget,e.currentTarget==this.upArrow?"dijitUpArrowHover":"dijitDownArrowHover",e.type=="mouseenter"||e.type=="mouseover");
-},_createOption:function(_1d){
-var _1e=new Date(this._refDate);
-var _1f=this._clickableIncrementDate;
-_1e.setHours(_1e.getHours()+_1f.getHours()*_1d,_1e.getMinutes()+_1f.getMinutes()*_1d,_1e.getSeconds()+_1f.getSeconds()*_1d);
-if(this.constraints.selector=="time"){
-_1e.setFullYear(1970,0,1);
-}
-var _20=dojo.date.locale.format(_1e,this.constraints);
-if(this._filterString&&_20.toLowerCase().indexOf(this._filterString)!==0){
-return null;
-}
-var div=dojo.create("div",{"class":this.baseClass+"Item"});
-div.date=_1e;
-div.index=_1d;
-dojo.create("div",{"class":this.baseClass+"ItemInner",innerHTML:_20},div);
-if(_1d%this._visibleIncrement<1&&_1d%this._visibleIncrement>-1){
-dojo.addClass(div,this.baseClass+"Marker");
-}else{
-if(!(_1d%this._clickableIncrement)){
-dojo.addClass(div,this.baseClass+"Tick");
-}
-}
-if(this.isDisabledDate(_1e)){
-dojo.addClass(div,this.baseClass+"ItemDisabled");
-}
-if(!dojo.date.compare(this.value,_1e,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");
-}
-}
-return div;
-},_onOptionSelected:function(tgt){
-var _21=tgt.target.date||tgt.target.parentNode.date;
-if(!_21||this.isDisabledDate(_21)){
-return;
-}
-this._highlighted_option=null;
-this.set("value",_21);
-this.onValueSelected(_21);
-},onValueSelected:function(_22){
-},_highlightOption:function(_23,_24){
-if(!_23){
-return;
-}
-if(_24){
-if(this._highlighted_option){
-this._highlightOption(this._highlighted_option,false);
-}
-this._highlighted_option=_23;
-}else{
-if(this._highlighted_option!==_23){
-return;
-}else{
-this._highlighted_option=null;
-}
-}
-dojo.toggleClass(_23,this.baseClass+"ItemHover",_24);
-if(dojo.hasClass(_23,this.baseClass+"Marker")){
-dojo.toggleClass(_23,this.baseClass+"MarkerHover",_24);
-}else{
-dojo.toggleClass(_23,this.baseClass+"TickHover",_24);
-}
-},onmouseover:function(e){
-this._keyboardSelected=null;
-var tgr=(e.target.parentNode===this.timeMenu)?e.target:e.target.parentNode;
-if(!dojo.hasClass(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;
-dojo.stopEvent(e);
-var _25=(dojo.isIE?e.wheelDelta:-e.detail);
-this[(_25>0?"_onArrowUp":"_onArrowDown")]();
-},_onArrowUp:function(_26){
-if(typeof _26=="number"&&_26==-1){
-return;
-}
-if(!this.timeMenu.childNodes.length){
-return;
-}
-var _27=this.timeMenu.childNodes[0].index;
-var _28=this._getFilteredNodes(_27,1,true);
-if(_28.length){
-this.timeMenu.removeChild(this.timeMenu.childNodes[this.timeMenu.childNodes.length-1]);
-this.timeMenu.insertBefore(_28[0],this.timeMenu.childNodes[0]);
-}
-},_onArrowDown:function(_29){
-if(typeof _29=="number"&&_29==-1){
-return;
-}
-if(!this.timeMenu.childNodes.length){
-return;
-}
-var _2a=this.timeMenu.childNodes[this.timeMenu.childNodes.length-1].index+1;
-var _2b=this._getFilteredNodes(_2a,1,false);
-if(_2b.length){
-this.timeMenu.removeChild(this.timeMenu.childNodes[0]);
-this.timeMenu.appendChild(_2b[0]);
-}
-},handleKey:function(e){
-var dk=dojo.keys;
-if(e.keyChar||e.charOrCode===dk.BACKSPACE||e.charOrCode==dk.DELETE){
-setTimeout(dojo.hitch(this,function(){
-this._filterString=e.target.value.toLowerCase();
-this._showText();
-}),1);
-}else{
-if(e.charOrCode==dk.DOWN_ARROW||e.charOrCode==dk.UP_ARROW){
-dojo.stopEvent(e);
-if(this._highlighted_option&&!this._highlighted_option.parentNode){
-this._highlighted_option=null;
-}
-var _2c=this.timeMenu,tgt=this._highlighted_option||dojo.query("."+this.baseClass+"ItemSelected",_2c)[0];
-if(!tgt){
-tgt=_2c.childNodes[0];
-}else{
-if(_2c.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;
-}else{
-if(this._highlighted_option&&(e.charOrCode==dk.ENTER||e.charOrCode===dk.TAB)){
-if(!this._keyboardSelected&&e.charOrCode===dk.TAB){
-return;
-}
-if(e.charOrCode==dk.ENTER){
-dojo.stopEvent(e);
-}
-this._onOptionSelected({target:this._highlighted_option});
-}
-}
-}
-}});
+
+
+/*=====
+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;
+ }
+ }
+ }
+);
+
}
diff --git a/lib/dijit/_Widget.js b/lib/dijit/_Widget.js
index d4a2ce96a..f2f5afcf9 100644
--- a/lib/dijit/_Widget.js
+++ b/lib/dijit/_Widget.js
@@ -1,345 +1,492 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._Widget"]=true;
+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");
-dojo.connect(dojo,"_connect",function(_1,_2){
-if(_1&&dojo.isFunction(_1._onConnect)){
-_1._onConnect(_2);
-}
-});
-dijit._connectOnUseEventHandler=function(_3){
-};
-dijit._lastKeyDownNode=null;
+
+
+
+////////////////// 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 _4=function(_5){
-dijit._lastKeyDownNode=_5.srcElement;
-};
-dojo.doc.attachEvent("onkeydown",_4);
-dojo.addOnWindowUnload(function(){
-dojo.doc.detachEvent("onkeydown",_4);
-});
-})();
+ (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(_6){
-dijit._lastKeyDownNode=_6.target;
-},true);
+ dojo.doc.addEventListener('keydown', function(evt){
+ dijit._lastKeyDownNode = evt.target;
+ }, true);
}
+
(function(){
-var _7={},_8=function(_9){
-var dc=_9.declaredClass;
-if(!_7[dc]){
-var r=[],_a,_b=_9.constructor.prototype;
-for(var _c in _b){
-if(dojo.isFunction(_b[_c])&&(_a=_c.match(/^_set([a-zA-Z]*)Attr$/))&&_a[1]){
-r.push(_a[1].charAt(0).toLowerCase()+_a[1].substr(1));
-}
-}
-_7[dc]=r;
-}
-return _7[dc]||[];
-};
-dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_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,_blankGif:(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif")).toString(),postscript:function(_d,_e){
-this.create(_d,_e);
-},create:function(_f,_10){
-this.srcNodeRef=dojo.byId(_10);
-this._connects=[];
-this._subscribes=[];
-this._deferredConnects=dojo.clone(this._deferredConnects);
-for(var _11 in this.attributeMap){
-delete this._deferredConnects[_11];
-}
-for(_11 in this._deferredConnects){
-if(this[_11]!==dijit._connectOnUseEventHandler){
-delete this._deferredConnects[_11];
-}
-}
-if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){
-this.id=this.srcNodeRef.id;
-}
-if(_f){
-this.params=_f;
-dojo.mixin(this,_f);
-}
-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 _12=this.srcNodeRef;
-if(_12&&_12.parentNode){
-_12.parentNode.replaceChild(this.domNode,_12);
-}
-for(_11 in this.params){
-this._onConnect(_11);
-}
-}
-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 _13=function(_14,_15){
-if((_15.params&&_14 in _15.params)||_15[_14]){
-_15.set(_14,_15[_14]);
-}
-};
-for(var _16 in this.attributeMap){
-_13(_16,this);
-}
-dojo.forEach(_8(this),function(a){
-if(!(a in this.attributeMap)){
-_13(a,this);
-}
-},this);
-},postMixInProperties:function(){
-},buildRendering:function(){
-this.domNode=this.srcNodeRef||dojo.create("div");
-},postCreate:function(){
-if(this.baseClass){
-var _17=this.baseClass.split(" ");
-if(!this.isLeftToRight()){
-_17=_17.concat(dojo.map(_17,function(_18){
-return _18+"Rtl";
-}));
-}
-dojo.addClass(this.domNode,_17);
-}
-},startup:function(){
-this._started=true;
-},destroyRecursive:function(_19){
-this._beingDestroyed=true;
-this.destroyDescendants(_19);
-this.destroy(_19);
-},destroy:function(_1a){
-this._beingDestroyed=true;
-this.uninitialize();
-var d=dojo,dfe=d.forEach,dun=d.unsubscribe;
-dfe(this._connects,function(_1b){
-dfe(_1b,d.disconnect);
-});
-dfe(this._subscribes,function(_1c){
-dun(_1c);
-});
-dfe(this._supportingWidgets||[],function(w){
-if(w.destroyRecursive){
-w.destroyRecursive();
-}else{
-if(w.destroy){
-w.destroy();
-}
-}
-});
-this.destroyRendering(_1a);
-dijit.registry.remove(this.id);
-this._destroyed=true;
-},destroyRendering:function(_1d){
-if(this.bgIframe){
-this.bgIframe.destroy(_1d);
-delete this.bgIframe;
-}
-if(this.domNode){
-if(_1d){
-dojo.removeAttr(this.domNode,"widgetId");
-}else{
-dojo.destroy(this.domNode);
-}
-delete this.domNode;
-}
-if(this.srcNodeRef){
-if(!_1d){
-dojo.destroy(this.srcNodeRef);
-}
-delete this.srcNodeRef;
-}
-},destroyDescendants:function(_1e){
-dojo.forEach(this.getChildren(),function(_1f){
-if(_1f.destroyRecursive){
-_1f.destroyRecursive(_1e);
-}
+
+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
+ }
});
-},uninitialize:function(){
-return false;
-},onFocus:function(){
-},onBlur:function(){
-},_onFocus:function(e){
-this.onFocus();
-},_onBlur:function(){
-this.onBlur();
-},_onConnect:function(_20){
-if(_20 in this._deferredConnects){
-var _21=this[this._deferredConnects[_20]||"domNode"];
-this.connect(_21,_20.toLowerCase(),_20);
-delete this._deferredConnects[_20];
-}
-},_setClassAttr:function(_22){
-var _23=this[this.attributeMap["class"]||"domNode"];
-dojo.removeClass(_23,this["class"]);
-this["class"]=_22;
-dojo.addClass(_23,_22);
-},_setStyleAttr:function(_24){
-var _25=this[this.attributeMap.style||"domNode"];
-if(dojo.isObject(_24)){
-dojo.style(_25,_24);
-}else{
-if(_25.style.cssText){
-_25.style.cssText+="; "+_24;
-}else{
-_25.style.cssText=_24;
-}
-}
-this.style=_24;
-},setAttribute:function(_26,_27){
-dojo.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");
-this.set(_26,_27);
-},_attrToDom:function(_28,_29){
-var _2a=this.attributeMap[_28];
-dojo.forEach(dojo.isArray(_2a)?_2a:[_2a],function(_2b){
-var _2c=this[_2b.node||_2b||"domNode"];
-var _2d=_2b.type||"attribute";
-switch(_2d){
-case "attribute":
-if(dojo.isFunction(_29)){
-_29=dojo.hitch(this,_29);
-}
-var _2e=_2b.attribute?_2b.attribute:(/^on[A-Z][a-zA-Z]*$/.test(_28)?_28.toLowerCase():_28);
-dojo.attr(_2c,_2e,_29);
-break;
-case "innerText":
-_2c.innerHTML="";
-_2c.appendChild(dojo.doc.createTextNode(_29));
-break;
-case "innerHTML":
-_2c.innerHTML=_29;
-break;
-case "class":
-dojo.removeClass(_2c,this[_28]);
-dojo.addClass(_2c,_29);
-break;
-}
-},this);
-this[_28]=_29;
-},attr:function(_2f,_30){
-if(dojo.config.isDebug){
-var _31=arguments.callee._ach||(arguments.callee._ach={}),_32=(arguments.callee.caller||"unknown caller").toString();
-if(!_31[_32]){
-dojo.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_32,"","2.0");
-_31[_32]=true;
-}
-}
-var _33=arguments.length;
-if(_33>=2||typeof _2f==="object"){
-return this.set.apply(this,arguments);
-}else{
-return this.get(_2f);
-}
-},get:function(_34){
-var _35=this._getAttrNames(_34);
-return this[_35.g]?this[_35.g]():this[_34];
-},set:function(_36,_37){
-if(typeof _36==="object"){
-for(var x in _36){
-this.set(x,_36[x]);
-}
-return this;
-}
-var _38=this._getAttrNames(_36);
-if(this[_38.s]){
-var _39=this[_38.s].apply(this,Array.prototype.slice.call(arguments,1));
-}else{
-if(_36 in this.attributeMap){
-this._attrToDom(_36,_37);
-}
-var _3a=this[_36];
-this[_36]=_37;
-}
-return _39||this;
-},_attrPairNames:{},_getAttrNames:function(_3b){
-var apn=this._attrPairNames;
-if(apn[_3b]){
-return apn[_3b];
-}
-var uc=_3b.charAt(0).toUpperCase()+_3b.substr(1);
-return (apn[_3b]={n:_3b+"Node",s:"_set"+uc+"Attr",g:"_get"+uc+"Attr"});
-},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):[];
-},nodesWithKeyClick:["input","button"],connect:function(obj,_3c,_3d){
-var d=dojo,dc=d._connect,_3e=[];
-if(_3c=="ondijitclick"){
-if(dojo.indexOf(this.nodesWithKeyClick,obj.nodeName.toLowerCase())==-1){
-var m=d.hitch(this,_3d);
-_3e.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;
-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);
-}
-}));
-}
-_3c="onclick";
-}
-_3e.push(dc(obj,_3c,this,_3d));
-this._connects.push(_3e);
-return _3e;
-},disconnect:function(_3f){
-for(var i=0;i<this._connects.length;i++){
-if(this._connects[i]==_3f){
-dojo.forEach(_3f,dojo.disconnect);
-this._connects.splice(i,1);
-return;
-}
-}
-},subscribe:function(_40,_41){
-var d=dojo,_42=d.subscribe(_40,this,_41);
-this._subscribes.push(_42);
-return _42;
-},unsubscribe:function(_43){
-for(var i=0;i<this._subscribes.length;i++){
-if(this._subscribes[i]==_43){
-dojo.unsubscribe(_43);
-this._subscribes.splice(i,1);
-return;
-}
-}
-},isLeftToRight:function(){
-return this.dir?(this.dir=="ltr"):dojo._isBodyLtr();
-},isFocusable:function(){
-return this.focus&&(dojo.style(this.domNode,"display")!="none");
-},placeAt:function(_44,_45){
-if(_44.declaredClass&&_44.addChild){
-_44.addChild(this,_45);
-}else{
-dojo.place(this.domNode,_44,_45);
-}
-return this;
-},_onShow:function(){
-this.onShow();
-},onShow:function(){
-},onHide:function(){
-},onClose:function(){
-return true;
-}});
+
})();
+
}
diff --git a/lib/dijit/_WidgetBase.js b/lib/dijit/_WidgetBase.js
new file mode 100644
index 000000000..868ce6a91
--- /dev/null
+++ b/lib/dijit/_WidgetBase.js
@@ -0,0 +1,826 @@
+/*
+ Copyright (c) 2004-2011, The 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;
+ }
+});
+
+})();
+
+}
diff --git a/lib/dijit/_base.js b/lib/dijit/_base.js
index ad89055f8..3b1695c8b 100644
--- a/lib/dijit/_base.js
+++ b/lib/dijit/_base.js
@@ -1,12 +1,12 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base"]=true;
+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");
@@ -17,4 +17,7 @@ dojo.require("dijit._base.sniff");
dojo.require("dijit._base.typematic");
dojo.require("dijit._base.wai");
dojo.require("dijit._base.window");
+
+
+
}
diff --git a/lib/dijit/_base/focus.js b/lib/dijit/_base/focus.js
index 32be06aa7..55c5b682d 100644
--- a/lib/dijit/_base/focus.js
+++ b/lib/dijit/_base/focus.js
@@ -1,299 +1,530 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.focus"]=true;
+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");
-dojo.mixin(dijit,{_curFocus:null,_prevFocus:null,isCollapsed:function(){
-return dijit.getBookmark().isCollapsed;
-},getBookmark:function(){
-var bm,rg,tg,_1=dojo.doc.selection,cf=dijit._curFocus;
-if(dojo.global.getSelection){
-_1=dojo.global.getSelection();
-if(_1){
-if(_1.isCollapsed){
-tg=cf?cf.tagName:"";
-if(tg){
-tg=tg.toLowerCase();
-if(tg=="textarea"||(tg=="input"&&(!cf.type||cf.type.toLowerCase()=="text"))){
-_1={start:cf.selectionStart,end:cf.selectionEnd,node:cf,pRange:true};
-return {isCollapsed:(_1.end<=_1.start),mark:_1};
-}
-}
-bm={isCollapsed:true};
-}else{
-rg=_1.getRangeAt(0);
-bm={isCollapsed:false,mark:rg.cloneRange()};
-}
-}
-}else{
-if(_1){
-tg=cf?cf.tagName:"";
-tg=tg.toLowerCase();
-if(cf&&tg&&(tg=="button"||tg=="textarea"||tg=="input")){
-if(_1.type&&_1.type.toLowerCase()=="none"){
-return {isCollapsed:true,mark:null};
-}else{
-rg=_1.createRange();
-return {isCollapsed:rg.text&&rg.text.length?false:true,mark:{range:rg,pRange:true}};
-}
-}
-bm={};
-try{
-rg=_1.createRange();
-bm.isCollapsed=!(_1.type=="Text"?rg.htmlText.length:rg.length);
-}
-catch(e){
-bm.isCollapsed=true;
-return bm;
-}
-if(_1.type.toUpperCase()=="CONTROL"){
-if(rg.length){
-bm.mark=[];
-var i=0,_2=rg.length;
-while(i<_2){
-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(_3){
-var _4=dojo.doc,_5=_3.mark;
-if(_5){
-if(dojo.global.getSelection){
-var _6=dojo.global.getSelection();
-if(_6&&_6.removeAllRanges){
-if(_5.pRange){
-var r=_5;
-var n=r.node;
-n.selectionStart=r.start;
-n.selectionEnd=r.end;
-}else{
-_6.removeAllRanges();
-_6.addRange(_5);
-}
-}else{
-console.warn("No idea how to restore selection for this browser!");
-}
-}else{
-if(_4.selection&&_5){
-var rg;
-if(_5.pRange){
-rg=_5.range;
-}else{
-if(dojo.isArray(_5)){
-rg=_4.body.createControlRange();
-dojo.forEach(_5,function(n){
-rg.addElement(n);
+
+
+// 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]);
+ }
+ }
+ }
});
-}else{
-rg=_4.body.createTextRange();
-rg.moveToBookmark(_5);
-}
-}
-rg.select();
-}
-}
-}
-},getFocus:function(_7,_8){
-var _9=!dijit._curFocus||(_7&&dojo.isDescendant(dijit._curFocus,_7.domNode))?dijit._prevFocus:dijit._curFocus;
-return {node:_9,bookmark:(_9==dijit._curFocus)&&dojo.withGlobal(_8||dojo.global,dijit.getBookmark),openedForWindow:_8};
-},focus:function(_a){
-if(!_a){
-return;
-}
-var _b="node" in _a?_a.node:_a,_c=_a.bookmark,_d=_a.openedForWindow,_e=_c?_c.isCollapsed:false;
-if(_b){
-var _f=(_b.tagName.toLowerCase()=="iframe")?_b.contentWindow:_b;
-if(_f&&_f.focus){
-try{
-_f.focus();
-}
-catch(e){
-}
-}
-dijit._onFocusNode(_b);
-}
-if(_c&&dojo.withGlobal(_d||dojo.global,dijit.isCollapsed)&&!_e){
-if(_d){
-_d.focus();
-}
-try{
-dojo.withGlobal(_d||dojo.global,dijit.moveToBookmark,null,[_c]);
-}
-catch(e2){
-}
-}
-},_activeStack:[],registerIframe:function(_10){
-return dijit.registerWin(_10.contentWindow,_10);
-},unregisterIframe:function(_11){
-dijit.unregisterWin(_11);
-},registerWin:function(_12,_13){
-var _14=function(evt){
-dijit._justMouseDowned=true;
-setTimeout(function(){
-dijit._justMouseDowned=false;
-},0);
-if(dojo.isIE&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){
-return;
-}
-dijit._onTouchNode(_13||evt.target||evt.srcElement,"mouse");
-};
-var doc=dojo.isIE?_12.document.documentElement:_12.document;
-if(doc){
-if(dojo.isIE){
-doc.attachEvent("onmousedown",_14);
-var _15=function(evt){
-if(evt.srcElement.tagName.toLowerCase()!="#document"&&dijit.isTabNavigable(evt.srcElement)){
-dijit._onFocusNode(_13||evt.srcElement);
-}else{
-dijit._onTouchNode(_13||evt.srcElement);
-}
-};
-doc.attachEvent("onactivate",_15);
-var _16=function(evt){
-dijit._onBlurNode(_13||evt.srcElement);
-};
-doc.attachEvent("ondeactivate",_16);
-return function(){
-doc.detachEvent("onmousedown",_14);
-doc.detachEvent("onactivate",_15);
-doc.detachEvent("ondeactivate",_16);
-doc=null;
-};
-}else{
-doc.addEventListener("mousedown",_14,true);
-var _17=function(evt){
-dijit._onFocusNode(_13||evt.target);
-};
-doc.addEventListener("focus",_17,true);
-var _18=function(evt){
-dijit._onBlurNode(_13||evt.target);
-};
-doc.addEventListener("blur",_18,true);
-return function(){
-doc.removeEventListener("mousedown",_14,true);
-doc.removeEventListener("focus",_17,true);
-doc.removeEventListener("blur",_18,true);
-doc=null;
-};
-}
-}
-},unregisterWin:function(_19){
-_19&&_19();
-},_onBlurNode:function(_1a){
-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(_1b,by){
-if(dijit._clearActiveWidgetsTimer){
-clearTimeout(dijit._clearActiveWidgetsTimer);
-delete dijit._clearActiveWidgetsTimer;
-}
-var _1c=[];
-try{
-while(_1b){
-var _1d=dojo.attr(_1b,"dijitPopupParent");
-if(_1d){
-_1b=dijit.byId(_1d).domNode;
-}else{
-if(_1b.tagName&&_1b.tagName.toLowerCase()=="body"){
-if(_1b===dojo.body()){
-break;
-}
-_1b=dojo.window.get(_1b.ownerDocument).frameElement;
-}else{
-var id=_1b.getAttribute&&_1b.getAttribute("widgetId"),_1e=id&&dijit.byId(id);
-if(_1e&&!(by=="mouse"&&_1e.get("disabled"))){
-_1c.unshift(id);
-}
-_1b=_1b.parentNode;
-}
-}
-}
-}
-catch(e){
-}
-dijit._setStack(_1c,by);
-},_onFocusNode:function(_1f){
-if(!_1f){
-return;
-}
-if(_1f.nodeType==9){
-return;
-}
-dijit._onTouchNode(_1f);
-if(_1f==dijit._curFocus){
-return;
-}
-if(dijit._curFocus){
-dijit._prevFocus=dijit._curFocus;
-}
-dijit._curFocus=_1f;
-dojo.publish("focusNode",[_1f]);
-},_setStack:function(_20,by){
-var _21=dijit._activeStack;
-dijit._activeStack=_20;
-for(var _22=0;_22<Math.min(_21.length,_20.length);_22++){
-if(_21[_22]!=_20[_22]){
-break;
-}
-}
-var _23;
-for(var i=_21.length-1;i>=_22;i--){
-_23=dijit.byId(_21[i]);
-if(_23){
-_23._focused=false;
-_23._hasBeenBlurred=true;
-if(_23._onBlur){
-_23._onBlur(by);
-}
-dojo.publish("widgetBlur",[_23,by]);
-}
-}
-for(i=_22;i<_20.length;i++){
-_23=dijit.byId(_20[i]);
-if(_23){
-_23._focused=true;
-if(_23._onFocus){
-_23._onFocus(by);
-}
-dojo.publish("widgetFocus",[_23,by]);
-}
-}
-}});
+
+// register top window and all the iframes it contains
dojo.addOnLoad(function(){
-var _24=dijit.registerWin(window);
-if(dojo.isIE){
-dojo.addOnWindowUnload(function(){
-dijit.unregisterWin(_24);
-_24=null;
-});
-}
+ var handle = dijit.registerWin(window);
+ if(dojo.isIE){
+ dojo.addOnWindowUnload(function(){
+ dijit.unregisterWin(handle);
+ handle = null;
+ })
+ }
});
+
}
diff --git a/lib/dijit/_base/manager.js b/lib/dijit/_base/manager.js
index d8d1cf6d5..e5f745622 100644
--- a/lib/dijit/_base/manager.js
+++ b/lib/dijit/_base/manager.js
@@ -1,245 +1,493 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.manager"]=true;
+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,{constructor:function(){
-this._hash={};
-this.length=0;
-},add:function(_1){
-if(this._hash[_1.id]){
-throw new Error("Tried to register widget with id=="+_1.id+" but that id is already registered");
-}
-this._hash[_1.id]=_1;
-this.length++;
-},remove:function(id){
-if(this._hash[id]){
-delete this._hash[id];
-this.length--;
-}
-},forEach:function(_2,_3){
-_3=_3||dojo.global;
-var i=0,id;
-for(id in this._hash){
-_2.call(_3,this._hash[id],i++,this._hash);
-}
-return this;
-},filter:function(_4,_5){
-_5=_5||dojo.global;
-var _6=new dijit.WidgetSet(),i=0,id;
-for(id in this._hash){
-var w=this._hash[id];
-if(_4.call(_5,w,i++,this._hash)){
-_6.add(w);
-}
-}
-return _6;
-},byId:function(id){
-return this._hash[id];
-},byClass:function(_7){
-var _8=new dijit.WidgetSet(),id,_9;
-for(id in this._hash){
-_9=this._hash[id];
-if(_9.declaredClass==_7){
-_8.add(_9);
-}
-}
-return _8;
-},toArray:function(){
-var ar=[];
-for(var id in this._hash){
-ar.push(this._hash[id]);
-}
-return ar;
-},map:function(_a,_b){
-return dojo.map(this.toArray(),_a,_b);
-},every:function(_c,_d){
-_d=_d||dojo.global;
-var x=0,i;
-for(i in this._hash){
-if(!_c.call(_d,this._hash[i],x++,this._hash)){
-return false;
-}
-}
-return true;
-},some:function(_e,_f){
-_f=_f||dojo.global;
-var x=0,i;
-for(i in this._hash){
-if(_e.call(_f,this._hash[i],x++,this._hash)){
-return true;
-}
-}
-return false;
-}});
-(function(){
-dijit.registry=new dijit.WidgetSet();
-var _10=dijit.registry._hash,_11=dojo.attr,_12=dojo.hasAttr,_13=dojo.style;
-dijit.byId=function(id){
-return typeof id=="string"?_10[id]:id;
-};
-var _14={};
-dijit.getUniqueId=function(_15){
-var id;
-do{
-id=_15+"_"+(_15 in _14?++_14[_15]:_14[_15]=0);
-}while(_10[id]);
-return dijit._scopeName=="dijit"?id:dijit._scopeName+"_"+id;
-};
-dijit.findWidgets=function(_16){
-var _17=[];
-function _18(_19){
-for(var _1a=_19.firstChild;_1a;_1a=_1a.nextSibling){
-if(_1a.nodeType==1){
-var _1b=_1a.getAttribute("widgetId");
-if(_1b){
-_17.push(_10[_1b]);
-}else{
-_18(_1a);
-}
-}
-}
-};
-_18(_16);
-return _17;
-};
-dijit._destroyAll=function(){
-dijit._curFocus=null;
-dijit._prevFocus=null;
-dijit._activeStack=[];
-dojo.forEach(dijit.findWidgets(dojo.body()),function(_1c){
-if(!_1c._destroyed){
-if(_1c.destroyRecursive){
-_1c.destroyRecursive();
-}else{
-if(_1c.destroy){
-_1c.destroy();
-}
-}
-}
-});
-};
-if(dojo.isIE){
-dojo.addOnWindowUnload(function(){
-dijit._destroyAll();
-});
-}
-dijit.byNode=function(_1d){
-return _10[_1d.getAttribute("widgetId")];
-};
-dijit.getEnclosingWidget=function(_1e){
-while(_1e){
-var id=_1e.getAttribute&&_1e.getAttribute("widgetId");
-if(id){
-return _10[id];
-}
-_1e=_1e.parentNode;
-}
-return null;
-};
-var _1f=(dijit._isElementShown=function(_20){
-var s=_13(_20);
-return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_11(_20,"type")!="hidden");
-});
-dijit.hasDefaultTabStop=function(_21){
-switch(_21.nodeName.toLowerCase()){
-case "a":
-return _12(_21,"href");
-case "area":
-case "button":
-case "input":
-case "object":
-case "select":
-case "textarea":
-return true;
-case "iframe":
-if(dojo.isMoz){
-try{
-return _21.contentDocument.designMode=="on";
-}
-catch(err){
-return false;
-}
-}else{
-if(dojo.isWebKit){
-var doc=_21.contentDocument,_22=doc&&doc.body;
-return _22&&_22.contentEditable=="true";
-}else{
-try{
-doc=_21.contentWindow.document;
-_22=doc&&doc.body;
-return _22&&_22.firstChild&&_22.firstChild.contentEditable=="true";
-}
-catch(e){
-return false;
-}
-}
-}
-default:
-return _21.contentEditable=="true";
-}
-};
-var _23=(dijit.isTabNavigable=function(_24){
-if(_11(_24,"disabled")){
-return false;
-}else{
-if(_12(_24,"tabIndex")){
-return _11(_24,"tabIndex")>=0;
-}else{
-return dijit.hasDefaultTabStop(_24);
-}
-}
-});
-dijit._getTabNavigable=function(_25){
-var _26,_27,_28,_29,_2a,_2b;
-var _2c=function(_2d){
-dojo.query("> *",_2d).forEach(function(_2e){
-if((dojo.isIE&&_2e.scopeName!=="HTML")||!_1f(_2e)){
-return;
-}
-if(_23(_2e)){
-var _2f=_11(_2e,"tabIndex");
-if(!_12(_2e,"tabIndex")||_2f==0){
-if(!_26){
-_26=_2e;
-}
-_27=_2e;
-}else{
-if(_2f>0){
-if(!_28||_2f<_29){
-_29=_2f;
-_28=_2e;
-}
-if(!_2a||_2f>=_2b){
-_2b=_2f;
-_2a=_2e;
-}
-}
-}
-}
-if(_2e.nodeName.toUpperCase()!="SELECT"){
-_2c(_2e);
-}
+
+
+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
+ }
+
});
-};
-if(_1f(_25)){
-_2c(_25);
-}
-return {first:_26,last:_27,lowest:_28,highest:_2a};
-};
-dijit.getFirstInTabbingOrder=function(_30){
-var _31=dijit._getTabNavigable(dojo.byId(_30));
-return _31.lowest?_31.lowest:_31.first;
-};
-dijit.getLastInTabbingOrder=function(_32){
-var _33=dijit._getTabNavigable(dojo.byId(_32));
-return _33.last?_33.last:_33.highest;
-};
-dijit.defaultDuration=dojo.config["defaultDuration"]||200;
+
+(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;
+
})();
+
}
diff --git a/lib/dijit/_base/place.js b/lib/dijit/_base/place.js
index ddc38fd08..a098f2fa4 100644
--- a/lib/dijit/_base/place.js
+++ b/lib/dijit/_base/place.js
@@ -1,111 +1,376 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.place"]=true;
+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(){
-return dojo.window.getBox();
-};
-dijit.placeOnScreen=function(_1,_2,_3,_4){
-var _5=dojo.map(_3,function(_6){
-var c={corner:_6,pos:{x:_2.x,y:_2.y}};
-if(_4){
-c.pos.x+=_6.charAt(1)=="L"?_4.x:-_4.x;
-c.pos.y+=_6.charAt(0)=="T"?_4.y:-_4.y;
-}
-return c;
-});
-return dijit._place(_1,_5);
+
+
+dijit.getViewport = function(){
+ // summary:
+ // Returns the dimensions and scroll position of the viewable area of a browser window
+
+ return dojo.window.getBox();
};
-dijit._place=function(_7,_8,_9){
-var _a=dojo.window.getBox();
-if(!_7.parentNode||String(_7.parentNode.tagName).toLowerCase()!="body"){
-dojo.body().appendChild(_7);
-}
-var _b=null;
-dojo.some(_8,function(_c){
-var _d=_c.corner;
-var _e=_c.pos;
-if(_9){
-_9(_7,_c.aroundCorner,_d);
+
+/*=====
+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;
}
-var _f=_7.style;
-var _10=_f.display;
-var _11=_f.visibility;
-_f.visibility="hidden";
-_f.display="";
-var mb=dojo.marginBox(_7);
-_f.display=_10;
-_f.visibility=_11;
-var _12=Math.max(_a.l,_d.charAt(1)=="L"?_e.x:(_e.x-mb.w)),_13=Math.max(_a.t,_d.charAt(0)=="T"?_e.y:(_e.y-mb.h)),_14=Math.min(_a.l+_a.w,_d.charAt(1)=="L"?(_12+mb.w):_e.x),_15=Math.min(_a.t+_a.h,_d.charAt(0)=="T"?(_13+mb.h):_e.y),_16=_14-_12,_17=_15-_13,_18=(mb.w-_16)+(mb.h-_17);
-if(_b==null||_18<_b.overflow){
-_b={corner:_d,aroundCorner:_c.aroundCorner,x:_12,y:_13,w:_16,h:_17,overflow:_18};
+=====*/
+
+
+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);
}
-return !_18;
-});
-_7.style.left=_b.x+"px";
-_7.style.top=_b.y+"px";
-if(_b.overflow&&_9){
-_9(_7,_b.aroundCorner,_b.corner);
+
+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;
}
-return _b;
-};
-dijit.placeOnScreenAroundNode=function(_19,_1a,_1b,_1c){
-_1a=dojo.byId(_1a);
-var _1d=_1a.style.display;
-_1a.style.display="";
-var _1e=dojo.position(_1a,true);
-_1a.style.display=_1d;
-return dijit._placeOnScreenAroundRect(_19,_1e.x,_1e.y,_1e.w,_1e.h,_1b,_1c);
-};
-dijit.placeOnScreenAroundRectangle=function(_1f,_20,_21,_22){
-return dijit._placeOnScreenAroundRect(_1f,_20.x,_20.y,_20.width,_20.height,_21,_22);
+
+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._placeOnScreenAroundRect=function(_23,x,y,_24,_25,_26,_27){
-var _28=[];
-for(var _29 in _26){
-_28.push({aroundCorner:_29,corner:_26[_29],pos:{x:x+(_29.charAt(1)=="L"?0:_24),y:y+(_29.charAt(0)=="T"?0:_25)}});
+
+/*=====
+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;
}
-return dijit._place(_23,_28,_27);
+=====*/
+
+
+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(_2a,_2b,_2c,_2d){
-return dijit.placementRegistry.match.apply(dijit.placementRegistry,arguments);
+
+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(_2e,_2f){
-var _30={};
-dojo.forEach(_2e,function(pos){
-switch(pos){
-case "after":
-_30[_2f?"BR":"BL"]=_2f?"BL":"BR";
-break;
-case "before":
-_30[_2f?"BL":"BR"]=_2f?"BR":"BL";
-break;
-case "below":
-_30[_2f?"BL":"BR"]=_2f?"TL":"TR";
-_30[_2f?"BR":"BL"]=_2f?"TR":"TL";
-break;
-case "above":
-default:
-_30[_2f?"TL":"TR"]=_2f?"BL":"BR";
-_30[_2f?"TR":"TL"]=_2f?"BR":"BL";
-break;
-}
-});
-return _30;
+
+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;
};
+
}
diff --git a/lib/dijit/_base/popup.js b/lib/dijit/_base/popup.js
index aed046489..e6fa6a5ed 100644
--- a/lib/dijit/_base/popup.js
+++ b/lib/dijit/_base/popup.js
@@ -1,158 +1,405 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.popup"]=true;
+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={_stack:[],_beginZIndex:1000,_idGen:1,moveOffScreen:function(_1){
-var _2=_1.parentNode;
-if(!_2||!dojo.hasClass(_2,"dijitPopup")){
-_2=dojo.create("div",{"class":"dijitPopup",style:{visibility:"hidden",top:"-9999px"}},dojo.body());
-dijit.setWaiRole(_2,"presentation");
-_2.appendChild(_1);
-}
-var s=_1.style;
-s.display="";
-s.visibility="";
-s.position="";
-s.top="0px";
-dojo.style(_2,{visibility:"hidden",top:"-9999px"});
-},getTopPopup:function(){
-var _3=this._stack;
-for(var pi=_3.length-1;pi>0&&_3[pi].parent===_3[pi-1].widget;pi--){
-}
-return _3[pi];
-},open:function(_4){
-var _5=this._stack,_6=_4.popup,_7=_4.orient||((_4.parent?_4.parent.isLeftToRight():dojo._isBodyLtr())?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"}),_8=_4.around,id=(_4.around&&_4.around.id)?(_4.around.id+"_dropdown"):("popup_"+this._idGen++);
-var _9=_6.domNode.parentNode;
-if(!_9||!dojo.hasClass(_9,"dijitPopup")){
-this.moveOffScreen(_6.domNode);
-_9=_6.domNode.parentNode;
-}
-dojo.attr(_9,{id:id,style:{zIndex:this._beginZIndex+_5.length},"class":"dijitPopup "+(_6.baseClass||_6["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:_4.parent?_4.parent.id:""});
-if(dojo.isIE||dojo.isMoz){
-var _a=_9.childNodes[1];
-if(!_a){
-_a=new dijit.BackgroundIframe(_9);
-}
-}
-var _b=_8?dijit.placeOnScreenAroundElement(_9,_8,_7,_6.orient?dojo.hitch(_6,"orient"):null):dijit.placeOnScreen(_9,_4,_7=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_4.padding);
-_9.style.visibility="visible";
-_6.domNode.style.visibility="visible";
-var _c=[];
-_c.push(dojo.connect(_9,"onkeypress",this,function(_d){
-if(_d.charOrCode==dojo.keys.ESCAPE&&_4.onCancel){
-dojo.stopEvent(_d);
-_4.onCancel();
-}else{
-if(_d.charOrCode===dojo.keys.TAB){
-dojo.stopEvent(_d);
-var _e=this.getTopPopup();
-if(_e&&_e.onCancel){
-_e.onCancel();
-}
-}
-}
-}));
-if(_6.onCancel){
-_c.push(dojo.connect(_6,"onCancel",_4.onCancel));
-}
-_c.push(dojo.connect(_6,_6.onExecute?"onExecute":"onChange",this,function(){
-var _f=this.getTopPopup();
-if(_f&&_f.onExecute){
-_f.onExecute();
-}
-}));
-_5.push({wrapper:_9,iframe:_a,widget:_6,parent:_4.parent,onExecute:_4.onExecute,onCancel:_4.onCancel,onClose:_4.onClose,handlers:_c});
-if(_6.onOpen){
-_6.onOpen(_b);
-}
-return _b;
-},close:function(_10){
-var _11=this._stack;
-while(dojo.some(_11,function(_12){
-return _12.widget==_10;
-})){
-var top=_11.pop(),_13=top.wrapper,_14=top.iframe,_15=top.widget,_16=top.onClose;
-if(_15.onClose){
-_15.onClose();
-}
-dojo.forEach(top.handlers,dojo.disconnect);
-if(_15&&_15.domNode){
-this.moveOffScreen(_15.domNode);
-}else{
-dojo.destroy(_13);
-}
-if(_16){
-_16();
-}
-}
-}};
-dijit._frames=new function(){
-var _17=[];
-this.pop=function(){
-var _18;
-if(_17.length){
-_18=_17.pop();
-_18.style.display="";
-}else{
-if(dojo.isIE){
-var _19=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"")||"javascript:\"\"";
-var _1a="<iframe src='"+_19+"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";
-_18=dojo.doc.createElement(_1a);
-}else{
-_18=dojo.create("iframe");
-_18.src="javascript:\"\"";
-_18.className="dijitBackgroundIframe";
-dojo.style(_18,"opacity",0.1);
-}
-_18.tabIndex=-1;
-dijit.setWaiRole(_18,"presentation");
+
+
+/*=====
+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;
}
-return _18;
-};
-this.push=function(_1b){
-_1b.style.display="none";
-_17.push(_1b);
+=====*/
+
+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(_1c){
-if(!_1c.id){
-throw new Error("no id");
-}
-if(dojo.isIE||dojo.isMoz){
-var _1d=dijit._frames.pop();
-_1c.appendChild(_1d);
-if(dojo.isIE<7){
-this.resize(_1c);
-this._conn=dojo.connect(_1c,"onresize",this,function(){
-this.resize(_1c);
-});
-}else{
-dojo.style(_1d,{width:"100%",height:"100%"});
-}
-this.iframe=_1d;
-}
+
+
+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(_1e){
-if(this.iframe&&dojo.isIE<7){
-dojo.style(this.iframe,{width:_1e.offsetWidth+"px",height:_1e.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;
-}
-}});
+
+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;
+ }
+ }
+});
+
}
diff --git a/lib/dijit/_base/scroll.js b/lib/dijit/_base/scroll.js
index 623cea392..1010a4fca 100644
--- a/lib/dijit/_base/scroll.js
+++ b/lib/dijit/_base/scroll.js
@@ -1,15 +1,22 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.scroll"]=true;
+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(_1,_2){
-dojo.window.scrollIntoView(_1,_2);
+
+
+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);
};
+
}
diff --git a/lib/dijit/_base/sniff.js b/lib/dijit/_base/sniff.js
index bf5386cfb..c7c6b94d8 100644
--- a/lib/dijit/_base/sniff.js
+++ b/lib/dijit/_base/sniff.js
@@ -1,12 +1,21 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.sniff"]=true;
+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.
+
}
diff --git a/lib/dijit/_base/typematic.js b/lib/dijit/_base/typematic.js
index 460e9db1a..f424b71d5 100644
--- a/lib/dijit/_base/typematic.js
+++ b/lib/dijit/_base/typematic.js
@@ -1,87 +1,191 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.typematic"]=true;
+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={_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(_1,_2,_3,_4,_5,_6,_7,_8){
-if(_5!=this._obj){
-this.stop();
-this._initialDelay=_7||500;
-this._subsequentDelay=_6||0.9;
-this._minDelay=_8||10;
-this._obj=_5;
-this._evt=_1;
-this._node=_3;
-this._currentTimeout=-1;
-this._count=-1;
-this._callback=dojo.hitch(_2,_4);
-this._fireEventAndReload();
-this._evt=dojo.mixin({faux:true},_1);
-}
-},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(_9,_a,_b,_c,_d,_e,_f){
-if(_a.keyCode){
-_a.charOrCode=_a.keyCode;
-dojo.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");
-}else{
-if(_a.charCode){
-_a.charOrCode=String.fromCharCode(_a.charCode);
-dojo.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");
-}
-}
-return [dojo.connect(_9,"onkeypress",this,function(evt){
-if(evt.charOrCode==_a.charOrCode&&(_a.ctrlKey===undefined||_a.ctrlKey==evt.ctrlKey)&&(_a.altKey===undefined||_a.altKey==evt.altKey)&&(_a.metaKey===undefined||_a.metaKey==(evt.metaKey||false))&&(_a.shiftKey===undefined||_a.shiftKey==evt.shiftKey)){
-dojo.stopEvent(evt);
-dijit.typematic.trigger(evt,_b,_9,_c,_a,_d,_e,_f);
-}else{
-if(dijit.typematic._obj==_a){
-dijit.typematic.stop();
-}
-}
-}),dojo.connect(_9,"onkeyup",this,function(evt){
-if(dijit.typematic._obj==_a){
-dijit.typematic.stop();
-}
-})];
-},addMouseListener:function(_10,_11,_12,_13,_14,_15){
-var dc=dojo.connect;
-return [dc(_10,"mousedown",this,function(evt){
-dojo.stopEvent(evt);
-dijit.typematic.trigger(evt,_11,_10,_12,_10,_13,_14,_15);
-}),dc(_10,"mouseup",this,function(evt){
-dojo.stopEvent(evt);
-dijit.typematic.stop();
-}),dc(_10,"mouseout",this,function(evt){
-dojo.stopEvent(evt);
-dijit.typematic.stop();
-}),dc(_10,"mousemove",this,function(evt){
-evt.preventDefault();
-}),dc(_10,"dblclick",this,function(evt){
-dojo.stopEvent(evt);
-if(dojo.isIE){
-dijit.typematic.trigger(evt,_11,_10,_12,_10,_13,_14,_15);
-setTimeout(dojo.hitch(this,dijit.typematic.stop),50);
-}
-})];
-},addListener:function(_16,_17,_18,_19,_1a,_1b,_1c,_1d){
-return this.addKeyListener(_17,_18,_19,_1a,_1b,_1c,_1d).concat(this.addMouseListener(_16,_19,_1a,_1b,_1c,_1d));
-}};
+
+
+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));
+ }
+};
+
}
diff --git a/lib/dijit/_base/wai.js b/lib/dijit/_base/wai.js
index de67ad17a..58c9cdb8f 100644
--- a/lib/dijit/_base/wai.js
+++ b/lib/dijit/_base/wai.js
@@ -1,64 +1,145 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.wai"]=true;
+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(){
-var _1=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(_1);
-if(cs){
-var _2=cs.backgroundImage;
-var _3=(cs.borderTopColor==cs.borderRightColor)||(_2!=null&&(_2=="none"||_2=="url(invalid-url:)"));
-dojo[_3?"addClass":"removeClass"](dojo.body(),"dijit_a11y");
-if(dojo.isIE){
-_1.outerHTML="";
-}else{
-dojo.body().removeChild(_1);
-}
-}
-}};
-if(dojo.isIE||dojo.isMoz){
-dojo._loaders.unshift(dijit.wai.onload);
-}
-dojo.mixin(dijit,{_XhtmlRoles:/banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,hasWaiRole:function(_4,_5){
-var _6=this.getWaiRole(_4);
-return _5?(_6.indexOf(_5)>-1):(_6.length>0);
-},getWaiRole:function(_7){
-return dojo.trim((dojo.attr(_7,"role")||"").replace(this._XhtmlRoles,"").replace("wairole:",""));
-},setWaiRole:function(_8,_9){
-var _a=dojo.attr(_8,"role")||"";
-if(!this._XhtmlRoles.test(_a)){
-dojo.attr(_8,"role",_9);
-}else{
-if((" "+_a+" ").indexOf(" "+_9+" ")<0){
-var _b=dojo.trim(_a.replace(this._XhtmlRoles,""));
-var _c=dojo.trim(_a.replace(_b,""));
-dojo.attr(_8,"role",_c+(_c?" ":"")+_9);
-}
-}
-},removeWaiRole:function(_d,_e){
-var _f=dojo.attr(_d,"role");
-if(!_f){
-return;
-}
-if(_e){
-var t=dojo.trim((" "+_f+" ").replace(" "+_e+" "," "));
-dojo.attr(_d,"role",t);
-}else{
-_d.removeAttribute("role");
+
+
+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);
}
-},hasWaiState:function(_10,_11){
-return _10.hasAttribute?_10.hasAttribute("aria-"+_11):!!_10.getAttribute("aria-"+_11);
-},getWaiState:function(_12,_13){
-return _12.getAttribute("aria-"+_13)||"";
-},setWaiState:function(_14,_15,_16){
-_14.setAttribute("aria-"+_15,_16);
-},removeWaiState:function(_17,_18){
-_17.removeAttribute("aria-"+_18);
-}});
+
+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);
+ }
+});
+
}
diff --git a/lib/dijit/_base/window.js b/lib/dijit/_base/window.js
index 57a691436..713455b90 100644
--- a/lib/dijit/_base/window.js
+++ b/lib/dijit/_base/window.js
@@ -1,15 +1,18 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._base.window"]=true;
+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(_1){
-return dojo.window.get(_1);
+
+
+dijit.getDocumentWindow = function(doc){
+ return dojo.window.get(doc);
};
+
}
diff --git a/lib/dijit/_editor/RichText.js b/lib/dijit/_editor/RichText.js
index 696715986..978371557 100644
--- a/lib/dijit/_editor/RichText.js
+++ b/lib/dijit/_editor/RichText.js
@@ -1,1046 +1,2096 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.RichText"]=true;
+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");
-if(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"]){
-if(dojo._postLoad){
-(function(){
-var _1=dojo.doc.createElement("textarea");
-_1.id=dijit._scopeName+"._editor.RichText.savedContent";
-dojo.style(_1,{display:"none",position:"absolute",top:"-100px",height:"3px",width:"3px"});
-dojo.body().appendChild(_1);
-})();
-}else{
-try{
-dojo.doc.write("<textarea id=\""+dijit._scopeName+"._editor.RichText.savedContent\" "+"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(_2){
-this.contentPreFilters=[];
-this.contentPostFilters=[];
-this.contentDomPreFilters=[];
-this.contentDomPostFilters=[];
-this.editingAreaStyleSheets=[];
-this.events=[].concat(this.events);
-this._keyHandlers={};
-this.contentPreFilters.push(dojo.hitch(this,"_preFixUrlAttributes"));
-if(dojo.isMoz){
-this.contentPreFilters.push(this._normalizeFontStyle);
-this.contentPostFilters.push(this._removeMozBogus);
-}
-if(dojo.isWebKit){
-this.contentPreFilters.push(this._removeWebkitBogus);
-this.contentPostFilters.push(this._removeWebkitBogus);
-}
-if(dojo.isIE){
-this.contentPostFilters.push(this._normalizeFontStyle);
-}
-if(_2&&dojo.isString(_2.value)){
-this.value=_2.value;
-}
-this.onLoadDeferred=new dojo.Deferred();
-},baseClass:"dijitEditor",inheritWidth:false,focusOnLoad:false,name:"",styleSheets:"",_content:"",height:"300px",minHeight:"1em",isClosed:true,isLoaded:false,_SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@",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.inherited(arguments);
-dojo.publish(dijit._scopeName+"._editor.RichText::init",[this]);
-this.open();
-this.setupDefaultShortcuts();
-},setupDefaultShortcuts:function(){
-var _3=dojo.hitch(this,function(_4,_5){
-return function(){
-return !this.execCommand(_4,_5);
-};
-});
-var _6={b:_3("bold"),i:_3("italic"),u:_3("underline"),a:_3("selectall"),s:function(){
-this.save(true);
-},m:function(){
-this.isTabIndent=!this.isTabIndent;
-},"1":_3("formatblock","h1"),"2":_3("formatblock","h2"),"3":_3("formatblock","h3"),"4":_3("formatblock","h4"),"\\":_3("insertunorderedlist")};
-if(!dojo.isIE){
-_6.Z=_3("redo");
-}
-for(var _7 in _6){
-this.addKeyHandler(_7,true,false,_6[_7]);
-}
-},events:["onKeyPress","onKeyDown","onKeyUp","onClick"],captureEvents:[],_editorCommandsLocalized:false,_localizeEditorCommands:function(){
-if(this._editorCommandsLocalized){
-return;
-}
-this._editorCommandsLocalized=true;
-var _8=["div","p","pre","h1","h2","h3","h4","h5","h6","ol","ul","address"];
-var _9="",_a,i=0;
-while((_a=_8[i++])){
-if(_a.charAt(1)!="l"){
-_9+="<"+_a+"><span>content</span></"+_a+"><br/>";
-}else{
-_9+="<"+_a+"><li>content</li></"+_a+"><br/>";
-}
-}
-var _b=dojo.doc.createElement("div");
-dojo.style(_b,{position:"absolute",top:"-2000px"});
-dojo.doc.body.appendChild(_b);
-_b.innerHTML=_9;
-var _c=_b.firstChild;
-while(_c){
-dijit._editor.selection.selectElement(_c.firstChild);
-dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[_c.firstChild]);
-var _d=_c.tagName.toLowerCase();
-this._local2NativeFormatNames[_d]=document.queryCommandValue("formatblock");
-this._native2LocalFormatNames[this._local2NativeFormatNames[_d]]=_d;
-_c=_c.nextSibling.nextSibling;
-}
-dojo.body().removeChild(_b);
-},open:function(_e){
-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]);
-this._content="";
-if(arguments.length==1&&_e.nodeName){
-this.domNode=_e;
-}
-var dn=this.domNode;
-var _f;
-if(dojo.isString(this.value)){
-_f=this.value;
-delete this.value;
-dn.innerHTML="";
-}else{
-if(dn.nodeName&&dn.nodeName.toLowerCase()=="textarea"){
-var ta=(this.textarea=dn);
-this.name=ta.name;
-_f=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 _10=dojo.hitch(this,function(){
-dojo.style(ta,{display:"block",position:"absolute",top:"-1000px"});
-if(dojo.isIE){
-var s=ta.style;
-this.__overflow=s.overflow;
-s.overflow="hidden";
-}
-});
-if(dojo.isIE){
-setTimeout(_10,10);
-}else{
-_10();
-}
-if(ta.form){
-dojo.connect(ta.form,"onsubmit",this,function(){
-ta.value=this.getValue();
-});
-}
-}else{
-_f=dijit._editor.getChildrenHtml(dn);
-dn.innerHTML="";
-}
-}
-var _11=dojo.contentBox(dn);
-this._oldHeight=_11.h;
-this._oldWidth=_11.w;
-this.savedContent=_f;
-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!==""&&(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"])){
-var _12=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");
-if(_12.value!==""){
-var _13=_12.value.split(this._SEPARATOR),i=0,dat;
-while((dat=_13[i++])){
-var _14=dat.split(":");
-if(_14[0]==this.name){
-_f=_14[1];
-_13.splice(i,1);
-break;
-}
-}
-}
-dojo.addOnUnload(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){
-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();
-}
-this.onLoad(_f);
-});
-var s="javascript:parent."+dijit._scopeName+".byId(\""+this.id+"\")._iframeSrc";
-ifr.setAttribute("src",s);
-this.editingArea.appendChild(ifr);
-if(dn.nodeName=="LI"){
-dn.lastChild.style.marginTop="-1.2em";
-}
-dojo.addClass(this.domNode,this.baseClass);
-},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_getIframeDocTxt:function(){
-var _15=dojo.getComputedStyle(this.domNode);
-var _16="";
-var _17=true;
-if(dojo.isIE||(!this.height&&!dojo.isMoz)){
-_16="<div id='dijitEditorBody'></div>";
-_17=false;
-}else{
-if(dojo.isMoz){
-this._cursorToStart=true;
-_16="&nbsp;";
-}
-}
-var _18=[_15.fontWeight,_15.fontSize,_15.fontFamily].join(" ");
-var _19=_15.lineHeight;
-if(_19.indexOf("px")>=0){
-_19=parseFloat(_19)/parseFloat(_15.fontSize);
-}else{
-if(_19.indexOf("em")>=0){
-_19=parseFloat(_19);
-}else{
-_19="normal";
-}
-}
-var _1a="";
-var _1b=this;
-this.style.replace(/(^|;)\s*(line-|font-?)[^;]+/ig,function(_1c){
-_1c=_1c.replace(/^;/ig,"")+";";
-var s=_1c.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(_1b.domNode,sC,"");
-}
-_1a+=_1c+";";
-});
-var _1d=dojo.query("label[for=\""+this.id+"\"]");
-return [this.isLeftToRight()?"<html>\n<head>\n":"<html dir='rtl'>\n<head>\n",(dojo.isMoz&&_1d.length?"<title>"+_1d[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",((dojo.isWebKit)?"\t\twidth: 100%;\n":""),((dojo.isWebKit)?"\t\theight: 100%;\n":""),"\t}\n","\tbody{\n","\t\ttop:0px;\n","\t\tleft:0px;\n","\t\tright:0px;\n","\t\tfont:",_18,";\n",((this.height||dojo.isOpera)?"":"\t\tposition: fixed;\n"),"\t\tmin-height:",this.minHeight,";\n","\t\tline-height:",_19,";\n","\t}\n","\tp{ margin: 1em 0; }\n",(!_17&&!this.height?"\tbody,html {overflow-y: hidden;}\n":""),"\t#dijitEditorBody{overflow-x: auto; overflow-y:"+(this.height?"auto;":"hidden;")+"}\n","\tli > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; }\n","\tli{ min-height:1.2em; }\n","</style>\n",this._applyEditingAreaStyleSheets(),"\n","</head>\n<body ",(_17?"id='dijitEditorBody' ":""),"onload='frameElement._loadFunc(window,document)' style='"+_1a+"'>",_16,"</body>\n</html>"].join("");
-},_applyEditingAreaStyleSheets:function(){
-var _1e=[];
-if(this.styleSheets){
-_1e=this.styleSheets.split(";");
-this.styleSheets="";
-}
-_1e=_1e.concat(this.editingAreaStyleSheets);
-this.editingAreaStyleSheets=[];
-var _1f="",i=0,url;
-while((url=_1e[i++])){
-var _20=(new dojo._Url(dojo.global.location,url)).toString();
-this.editingAreaStyleSheets.push(_20);
-_1f+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_20+"\"/>";
-}
-return _1f;
-},addStyleSheet:function(uri){
-var url=uri.toString();
-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){
-return;
-}
-this.editingAreaStyleSheets.push(url);
-this.onLoadDeferred.addCallback(dojo.hitch(function(){
-if(this.document.createStyleSheet){
-this.document.createStyleSheet(url);
-}else{
-var _21=this.document.getElementsByTagName("head")[0];
-var _22=this.document.createElement("link");
-_22.rel="stylesheet";
-_22.type="text/css";
-_22.href=url;
-_21.appendChild(_22);
-}
-}));
-},removeStyleSheet:function(uri){
-var url=uri.toString();
-if(url.charAt(0)=="."||(url.charAt(0)!="/"&&!uri.host)){
-url=(new dojo._Url(dojo.global.location,url)).toString();
-}
-var _23=dojo.indexOf(this.editingAreaStyleSheets,url);
-if(_23==-1){
-return;
-}
-delete this.editingAreaStyleSheets[_23];
-dojo.withGlobal(this.window,"query",dojo,["link:[href=\""+url+"\"]"]).orphan();
-},disabled:false,_mozSettingProps:{"styleWithCSS":false},_setDisabledAttr:function(_24){
-this.disabled=_24;
-if(!this.isLoaded){
-return;
-}
-_24=!!_24;
-if(dojo.isIE||dojo.isWebKit||dojo.isOpera){
-var _25=dojo.isIE&&(this.isLoaded||!this.focusOnLoad);
-if(_25){
-this.editNode.unselectable="on";
-}
-this.editNode.contentEditable=!_24;
-if(_25){
-var _26=this;
-setTimeout(function(){
-_26.editNode.unselectable="off";
-},0);
-}
-}else{
-try{
-this.document.designMode=(_24?"off":"on");
-}
-catch(e){
-return;
-}
-if(!_24&&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._disabledOK=true;
-},onLoad:function(_27){
-if(!this.window.__registeredWindow){
-this.window.__registeredWindow=true;
-this._iframeRegHandle=dijit.registerIframe(this.iframe);
-}
-if(!dojo.isIE&&(this.height||dojo.isMoz)){
-this.editNode=this.document.body;
-}else{
-this.editNode=this.document.body.firstChild;
-var _28=this;
-if(dojo.isIE){
-var _29=(this.tabStop=dojo.doc.createElement("<div tabIndex=-1>"));
-this.editingArea.appendChild(_29);
-this.iframe.onfocus=function(){
-_28.editNode.setActive();
-};
-}
-}
-this.focusNode=this.editNode;
-var _2a=this.events.concat(this.captureEvents);
-var ap=this.iframe?this.document:this.editNode;
-dojo.forEach(_2a,function(_2b){
-this.connect(ap,_2b.toLowerCase(),_2b);
-},this);
-if(dojo.isIE){
-this.connect(this.document,"onmousedown","_onIEMouseDown");
-this.editNode.style.zoom=1;
-}else{
-this.connect(this.document,"onmousedown",function(){
-delete this._cursorToStart;
-});
-}
-if(dojo.isWebKit){
-this._webkitListener=this.connect(this.document,"onmouseup","onDisplayChanged");
-}
-if(dojo.isIE){
-try{
-this.document.execCommand("RespectVisibilityInDesign",true,null);
-}
-catch(e){
-}
-}
-this.isLoaded=true;
-this.set("disabled",this.disabled);
-var _2c=dojo.hitch(this,function(){
-this.setValue(_27);
-if(this.onLoadDeferred){
-this.onLoadDeferred.callback(true);
-}
-this.onDisplayChanged();
-if(this.focusOnLoad){
-dojo.addOnLoad(dojo.hitch(this,function(){
-setTimeout(dojo.hitch(this,"focus"),this.updateInterval);
-}));
-}
-this.savedContent=this.getValue(true);
-});
-if(this.setValueDeferred){
-this.setValueDeferred.addCallback(_2c);
-}else{
-_2c();
-}
-},onKeyDown:function(e){
-if(e.keyCode===dojo.keys.TAB&&this.isTabIndent){
-dojo.stopEvent(e);
-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){
-this.iframe.focus();
-}else{
-if(!e.shiftKey&&!e.ctrlKey&&!e.altKey){
-this.tabStop.focus();
-}
-}
-}else{
-if(e.keyCode===dojo.keys.BACKSPACE&&this.document.selection.type==="Control"){
-dojo.stopEvent(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);
-}
-}
-}
-}
-return true;
-},onKeyUp:function(e){
-return;
-},setDisabled:function(_2d){
-dojo.deprecated("dijit.Editor::setDisabled is deprecated","use dijit.Editor::attr(\"disabled\",boolean) instead",2);
-this.set("disabled",_2d);
-},_setValueAttr:function(_2e){
-this.setValue(_2e);
-},_setDisableSpellCheckAttr:function(_2f){
-if(this.document){
-dojo.attr(this.document.body,"spellcheck",!_2f);
-}else{
-this.onLoadDeferred.addCallback(dojo.hitch(this,function(){
-dojo.attr(this.document.body,"spellcheck",!_2f);
-}));
-}
-this.disableSpellCheck=_2f;
-},onKeyPress:function(e){
-var c=(e.keyChar&&e.keyChar.toLowerCase())||e.keyCode,_30=this._keyHandlers[c],_31=arguments;
-if(_30&&!e.altKey){
-dojo.some(_30,function(h){
-if(!(h.shift^e.shiftKey)&&!(h.ctrl^(e.ctrlKey||e.metaKey))){
-if(!h.handler.apply(this,_31)){
-e.preventDefault();
-}
-return true;
-}
-},this);
-}
-if(!this._onKeyHitch){
-this._onKeyHitch=dojo.hitch(this,"onKeyPressed");
-}
-setTimeout(this._onKeyHitch,1);
-return true;
-},addKeyHandler:function(key,_32,_33,_34){
-if(!dojo.isArray(this._keyHandlers[key])){
-this._keyHandlers[key]=[];
-}
-this._keyHandlers[key].push({shift:_33||false,ctrl:_32||false,handler:_34});
-},onKeyPressed:function(){
-this.onDisplayChanged();
-},onClick:function(e){
-this.onDisplayChanged(e);
-},_onIEMouseDown:function(e){
-if(!this._focused&&!this.disabled){
-this.focus();
-}
-},_onBlur:function(e){
-this.inherited(arguments);
-var _35=this.getValue(true);
-if(_35!=this.savedContent){
-this.onChange(_35);
-this.savedContent=_35;
-}
-},_onFocus:function(e){
-if(!this.disabled){
-if(!this._disabledOK){
-this.set("disabled",false);
-}
-this.inherited(arguments);
-}
-},blur:function(){
-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(){
-if(!this.isLoaded){
-this.focusOnLoad=true;
-return;
-}
-if(this._cursorToStart){
-delete this._cursorToStart;
-if(this.editNode.childNodes){
-this.placeCursorAtStart();
-return;
-}
-}
-if(!dojo.isIE){
-dijit.focus(this.iframe);
-}else{
-if(this.editNode&&this.editNode.focus){
-this.iframe.fireEvent("onfocus",document.createEventObject());
-}
-}
-},updateInterval:200,_updateTimer:null,onDisplayChanged:function(e){
-if(this._updateTimer){
-clearTimeout(this._updateTimer);
-}
-if(!this._updateHandler){
-this._updateHandler=dojo.hitch(this,"onNormalizedDisplayChanged");
-}
-this._updateTimer=setTimeout(this._updateHandler,this.updateInterval);
-},onNormalizedDisplayChanged:function(){
-delete this._updateTimer;
-},onChange:function(_36){
-},_normalizeCommand:function(cmd,_37){
-var _38=cmd.toLowerCase();
-if(_38=="formatblock"){
-if(dojo.isSafari&&_37===undefined){
-_38="heading";
-}
-}else{
-if(_38=="hilitecolor"&&!dojo.isMoz){
-_38="backcolor";
-}
-}
-return _38;
-},_qcaCache:{},queryCommandAvailable:function(_39){
-var ca=this._qcaCache[_39];
-if(ca!==undefined){
-return ca;
-}
-return (this._qcaCache[_39]=this._queryCommandAvailable(_39));
-},_queryCommandAvailable:function(_3a){
-var ie=1;
-var _3b=1<<1;
-var _3c=1<<2;
-var _3d=1<<3;
-var _3e=1<<4;
-function _3f(_40){
-return {ie:Boolean(_40&ie),mozilla:Boolean(_40&_3b),webkit:Boolean(_40&_3c),webkit420:Boolean(_40&_3e),opera:Boolean(_40&_3d)};
-};
-var _41=null;
-switch(_3a.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":
-_41=_3f(_3b|ie|_3c|_3d);
-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":
-_41=_3f(_3b|ie|_3d|_3e);
-break;
-case "blockdirltr":
-case "blockdirrtl":
-case "dirltr":
-case "dirrtl":
-case "inlinedirltr":
-case "inlinedirrtl":
-_41=_3f(ie);
-break;
-case "cut":
-case "copy":
-case "paste":
-_41=_3f(ie|_3b|_3e);
-break;
-case "inserttable":
-_41=_3f(_3b|ie);
-break;
-case "insertcell":
-case "insertcol":
-case "insertrow":
-case "deletecells":
-case "deletecols":
-case "deleterows":
-case "mergecells":
-case "splitcell":
-_41=_3f(ie|_3b);
-break;
-default:
-return false;
-}
-return (dojo.isIE&&_41.ie)||(dojo.isMoz&&_41.mozilla)||(dojo.isWebKit&&_41.webkit)||(dojo.isWebKit>420&&_41.webkit420)||(dojo.isOpera&&_41.opera);
-},execCommand:function(_42,_43){
-var _44;
-this.focus();
-_42=this._normalizeCommand(_42,_43);
-if(_43!==undefined){
-if(_42=="heading"){
-throw new Error("unimplemented");
-}else{
-if((_42=="formatblock")&&dojo.isIE){
-_43="<"+_43+">";
-}
-}
-}
-var _45="_"+_42+"Impl";
-if(this[_45]){
-_44=this[_45](_43);
-}else{
-_43=arguments.length>1?_43:null;
-if(_43||_42!="createlink"){
-_44=this.document.execCommand(_42,false,_43);
-}
-}
-this.onDisplayChanged();
-return _44;
-},queryCommandEnabled:function(_46){
-if(this.disabled||!this._disabledOK){
-return false;
-}
-_46=this._normalizeCommand(_46);
-if(dojo.isMoz||dojo.isWebKit){
-if(_46=="unlink"){
-return this._sCall("hasAncestorElement",["a"]);
-}else{
-if(_46=="inserttable"){
-return true;
-}
-}
-}
-if(dojo.isWebKit){
-if(_46=="copy"){
-_46="cut";
-}else{
-if(_46=="paste"){
-return true;
-}
-}
-}
-var _47=dojo.isIE?this.document.selection.createRange():this.document;
-try{
-return _47.queryCommandEnabled(_46);
-}
-catch(e){
-return false;
-}
-},queryCommandState:function(_48){
-if(this.disabled||!this._disabledOK){
-return false;
-}
-_48=this._normalizeCommand(_48);
-try{
-return this.document.queryCommandState(_48);
-}
-catch(e){
-return false;
-}
-},queryCommandValue:function(_49){
-if(this.disabled||!this._disabledOK){
-return false;
-}
-var r;
-_49=this._normalizeCommand(_49);
-if(dojo.isIE&&_49=="formatblock"){
-r=this._native2LocalFormatNames[this.document.queryCommandValue(_49)];
-}else{
-if(dojo.isMoz&&_49==="hilitecolor"){
-var _4a;
-try{
-_4a=this.document.queryCommandValue("styleWithCSS");
-}
-catch(e){
-_4a=false;
-}
-this.document.execCommand("styleWithCSS",false,true);
-r=this.document.queryCommandValue(_49);
-this.document.execCommand("styleWithCSS",false,_4a);
-}else{
-r=this.document.queryCommandValue(_49);
-}
-}
-return r;
-},_sCall:function(_4b,_4c){
-return dojo.withGlobal(this.window,_4b,dijit._editor.selection,_4c);
-},placeCursorAtStart:function(){
-this.focus();
-var _4d=false;
-if(dojo.isMoz){
-var _4e=this.editNode.firstChild;
-while(_4e){
-if(_4e.nodeType==3){
-if(_4e.nodeValue.replace(/^\s+|\s+$/g,"").length>0){
-_4d=true;
-this._sCall("selectElement",[_4e]);
-break;
-}
-}else{
-if(_4e.nodeType==1){
-_4d=true;
-var tg=_4e.tagName?_4e.tagName.toLowerCase():"";
-if(/br|input|img|base|meta|area|basefont|hr|link/.test(tg)){
-this._sCall("selectElement",[_4e]);
-}else{
-this._sCall("selectElementChildren",[_4e]);
-}
-break;
-}
-}
-_4e=_4e.nextSibling;
-}
-}else{
-_4d=true;
-this._sCall("selectElementChildren",[this.editNode]);
-}
-if(_4d){
-this._sCall("collapse",[true]);
-}
-},placeCursorAtEnd:function(){
-this.focus();
-var _4f=false;
-if(dojo.isMoz){
-var _50=this.editNode.lastChild;
-while(_50){
-if(_50.nodeType==3){
-if(_50.nodeValue.replace(/^\s+|\s+$/g,"").length>0){
-_4f=true;
-this._sCall("selectElement",[_50]);
-break;
-}
-}else{
-if(_50.nodeType==1){
-_4f=true;
-if(_50.lastChild){
-this._sCall("selectElement",[_50.lastChild]);
-}else{
-this._sCall("selectElement",[_50]);
-}
-break;
-}
-}
-_50=_50.previousSibling;
-}
-}else{
-_4f=true;
-this._sCall("selectElementChildren",[this.editNode]);
-}
-if(_4f){
-this._sCall("collapse",[false]);
-}
-},getValue:function(_51){
-if(this.textarea){
-if(this.isClosed||!this.isLoaded){
-return this.textarea.value;
-}
-}
-return this._postFilterContent(null,_51);
-},_getValueAttr:function(){
-return this.getValue(true);
-},setValue:function(_52){
-if(!this.isLoaded){
-this.onLoadDeferred.addCallback(dojo.hitch(this,function(){
-this.setValue(_52);
-}));
-return;
-}
-this._cursorToStart=true;
-if(this.textarea&&(this.isClosed||!this.isLoaded)){
-this.textarea.value=_52;
-}else{
-_52=this._preFilterContent(_52);
-var _53=this.isClosed?this.domNode:this.editNode;
-if(!_52&&dojo.isWebKit){
-_52="&nbsp;";
-}
-_53.innerHTML=_52;
-this._preDomFilterContent(_53);
-}
-this.onDisplayChanged();
-},replaceValue:function(_54){
-if(this.isClosed){
-this.setValue(_54);
-}else{
-if(this.window&&this.window.getSelection&&!dojo.isMoz){
-this.setValue(_54);
-}else{
-if(this.window&&this.window.getSelection){
-_54=this._preFilterContent(_54);
-this.execCommand("selectall");
-if(!_54){
-this._cursorToStart=true;
-_54="&nbsp;";
-}
-this.execCommand("inserthtml",_54);
-this._preDomFilterContent(this.editNode);
-}else{
-if(this.document&&this.document.selection){
-this.setValue(_54);
-}
-}
-}
-}
-},_preFilterContent:function(_55){
-var ec=_55;
-dojo.forEach(this.contentPreFilters,function(ef){
-if(ef){
-ec=ef(ec);
-}
-});
-return ec;
-},_preDomFilterContent:function(dom){
-dom=dom||this.editNode;
-dojo.forEach(this.contentDomPreFilters,function(ef){
-if(ef&&dojo.isFunction(ef)){
-ef(dom);
-}
-},this);
-},_postFilterContent:function(dom,_56){
-var ec;
-if(!dojo.isString(dom)){
-dom=dom||this.editNode;
-if(this.contentDomPostFilters.length){
-if(_56){
-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="";
+
+
+// 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.forEach(this.contentPostFilters,function(ef){
-ec=ef(ec);
+
+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);
+ }
+ }
});
-return ec;
-},_saveContent:function(e){
-var _57=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");
-if(_57.value){
-_57.value+=this._SEPARATOR;
-}
-_57.value+=this.name+":"+this.getValue(true);
-},escapeXml:function(str,_58){
-str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");
-if(!_58){
-str=str.replace(/'/gm,"&#39;");
-}
-return str;
-},getNodeHtml:function(_59){
-dojo.deprecated("dijit.Editor::getNodeHtml is deprecated","use dijit._editor.getNodeHtml instead",2);
-return dijit._editor.getNodeHtml(_59);
-},getNodeChildrenHtml:function(dom){
-dojo.deprecated("dijit.Editor::getNodeChildrenHtml is deprecated","use dijit._editor.getChildrenHtml instead",2);
-return dijit._editor.getChildrenHtml(dom);
-},close:function(_5a){
-if(this.isClosed){
-return false;
-}
-if(!arguments.length){
-_5a=true;
-}
-this._content=this.getValue();
-var _5b=(this.savedContent!=this._content);
-if(this.interval){
-clearInterval(this.interval);
-}
-if(this._webkitListener){
-this.disconnect(this._webkitListener);
-delete this._webkitListener;
-}
-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=_5a?this._content:this.savedContent;
-dojo.destroy(this.domNode);
-this.domNode=this.textarea;
-}else{
-this.domNode.innerHTML=_5a?this._content:this.savedContent;
-}
-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;
-return _5b;
-},destroy:function(){
-if(!this.isClosed){
-this.close(false);
-}
-this.inherited(arguments);
-},_removeMozBogus:function(_5c){
-return _5c.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"").replace(/_moz_resizing="(true|false)"/gi,"");
-},_removeWebkitBogus:function(_5d){
-_5d=_5d.replace(/\sclass="webkit-block-placeholder"/gi,"");
-_5d=_5d.replace(/\sclass="apple-style-span"/gi,"");
-return _5d;
-},_normalizeFontStyle:function(_5e){
-return _5e.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");
-},_preFixUrlAttributes:function(_5f){
-return _5f.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");
-},_inserthorizontalruleImpl:function(_60){
-if(dojo.isIE){
-return this._inserthtmlImpl("<hr>");
-}
-return this.document.execCommand("inserthorizontalrule",false,_60);
-},_unlinkImpl:function(_61){
-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,_61);
-},_hilitecolorImpl:function(_62){
-var _63;
-if(dojo.isMoz){
-this.document.execCommand("styleWithCSS",false,true);
-_63=this.document.execCommand("hilitecolor",false,_62);
-this.document.execCommand("styleWithCSS",false,false);
-}else{
-_63=this.document.execCommand("hilitecolor",false,_62);
-}
-return _63;
-},_backcolorImpl:function(_64){
-if(dojo.isIE){
-_64=_64?_64:null;
-}
-return this.document.execCommand("backcolor",false,_64);
-},_forecolorImpl:function(_65){
-if(dojo.isIE){
-_65=_65?_65:null;
-}
-return this.document.execCommand("forecolor",false,_65);
-},_inserthtmlImpl:function(_66){
-_66=this._preFilterContent(_66);
-var rv=true;
-if(dojo.isIE){
-var _67=this.document.selection.createRange();
-if(this.document.selection.type.toUpperCase()=="CONTROL"){
-var n=_67.item(0);
-while(_67.length){
-_67.remove(_67.item(0));
-}
-n.outerHTML=_66;
-}else{
-_67.pasteHTML(_66);
-}
-_67.select();
-}else{
-if(dojo.isMoz&&!_66.length){
-this._sCall("remove");
-}else{
-rv=this.document.execCommand("inserthtml",false,_66);
-}
-}
-return rv;
-},getHeaderHeight:function(){
-return this._getNodeChildrenHeight(this.header);
-},getFooterHeight:function(){
-return this._getNodeChildrenHeight(this.footer);
-},_getNodeChildrenHeight:function(_68){
-var h=0;
-if(_68&&_68.childNodes){
-var i;
-for(i=0;i<_68.childNodes.length;i++){
-var _69=dojo.position(_68.childNodes[i]);
-h+=_69.h;
-}
-}
-return h;
-}});
+
}
diff --git a/lib/dijit/_editor/_Plugin.js b/lib/dijit/_editor/_Plugin.js
index f3c95aae0..2f769960d 100644
--- a/lib/dijit/_editor/_Plugin.js
+++ b/lib/dijit/_editor/_Plugin.js
@@ -1,73 +1,289 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor._Plugin"]=true;
+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,{constructor:function(_1,_2){
-this.params=_1||{};
-dojo.mixin(this,this.params);
-this._connects=[];
-},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,command:"",useDefaultCommand:true,buttonClass:dijit.form.Button,getLabel:function(_3){
-return this.editor.commands[_3];
-},_initButton:function(){
-if(this.command.length){
-var _4=this.getLabel(this.command),_5=this.editor,_6=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);
-if(!this.button){
-var _7=dojo.mixin({label:_4,dir:_5.dir,lang:_5.lang,showLabel:false,iconClass:_6,dropDown:this.dropDown,tabIndex:"-1"},this.params||{});
-this.button=new this.buttonClass(_7);
-}
-}
-},destroy:function(){
-dojo.forEach(this._connects,dojo.disconnect);
-if(this.dropDown){
-this.dropDown.destroyRecursive();
-}
-},connect:function(o,f,tf){
-this._connects.push(dojo.connect(o,f,this,tf));
-},updateState:function(){
-var e=this.editor,c=this.command,_8,_9;
-if(!e||!e.isLoaded||!c.length){
-return;
-}
-if(this.button){
-try{
-_9=e.queryCommandEnabled(c);
-if(this.enabled!==_9){
-this.enabled=_9;
-this.button.set("disabled",!_9);
-}
-if(typeof this.button.checked=="boolean"){
-_8=e.queryCommandState(c);
-if(this.checked!==_8){
-this.checked=_8;
-this.button.set("checked",e.queryCommandState(c));
-}
-}
-}
-catch(e){
-}
-}
-},setEditor:function(_a){
-this.editor=_a;
-this._initButton();
-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{
-this.button.domNode.style.display="none";
-}
-}
-this.connect(this.editor,"onNormalizedDisplayChanged","updateState");
-},setToolbar:function(_b){
-if(this.button){
-_b.addChild(this.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;
+ }
+});
+
}
diff --git a/lib/dijit/_editor/html.js b/lib/dijit/_editor/html.js
index 7db85c7d9..196c8a309 100644
--- a/lib/dijit/_editor/html.js
+++ b/lib/dijit/_editor/html.js
@@ -1,147 +1,193 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.html"]=true;
+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");
-dijit._editor.escapeXml=function(_1,_2){
-_1=_1.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");
-if(!_2){
-_1=_1.replace(/'/gm,"&#39;");
-}
-return _1;
+
+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(_3){
-var _4;
-switch(_3.nodeType){
-case 1:
-var _5=_3.nodeName.toLowerCase();
-if(!_5||_5.charAt(0)=="/"){
-return "";
-}
-_4="<"+_5;
-var _6=[];
-var _7;
-if(dojo.isIE&&_3.outerHTML){
-var s=_3.outerHTML;
-s=s.substr(0,s.indexOf(">")).replace(/(['"])[^"']*\1/g,"");
-var _8=/(\b\w+)\s?=/g;
-var m,_9;
-while((m=_8.exec(s))){
-_9=m[1];
-if(_9.substr(0,3)!="_dj"){
-if(_9=="src"||_9=="href"){
-if(_3.getAttribute("_djrealurl")){
-_6.push([_9,_3.getAttribute("_djrealurl")]);
-continue;
-}
-}
-var _a,_b;
-switch(_9){
-case "style":
-_a=_3.style.cssText.toLowerCase();
-break;
-case "class":
-_a=_3.className;
-break;
-case "width":
-if(_5==="img"){
-_b=/width=(\S+)/i.exec(s);
-if(_b){
-_a=_b[1];
-}
-break;
-}
-case "height":
-if(_5==="img"){
-_b=/height=(\S+)/i.exec(s);
-if(_b){
-_a=_b[1];
-}
-break;
-}
-default:
-_a=_3.getAttribute(_9);
-}
-if(_a!=null){
-_6.push([_9,_a.toString()]);
-}
-}
-}
-}else{
-var i=0;
-while((_7=_3.attributes[i++])){
-var n=_7.name;
-if(n.substr(0,3)!="_dj"){
-var v=_7.value;
-if(n=="src"||n=="href"){
-if(_3.getAttribute("_djrealurl")){
-v=_3.getAttribute("_djrealurl");
-}
-}
-_6.push([n,v]);
-}
-}
-}
-_6.sort(function(a,b){
-return a[0]<b[0]?-1:(a[0]==b[0]?0:1);
-});
-var j=0;
-while((_7=_6[j++])){
-_4+=" "+_7[0]+"=\""+(dojo.isString(_7[1])?dijit._editor.escapeXml(_7[1],true):_7[1])+"\"";
-}
-if(_5==="script"){
-_4+=">"+_3.innerHTML+"</"+_5+">";
-}else{
-if(_3.childNodes.length){
-_4+=">"+dijit._editor.getChildrenHtml(_3)+"</"+_5+">";
-}else{
-switch(_5){
-case "br":
-case "hr":
-case "img":
-case "input":
-case "base":
-case "meta":
-case "area":
-case "basefont":
-_4+=" />";
-break;
-default:
-_4+="></"+_5+">";
-}
-}
-}
-break;
-case 4:
-case 3:
-_4=dijit._editor.escapeXml(_3.nodeValue,true);
-break;
-case 8:
-_4="<!--"+dijit._editor.escapeXml(_3.nodeValue,true)+"-->";
-break;
-default:
-_4="<!-- Element not recognized - Type: "+_3.nodeType+" Name: "+_3.nodeName+"-->";
-}
-return _4;
+
+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(_c){
-var _d="";
-if(!_c){
-return _d;
-}
-var _e=_c["childNodes"]||_c;
-var _f=!dojo.isIE||_e!==_c;
-var _10,i=0;
-while((_10=_e[i++])){
-if(!_f||_10.parentNode==_c){
-_d+=dijit._editor.getNodeHtml(_10);
-}
-}
-return _d;
+
+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
};
+
}
diff --git a/lib/dijit/_editor/nls/ar/FontChoice.js b/lib/dijit/_editor/nls/ar/FontChoice.js
index 71683c008..dd4f99423 100644
--- a/lib/dijit/_editor/nls/ar/FontChoice.js
+++ b/lib/dijit/_editor/nls/ar/FontChoice.js
@@ -1 +1 @@
-({"1":"صغير جدا جدا","2":"صغير جدا","formatBlock":"النسق","3":"صغير","4":"متوسط","5":"كبير","6":"كبير جدا","7":"كبير جدا جدا","fantasy":"خيالي","serif":"serif","p":"فقرة","pre":"منسق بصفة مسبقة","sans-serif":"sans-serif","fontName":"طاقم طباعة","h1":"عنوان","h2":"عنوان فرعي","h3":"فرعي-عنوان فرعي","monospace":"أحادي المسافة","fontSize":"الحجم","cursive":"كتابة بحروف متصلة","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ar/LinkDialog.js b/lib/dijit/_editor/nls/ar/LinkDialog.js
index 1a1b32e59..e229c6860 100644
--- a/lib/dijit/_editor/nls/ar/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ar/LinkDialog.js
@@ -1 +1 @@
-({"text":"الوصف:","insertImageTitle":"خصائص الصورة","set":"تحديد","newWindow":"نافذة جديدة","topWindow":"النافذة العلوية","target":"الهدف: ","createLinkTitle":"خصائص الوصلة","parentWindow":"النافذة الرئيسية","currentWindow":"النافذة الحالية","url":"عنوان URL:"}) \ No newline at end of file
+({"text":"الوصف:","insertImageTitle":"خصائص الصورة","set":"تحديد","newWindow":"‏نافذة جديدة‏","topWindow":"النافذة العلوية","target":"الهدف:","createLinkTitle":"خصائص الوصلة","parentWindow":"النافذة الرئيسية","currentWindow":"النافذة الحالية","url":"‏عنوان URL:‏"}) \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ar/commands.js b/lib/dijit/_editor/nls/ar/commands.js
index 3e524ea91..81069e8d2 100644
--- a/lib/dijit/_editor/nls/ar/commands.js
+++ b/lib/dijit/_editor/nls/ar/commands.js
@@ -1 +1 @@
-({"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":"ازاحة للداخل باستخدام Tab","justifyRight":"محاذاة الى اليمين","appleKey":"⌘${0}"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ca/FontChoice.js b/lib/dijit/_editor/nls/ca/FontChoice.js
index efba7dec4..6a393feaa 100644
--- a/lib/dijit/_editor/nls/ca/FontChoice.js
+++ b/lib/dijit/_editor/nls/ca/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ca/LinkDialog.js b/lib/dijit/_editor/nls/ca/LinkDialog.js
index b030a2ced..f7dd3af07 100644
--- a/lib/dijit/_editor/nls/ca/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ca/LinkDialog.js
@@ -1 +1 @@
-({"text":"Descipció:","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
+({"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
diff --git a/lib/dijit/_editor/nls/ca/commands.js b/lib/dijit/_editor/nls/ca/commands.js
index f78e71c85..534715e5a 100644
--- a/lib/dijit/_editor/nls/ca/commands.js
+++ b/lib/dijit/_editor/nls/ca/commands.js
@@ -1 +1 @@
-({"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":"Regle 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 la 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
+({"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
diff --git a/lib/dijit/_editor/nls/cs/FontChoice.js b/lib/dijit/_editor/nls/cs/FontChoice.js
index 447fe6685..b60a88027 100644
--- a/lib/dijit/_editor/nls/cs/FontChoice.js
+++ b/lib/dijit/_editor/nls/cs/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/cs/commands.js b/lib/dijit/_editor/nls/cs/commands.js
index ce515587c..c3572d1d2 100644
--- a/lib/dijit/_editor/nls/cs/commands.js
+++ b/lib/dijit/_editor/nls/cs/commands.js
@@ -1 +1 @@
-({"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 režim celé obrazovky","italic":"Kurzíva","fontName":"Název písma","justifyLeft":"Zarovnat vlevo","unlink":"Odebrat odkaz","toggleTableBorder":"Přepnout ohraničení tabulky","viewSource":"Zobrazit zdroj ve formátu 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
+({"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
diff --git a/lib/dijit/_editor/nls/da/FontChoice.js b/lib/dijit/_editor/nls/da/FontChoice.js
index 5b380ece6..a45c55bc5 100644
--- a/lib/dijit/_editor/nls/da/FontChoice.js
+++ b/lib/dijit/_editor/nls/da/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/da/commands.js b/lib/dijit/_editor/nls/da/commands.js
index d2d93547e..fca175c80 100644
--- a/lib/dijit/_editor/nls/da/commands.js
+++ b/lib/dijit/_editor/nls/da/commands.js
@@ -1 +1 @@
-({"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","ctrlKey":"Ctrl+${0}","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}"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/de/FontChoice.js b/lib/dijit/_editor/nls/de/FontChoice.js
index ed65ff3e7..c584c1812 100644
--- a/lib/dijit/_editor/nls/de/FontChoice.js
+++ b/lib/dijit/_editor/nls/de/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/el/FontChoice.js b/lib/dijit/_editor/nls/el/FontChoice.js
index 13c661c63..a529fe873 100644
--- a/lib/dijit/_editor/nls/el/FontChoice.js
+++ b/lib/dijit/_editor/nls/el/FontChoice.js
@@ -1 +1 @@
-({"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":"πλάγιοι","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/es/FontChoice.js b/lib/dijit/_editor/nls/es/FontChoice.js
index 905a5609a..fd7d96590 100644
--- a/lib/dijit/_editor/nls/es/FontChoice.js
+++ b/lib/dijit/_editor/nls/es/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/es/LinkDialog.js b/lib/dijit/_editor/nls/es/LinkDialog.js
index 15802d77a..7d69bdb80 100644
--- a/lib/dijit/_editor/nls/es/LinkDialog.js
+++ b/lib/dijit/_editor/nls/es/LinkDialog.js
@@ -1 +1 @@
-({"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
+({"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
diff --git a/lib/dijit/_editor/nls/fi/FontChoice.js b/lib/dijit/_editor/nls/fi/FontChoice.js
index 7107971c7..02c68e986 100644
--- a/lib/dijit/_editor/nls/fi/FontChoice.js
+++ b/lib/dijit/_editor/nls/fi/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/fr/FontChoice.js b/lib/dijit/_editor/nls/fr/FontChoice.js
index a96fac045..2e3a97803 100644
--- a/lib/dijit/_editor/nls/fr/FontChoice.js
+++ b/lib/dijit/_editor/nls/fr/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/fr/LinkDialog.js b/lib/dijit/_editor/nls/fr/LinkDialog.js
index 70946013a..8103ae329 100644
--- a/lib/dijit/_editor/nls/fr/LinkDialog.js
+++ b/lib/dijit/_editor/nls/fr/LinkDialog.js
@@ -1 +1 @@
-({"text":"Description :","insertImageTitle":"Propriétés des images","set":"Définir","newWindow":"Nouvelle fenêtre","topWindow":"Première fenêtre","target":"Cible :","createLinkTitle":"Propriétés des liens","parentWindow":"Fenêtre parent","currentWindow":"Fenêtre en cours","url":"URL :"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/fr/commands.js b/lib/dijit/_editor/nls/fr/commands.js
index df8cb3b92..532ac1347 100644
--- a/lib/dijit/_editor/nls/fr/commands.js
+++ b/lib/dijit/_editor/nls/fr/commands.js
@@ -1 +1 @@
-({"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 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 vers le mode 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":"Action \"${0}\" uniquement disponible dans votre navigateur via un raccourci clavier. Utilisez ${1}.","indent":"Retrait","redo":"Rétablir","strikethrough":"Barrer","justifyFull":"Justifier","justifyCenter":"Aligner au centre","hiliteColor":"Couleur 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
+({"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
diff --git a/lib/dijit/_editor/nls/he/FontChoice.js b/lib/dijit/_editor/nls/he/FontChoice.js
index 37140fb00..4c2e16f50 100644
--- a/lib/dijit/_editor/nls/he/FontChoice.js
+++ b/lib/dijit/_editor/nls/he/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/he/LinkDialog.js b/lib/dijit/_editor/nls/he/LinkDialog.js
index 7b75850de..493974ca6 100644
--- a/lib/dijit/_editor/nls/he/LinkDialog.js
+++ b/lib/dijit/_editor/nls/he/LinkDialog.js
@@ -1 +1 @@
-({"text":"תיאור:","insertImageTitle":"תכונות תמונה","set":"הגדרה","newWindow":"חלון חדש","topWindow":"חלון עליון ","target":"יעד:","createLinkTitle":"תכונות קישור","parentWindow":"חלון אב","currentWindow":"חלון נוכחי ","url":"URL:‏"}) \ No newline at end of file
+({"text":"תיאור:","insertImageTitle":"תכונות תמונה","set":"הגדרה","newWindow":"חלון חדש","topWindow":"חלון עליון","target":"יעד:","createLinkTitle":"תכונות קישור","parentWindow":"חלון אב","currentWindow":"חלון נוכחי","url":"URL:‏"}) \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/he/commands.js b/lib/dijit/_editor/nls/he/commands.js
index 75e95ab3e..39d598e94 100644
--- a/lib/dijit/_editor/nls/he/commands.js
+++ b/lib/dijit/_editor/nls/he/commands.js
@@ -1 +1 @@
-({"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
+({"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
diff --git a/lib/dijit/_editor/nls/hu/FontChoice.js b/lib/dijit/_editor/nls/hu/FontChoice.js
index 7b67d13e9..831fe99c5 100644
--- a/lib/dijit/_editor/nls/hu/FontChoice.js
+++ b/lib/dijit/_editor/nls/hu/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/it/FontChoice.js b/lib/dijit/_editor/nls/it/FontChoice.js
index 50f234087..a248473b5 100644
--- a/lib/dijit/_editor/nls/it/FontChoice.js
+++ b/lib/dijit/_editor/nls/it/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/it/LinkDialog.js b/lib/dijit/_editor/nls/it/LinkDialog.js
index ad3adef0e..94ebe18d2 100644
--- a/lib/dijit/_editor/nls/it/LinkDialog.js
+++ b/lib/dijit/_editor/nls/it/LinkDialog.js
@@ -1 +1 @@
-({"text":"Descrizione:","insertImageTitle":"Proprietà immagine","set":"Imposta","newWindow":"Nuova finestra","topWindow":"Finestra superiore","target":"Destinazione:","createLinkTitle":"Proprietà collegamento","parentWindow":"Finestra padre","currentWindow":"Finestra corrente","url":"URL:"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/it/commands.js b/lib/dijit/_editor/nls/it/commands.js
index 4abbd7ec8..2b08f8170 100644
--- a/lib/dijit/_editor/nls/it/commands.js
+++ b/lib/dijit/_editor/nls/it/commands.js
@@ -1 +1 @@
-({"removeFormat":"Rimuovi formato","copy":"Copia","paste":"Incolla","selectAll":"Seleziona tutto","insertOrderedList":"Elenco numerato","insertTable":"Inserisci/Modifica tabella","print":"Stampa","underline":"Sottolinea","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":"Attiva/Disattiva bordo tabella","viewSource":"Visualizza origine HTML","fontSize":"Dimensione carattere","systemShortcut":"La azione \"${0}\" è disponibile solo nel browser tramite un tasto di scelta rapida. Utilizzare ${1}.","indent":"Rientro","redo":"Ripristina","strikethrough":"Barrato","justifyFull":"Giustifica","justifyCenter":"Allinea al centro","hiliteColor":"Colore sfondo","deleteTable":"Elimina tabella","outdent":"Annulla rientro","cut":"Taglia","plainFormatBlock":"Stile paragrafo","toggleDir":"Attiva/Disattiva direzione","bold":"Grassetto","tabIndent":"Rientro tabulazione","justifyRight":"Allinea a destra","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ja/FontChoice.js b/lib/dijit/_editor/nls/ja/FontChoice.js
index 6083ab381..647f90d2d 100644
--- a/lib/dijit/_editor/nls/ja/FontChoice.js
+++ b/lib/dijit/_editor/nls/ja/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ja/commands.js b/lib/dijit/_editor/nls/ja/commands.js
index 618746e23..2ba1d51bb 100644
--- a/lib/dijit/_editor/nls/ja/commands.js
+++ b/lib/dijit/_editor/nls/ja/commands.js
@@ -1 +1 @@
-({"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
+({"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
diff --git a/lib/dijit/_editor/nls/kk/FontChoice.js b/lib/dijit/_editor/nls/kk/FontChoice.js
new file mode 100644
index 000000000..6a9dbbff3
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/FontChoice.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dijit/_editor/nls/kk/LinkDialog.js b/lib/dijit/_editor/nls/kk/LinkDialog.js
new file mode 100644
index 000000000..c1c5ca2fa
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/LinkDialog.js
@@ -0,0 +1 @@
+({"text":"Сипаттама:","insertImageTitle":"Сурет сипаттары","set":"Орнату","newWindow":"Жаңа терезе","topWindow":"Ең жоғарғы терезе","target":"Мақсат:","createLinkTitle":"Сілтеме сипаттары","parentWindow":"Басты терезе","currentWindow":"Ағымдағы терезе","url":"URL мекенжайы:"}) \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/kk/commands.js b/lib/dijit/_editor/nls/kk/commands.js
new file mode 100644
index 000000000..ac362d31e
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/commands.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dijit/_editor/nls/ko/FontChoice.js b/lib/dijit/_editor/nls/ko/FontChoice.js
index fda733702..f3e2dc4ad 100644
--- a/lib/dijit/_editor/nls/ko/FontChoice.js
+++ b/lib/dijit/_editor/nls/ko/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ko/LinkDialog.js b/lib/dijit/_editor/nls/ko/LinkDialog.js
index 1f46bd71f..fd1e9d5b0 100644
--- a/lib/dijit/_editor/nls/ko/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ko/LinkDialog.js
@@ -1 +1 @@
-({"text":"설명:","insertImageTitle":"이미지 특성","set":"설정","newWindow":"새 창","topWindow":"최상위 창","target":"대상:","createLinkTitle":"링크 특성","parentWindow":"상위 창","currentWindow":"현재 창","url":"URL:"}) \ No newline at end of file
+({"text":"설명:","insertImageTitle":"이미지 등록 정보","set":"설정","newWindow":"새 창","topWindow":"최상위 창","target":"대상","createLinkTitle":"링크 등록 정보","parentWindow":"상위 창","currentWindow":"현재 창","url":"URL:"}) \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ko/commands.js b/lib/dijit/_editor/nls/ko/commands.js
index 4c8f95493..972b047e3 100644
--- a/lib/dijit/_editor/nls/ko/commands.js
+++ b/lib/dijit/_editor/nls/ko/commands.js
@@ -1 +1 @@
-({"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
+({"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
diff --git a/lib/dijit/_editor/nls/nb/FontChoice.js b/lib/dijit/_editor/nls/nb/FontChoice.js
index b1ad6abf2..c7c8f5dd5 100644
--- a/lib/dijit/_editor/nls/nb/FontChoice.js
+++ b/lib/dijit/_editor/nls/nb/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/nb/commands.js b/lib/dijit/_editor/nls/nb/commands.js
index d1f215f52..daf828988 100644
--- a/lib/dijit/_editor/nls/nb/commands.js
+++ b/lib/dijit/_editor/nls/nb/commands.js
@@ -1 +1 @@
-({"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","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","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","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/nl/FontChoice.js b/lib/dijit/_editor/nls/nl/FontChoice.js
index d3d4f19f3..2bdbd583e 100644
--- a/lib/dijit/_editor/nls/nl/FontChoice.js
+++ b/lib/dijit/_editor/nls/nl/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/pl/FontChoice.js b/lib/dijit/_editor/nls/pl/FontChoice.js
index 8beb6bf63..e555c2812 100644
--- a/lib/dijit/_editor/nls/pl/FontChoice.js
+++ b/lib/dijit/_editor/nls/pl/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/pl/commands.js b/lib/dijit/_editor/nls/pl/commands.js
index 8ee8acfa9..0615a6905 100644
--- a/lib/dijit/_editor/nls/pl/commands.js
+++ b/lib/dijit/_editor/nls/pl/commands.js
@@ -1 +1 @@
-({"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":"Źródło 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
+({"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
diff --git a/lib/dijit/_editor/nls/pt-pt/FontChoice.js b/lib/dijit/_editor/nls/pt-pt/FontChoice.js
index dec5354e1..b7b8405c4 100644
--- a/lib/dijit/_editor/nls/pt-pt/FontChoice.js
+++ b/lib/dijit/_editor/nls/pt-pt/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/pt-pt/commands.js b/lib/dijit/_editor/nls/pt-pt/commands.js
index fbf5182ef..1f4815dfe 100644
--- a/lib/dijit/_editor/nls/pt-pt/commands.js
+++ b/lib/dijit/_editor/nls/pt-pt/commands.js
@@ -1 +1 @@
-({"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":"Origem 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
+({"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
diff --git a/lib/dijit/_editor/nls/pt/FontChoice.js b/lib/dijit/_editor/nls/pt/FontChoice.js
index 50de220af..2ce4785f3 100644
--- a/lib/dijit/_editor/nls/pt/FontChoice.js
+++ b/lib/dijit/_editor/nls/pt/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/pt/commands.js b/lib/dijit/_editor/nls/pt/commands.js
index 271c6cf51..cef0a157e 100644
--- a/lib/dijit/_editor/nls/pt/commands.js
+++ b/lib/dijit/_editor/nls/pt/commands.js
@@ -1 +1 @@
-({"removeFormat":"Remover Formato","copy":"Copiar","paste":"Colar","selectAll":"Selecionar Todos","insertOrderedList":"Lista Numerada","insertTable":"Inserir/Editar Tabela","print":"Impressão","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 pela 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 do teclado. Use ${1}.","indent":"Recuar","redo":"Refazer","strikethrough":"Tachado","justifyFull":"Justificar","justifyCenter":"Alinhar pelo Centro","hiliteColor":"Cor de 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 pela Direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ro/LinkDialog.js b/lib/dijit/_editor/nls/ro/LinkDialog.js
index c3cfb3990..fba0a8423 100644
--- a/lib/dijit/_editor/nls/ro/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ro/LinkDialog.js
@@ -1 +1 @@
-({"text":"Descriere:","insertImageTitle":"Proprietăţi imagine","set":"Setare","newWindow":"Fereastră nouă","topWindow":"Fereastra cea mai de sus","target":"Ţintă:","createLinkTitle":"Proprietăţi legătură","parentWindow":"Fereastra părinte","currentWindow":"Fereastra curentă","url":"URL:"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ro/commands.js b/lib/dijit/_editor/nls/ro/commands.js
index f73017cbf..776bcb3ae 100644
--- a/lib/dijit/_editor/nls/ro/commands.js
+++ b/lib/dijit/_editor/nls/ro/commands.js
@@ -1 +1 @@
-({"removeFormat":"Înlăturare format","copy":"Copiere","paste":"Lipire","selectAll":"Selectare toate","insertOrderedList":"Listă numerotată","insertTable":"Inserare/Editare tabelă","print":"Tipărire","underline":"Subliniere","foreColor":"Culoare prim plan","htmlToggle":"Sursă HTML","formatBlock":"Stil paragraf","newPage":"Pagină nouă","insertHorizontalRule":"Regulă orizontală","delete":"Ştergere","insertUnorderedList":"Listă cu marcaje","tableProp":"Proprietăţi 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":"Cursive","fontName":"Nume font","justifyLeft":"Aliniere la stânga","unlink":"Înlăturare legătură","toggleTableBorder":"Comutare bordură tabelă","viewSource":"Vizualizare sursă HTML","fontSize":"Dimensiune font","systemShortcut":"Acţiunea \"${0}\" este disponibilă în browser folosind o scurtătură de la tastatură. Folosiţi ${1}.","indent":"Indentare","redo":"Repetare acţiune","strikethrough":"Suprascriere linie","justifyFull":"Aliniere","justifyCenter":"Aliniere pe centru","hiliteColor":"Culoare fundal","deleteTable":"Ştergere tabelă","outdent":"Outdentare","cut":"Tăiere","plainFormatBlock":"Stil paragraf","toggleDir":"Comutare direcţie","bold":"Aldine","tabIndent":"Indentare cu tab","justifyRight":"Aliniere la dreapta","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ru/FontChoice.js b/lib/dijit/_editor/nls/ru/FontChoice.js
index bdc10430a..b836589cf 100644
--- a/lib/dijit/_editor/nls/ru/FontChoice.js
+++ b/lib/dijit/_editor/nls/ru/FontChoice.js
@@ -1 +1 @@
-({"1":"самый маленький","2":"очень маленький","formatBlock":"Формат","3":"маленький","4":"средний","5":"большой","6":"очень большой","7":"самый большой","fantasy":"артистический","serif":"с засечками","p":"Абзац","pre":"Заранее отформатированный","sans-serif":"без засечек","fontName":"Шрифт","h1":"Заголовок","h2":"Подзаголовок","h3":"Вложенный подзаголовок","monospace":"непропорциональный","fontSize":"Размер","cursive":"курсив","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/ru/LinkDialog.js b/lib/dijit/_editor/nls/ru/LinkDialog.js
index ddc2f7b0f..0b91f4c09 100644
--- a/lib/dijit/_editor/nls/ru/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ru/LinkDialog.js
@@ -1 +1 @@
-({"text":"Описание:","insertImageTitle":"Свойства изображения","set":"Задать","newWindow":"Новое окно","topWindow":"Окно верхнего уровня","target":"Целевой объект:","createLinkTitle":"Свойства ссылки","parentWindow":"Родительское окно","currentWindow":"Текущее окно","url":"URL:"}) \ No newline at end of file
+({"text":"Описание:","insertImageTitle":"Свойства изображения","set":"Задать","newWindow":"Новое окно","topWindow":"Верхнее окно","target":"Целевой объект:","createLinkTitle":"Свойства ссылки","parentWindow":"Родительское окно","currentWindow":"Текущее окно","url":"URL:"}) \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/sk/FontChoice.js b/lib/dijit/_editor/nls/sk/FontChoice.js
index b7415e83d..afe267bcc 100644
--- a/lib/dijit/_editor/nls/sk/FontChoice.js
+++ b/lib/dijit/_editor/nls/sk/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/sl/FontChoice.js b/lib/dijit/_editor/nls/sl/FontChoice.js
index 2dcfed191..e6fe9d303 100644
--- a/lib/dijit/_editor/nls/sl/FontChoice.js
+++ b/lib/dijit/_editor/nls/sl/FontChoice.js
@@ -1 +1 @@
-({"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 oblikovano","sans-serif":"sans-serif","fontName":"Pisava","h1":"Naslov","h2":"Podnaslov","h3":"Pod podnaslov","monospace":"monospace","fontSize":"Velikost","cursive":"cursive","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/sl/LinkDialog.js b/lib/dijit/_editor/nls/sl/LinkDialog.js
index bad7dd641..e485a4163 100644
--- a/lib/dijit/_editor/nls/sl/LinkDialog.js
+++ b/lib/dijit/_editor/nls/sl/LinkDialog.js
@@ -1 +1 @@
-({"text":"Opis:","insertImageTitle":"Lastnosti slike","set":"Nastavi","newWindow":"Novo okno","topWindow":"Najvišje okno","target":"Cilj:","createLinkTitle":"Lastnosti povezave","parentWindow":"Nadrejeno okno","currentWindow":"Trenutno okno","url":"URL:"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/sl/commands.js b/lib/dijit/_editor/nls/sl/commands.js
index 72431aa71..e40b8033b 100644
--- a/lib/dijit/_editor/nls/sl/commands.js
+++ b/lib/dijit/_editor/nls/sl/commands.js
@@ -1 +1 @@
-({"removeFormat":"Odstrani obliko zapisa","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":"Obojestranska poravnava","justifyCenter":"Poravnaj na sredino","hiliteColor":"Barva ozadja","deleteTable":"Izbriši tabelo","outdent":"Viseč odstavek","cut":"Izreži","plainFormatBlock":"Slog odstavka","toggleDir":"Preklopi na usmeritev","bold":"Krepko","tabIndent":"Zamik tabulatorja","justifyRight":"Poravnaj desno","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/sv/FontChoice.js b/lib/dijit/_editor/nls/sv/FontChoice.js
index a778cc83b..0637af9ff 100644
--- a/lib/dijit/_editor/nls/sv/FontChoice.js
+++ b/lib/dijit/_editor/nls/sv/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/th/FontChoice.js b/lib/dijit/_editor/nls/th/FontChoice.js
index c3e8f811d..02688efaa 100644
--- a/lib/dijit/_editor/nls/th/FontChoice.js
+++ b/lib/dijit/_editor/nls/th/FontChoice.js
@@ -1 +1 @@
-({"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","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/th/LinkDialog.js b/lib/dijit/_editor/nls/th/LinkDialog.js
index d571c53b4..4d1aeb296 100644
--- a/lib/dijit/_editor/nls/th/LinkDialog.js
+++ b/lib/dijit/_editor/nls/th/LinkDialog.js
@@ -1 +1 @@
-({"text":"รายละเอียด","insertImageTitle":"คุณสมบัติอิมเมจ","set":"ตั้งค่า","newWindow":"หน้าต่างใหม่","topWindow":"หน้าต่างบนสุด","target":"เป้าหมาย:","createLinkTitle":"คุณสมบัติลิงก์","parentWindow":"หน้าต่างหลัก","currentWindow":"หน้าต่างปัจจุบัน","url":"URL:"}) \ No newline at end of file
+({"text":"รายละเอียด:","insertImageTitle":"คุณสมบัติอิมเมจ","set":"ตั้งค่า","newWindow":"หน้าต่างใหม่","topWindow":"หน้าต่างบนสุด","target":"เป้าหมาย:","createLinkTitle":"คุณสมบัติลิงก์","parentWindow":"หน้าต่างหลัก","currentWindow":"หน้าต่างปัจจุบัน","url":"URL:"}) \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/tr/FontChoice.js b/lib/dijit/_editor/nls/tr/FontChoice.js
index c9cdfea53..28173c929 100644
--- a/lib/dijit/_editor/nls/tr/FontChoice.js
+++ b/lib/dijit/_editor/nls/tr/FontChoice.js
@@ -1 +1 @@
-({"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ı","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/zh-tw/FontChoice.js b/lib/dijit/_editor/nls/zh-tw/FontChoice.js
index b821ec0ec..006977983 100644
--- a/lib/dijit/_editor/nls/zh-tw/FontChoice.js
+++ b/lib/dijit/_editor/nls/zh-tw/FontChoice.js
@@ -1 +1 @@
-({"1":"最小","2":"較小","formatBlock":"格式","3":"小","4":"中","5":"大","6":"較大","7":"最大","fantasy":"Fantasy","serif":"新細明體","p":"段落","pre":"預先格式化","sans-serif":"新細明體","fontName":"字型","h1":"標題","h2":"子標題","h3":"次子標題","monospace":"等寬","fontSize":"大小","cursive":"Cursive","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/zh-tw/commands.js b/lib/dijit/_editor/nls/zh-tw/commands.js
index d72dc4ec4..17f6fea49 100644
--- a/lib/dijit/_editor/nls/zh-tw/commands.js
+++ b/lib/dijit/_editor/nls/zh-tw/commands.js
@@ -1 +1 @@
-({"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
+({"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
diff --git a/lib/dijit/_editor/nls/zh/FontChoice.js b/lib/dijit/_editor/nls/zh/FontChoice.js
index 4d52bb78e..a9850c7fd 100644
--- a/lib/dijit/_editor/nls/zh/FontChoice.js
+++ b/lib/dijit/_editor/nls/zh/FontChoice.js
@@ -1 +1 @@
-({"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":"草书","noFormat":"None"}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/_editor/nls/zh/LinkDialog.js b/lib/dijit/_editor/nls/zh/LinkDialog.js
index da4c50026..5b5390fbc 100644
--- a/lib/dijit/_editor/nls/zh/LinkDialog.js
+++ b/lib/dijit/_editor/nls/zh/LinkDialog.js
@@ -1 +1 @@
-({"text":"描述:","insertImageTitle":"图像属性","set":"设置","newWindow":"新窗口","topWindow":"最顶部窗口","target":"目标:","createLinkTitle":"链接属性","parentWindow":"父窗口","currentWindow":"当前窗口","url":"URL:"}) \ No newline at end of file
+({"text":"描述:","insertImageTitle":"图像属性","set":"设置","newWindow":"新建窗口","topWindow":"顶层窗口","target":"目标:","createLinkTitle":"链接属性","parentWindow":"父窗口","currentWindow":"当前窗口","url":"URL:"}) \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
index 1e0e2ed3f..9d0b7ded8 100644
--- a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
+++ b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
@@ -1,119 +1,190 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.AlwaysShowToolbar"]=true;
+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.declare("dijit._editor.plugins.AlwaysShowToolbar",dijit._editor._Plugin,{_handleScroll:true,setEditor:function(e){
-if(!e.iframe){
-return;
-}
-this.editor=e;
-e.onLoadDeferred.addCallback(dojo.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 _1=dojo.marginBox(e.editNode).h;
-if(dojo.isOpera){
-_1=e.editNode.scrollHeight;
-}
-if(!_1){
-_1=dojo.marginBox(e.document.body).h;
-}
-if(_1==0){
-return;
-}
-if(dojo.isIE<=7&&this.editor.minHeight){
-var _2=parseInt(this.editor.minHeight);
-if(_1<_2){
-_1=_2;
-}
-}
-if(_1!=this._lastHeight){
-this._lastHeight=_1;
-dojo.marginBox(e.iframe,{h:this._lastHeight});
-}
-},_lastHeight:0,globalOnScrollHandler:function(){
-var _3=dojo.isIE<7;
-if(!this._handleScroll){
-return;
-}
-var _4=this.editor.header;
-var db=dojo.body;
-if(!this._scrollSetUp){
-this._scrollSetUp=true;
-this._scrollThreshold=dojo.position(_4,true).y;
-}
-var _5=dojo._docScroll().y;
-var s=_4.style;
-if(_5>this._scrollThreshold&&_5<this._scrollThreshold+this._lastHeight){
-if(!this._fixEnabled){
-var _6=dojo.marginBox(_4);
-this.editor.iframe.style.marginTop=_6.h+"px";
-if(_3){
-s.left=dojo.position(_4).x;
-if(_4.previousSibling){
-this._IEOriginalPos=["after",_4.previousSibling];
-}else{
-if(_4.nextSibling){
-this._IEOriginalPos=["before",_4.nextSibling];
-}else{
-this._IEOriginalPos=["last",_4.parentNode];
-}
-}
-dojo.body().appendChild(_4);
-dojo.addClass(_4,"dijitIEFixedToolbar");
-}else{
-s.position="fixed";
-s.top="0px";
-}
-dojo.marginBox(_4,{w:_6.w});
-s.zIndex=2000;
-this._fixEnabled=true;
-}
-var _7=(this.height)?parseInt(this.editor.height):this.editor._lastHeight;
-s.display=(_5>this._scrollThreshold+_7)?"none":"";
-}else{
-if(this._fixEnabled){
-this.editor.iframe.style.marginTop="";
-s.position="";
-s.top="";
-s.zIndex="";
-s.display="";
-if(_3){
-s.left="";
-dojo.removeClass(_4,"dijitIEFixedToolbar");
-if(this._IEOriginalPos){
-dojo.place(_4,this._IEOriginalPos[1],this._IEOriginalPos[0]);
-this._IEOriginalPos=null;
-}else{
-dojo.place(_4,this.editor.iframe,"before");
-}
-}
-s.width="";
-this._fixEnabled=false;
-}
-}
-},destroy:function(){
-this._IEOriginalPos=null;
-this._handleScroll=false;
-dojo.forEach(this._connects,dojo.disconnect);
-if(dojo.isIE<7){
-dojo.removeClass(this.editor.header,"dijitIEFixedToolbar");
-}
-}});
+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');
+ }
+ }
+});
+
}
diff --git a/lib/dijit/_editor/plugins/EnterKeyHandling.js b/lib/dijit/_editor/plugins/EnterKeyHandling.js
index 51a8fdde8..670d491ae 100644
--- a/lib/dijit/_editor/plugins/EnterKeyHandling.js
+++ b/lib/dijit/_editor/plugins/EnterKeyHandling.js
@@ -1,423 +1,604 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]=true;
+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.declare("dijit._editor.plugins.EnterKeyHandling",dijit._editor._Plugin,{blockNodeForEnter:"BR",constructor:function(_1){
-if(_1){
-dojo.mixin(this,_1);
-}
-},setEditor:function(_2){
-this.editor=_2;
-if(this.blockNodeForEnter=="BR"){
-if(dojo.isIE){
-_2.contentDomPreFilters.push(dojo.hitch(this,"regularPsToSingleLinePs"));
-_2.contentDomPostFilters.push(dojo.hitch(this,"singleLinePsToRegularPs"));
-_2.onLoadDeferred.addCallback(dojo.hitch(this,"_fixNewLineBehaviorForIE"));
-}else{
-_2.onLoadDeferred.addCallback(dojo.hitch(this,function(d){
-try{
-this.editor.document.execCommand("insertBrOnReturn",false,true);
-}
-catch(e){
-}
-return d;
-}));
-}
-}else{
-if(this.blockNodeForEnter){
-dojo["require"]("dijit._editor.range");
-var h=dojo.hitch(this,this.handleEnterKey);
-_2.addKeyHandler(13,0,0,h);
-_2.addKeyHandler(13,0,1,h);
-this.connect(this.editor,"onKeyPressed","onKeyPressed");
-}
-}
-},onKeyPressed:function(e){
-if(this._checkListLater){
-if(dojo.withGlobal(this.editor.window,"isCollapsed",dijit)){
-var _3=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,["LI"]);
-if(!_3){
-dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);
-var _4=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]);
-if(_4){
-_4.innerHTML=this.bogusHtmlContent;
-if(dojo.isIE){
-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(dojo.isMoz){
-if(_3.parentNode.parentNode.nodeName=="LI"){
-_3=_3.parentNode.parentNode;
-}
-}
-var fc=_3.firstChild;
-if(fc&&fc.nodeType==1&&(fc.nodeName=="UL"||fc.nodeName=="OL")){
-_3.insertBefore(fc.ownerDocument.createTextNode(" "),fc);
-var _5=dijit.range.create(this.editor.window);
-_5.setStart(_3.firstChild,0);
-var _6=dijit.range.getSelection(this.editor.window,true);
-_6.removeAllRanges();
-_6.addRange(_5);
-}
-}
-}
-this._checkListLater=false;
-}
-if(this._pressedEnterInBlock){
-if(this._pressedEnterInBlock.previousSibling){
-this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);
-}
-delete this._pressedEnterInBlock;
-}
-},bogusHtmlContent:"&nbsp;",blockNodes:/^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,handleEnterKey:function(e){
-var _7,_8,_9,_a=this.editor.document,br;
-if(e.shiftKey){
-var _b=dojo.withGlobal(this.editor.window,"getParentElement",dijit._editor.selection);
-var _c=dijit.range.getAncestor(_b,this.blockNodes);
-if(_c){
-if(!e.shiftKey&&_c.tagName=="LI"){
-return true;
-}
-_7=dijit.range.getSelection(this.editor.window);
-_8=_7.getRangeAt(0);
-if(!_8.collapsed){
-_8.deleteContents();
-_7=dijit.range.getSelection(this.editor.window);
-_8=_7.getRangeAt(0);
-}
-if(dijit.range.atBeginningOfContainer(_c,_8.startContainer,_8.startOffset)){
-if(e.shiftKey){
-br=_a.createElement("br");
-_9=dijit.range.create(this.editor.window);
-_c.insertBefore(br,_c.firstChild);
-_9.setStartBefore(br.nextSibling);
-_7.removeAllRanges();
-_7.addRange(_9);
-}else{
-dojo.place(br,_c,"before");
-}
-}else{
-if(dijit.range.atEndOfContainer(_c,_8.startContainer,_8.startOffset)){
-_9=dijit.range.create(this.editor.window);
-br=_a.createElement("br");
-if(e.shiftKey){
-_c.appendChild(br);
-_c.appendChild(_a.createTextNode(" "));
-_9.setStart(_c.lastChild,0);
-}else{
-dojo.place(br,_c,"after");
-_9.setStartAfter(_c);
-}
-_7.removeAllRanges();
-_7.addRange(_9);
-}else{
-return true;
-}
-}
-}else{
-dijit._editor.RichText.prototype.execCommand.call(this.editor,"inserthtml","<br>");
-}
-return false;
-}
-var _d=true;
-_7=dijit.range.getSelection(this.editor.window);
-_8=_7.getRangeAt(0);
-if(!_8.collapsed){
-_8.deleteContents();
-_7=dijit.range.getSelection(this.editor.window);
-_8=_7.getRangeAt(0);
-}
-var _e=dijit.range.getBlockAncestor(_8.endContainer,null,this.editor.editNode);
-var _f=_e.blockNode;
-if((this._checkListLater=(_f&&(_f.nodeName=="LI"||_f.parentNode.nodeName=="LI")))){
-if(dojo.isMoz){
-this._pressedEnterInBlock=_f;
-}
-if(/^(\s|&nbsp;|\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s|&nbsp;|\xA0)<\/span>)?(<br>)?$/.test(_f.innerHTML)){
-_f.innerHTML="";
-if(dojo.isWebKit){
-_9=dijit.range.create(this.editor.window);
-_9.setStart(_f,0);
-_7.removeAllRanges();
-_7.addRange(_9);
-}
-this._checkListLater=false;
-}
-return true;
-}
-if(!_e.blockNode||_e.blockNode===this.editor.editNode){
-try{
-dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);
-}
-catch(e2){
-}
-_e={blockNode:dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]),blockContainer:this.editor.editNode};
-if(_e.blockNode){
-if(_e.blockNode!=this.editor.editNode&&(!(_e.blockNode.textContent||_e.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length)){
-this.removeTrailingBr(_e.blockNode);
-return false;
-}
-}else{
-_e.blockNode=this.editor.editNode;
-}
-_7=dijit.range.getSelection(this.editor.window);
-_8=_7.getRangeAt(0);
-}
-var _10=_a.createElement(this.blockNodeForEnter);
-_10.innerHTML=this.bogusHtmlContent;
-this.removeTrailingBr(_e.blockNode);
-if(dijit.range.atEndOfContainer(_e.blockNode,_8.endContainer,_8.endOffset)){
-if(_e.blockNode===_e.blockContainer){
-_e.blockNode.appendChild(_10);
-}else{
-dojo.place(_10,_e.blockNode,"after");
-}
-_d=false;
-_9=dijit.range.create(this.editor.window);
-_9.setStart(_10,0);
-_7.removeAllRanges();
-_7.addRange(_9);
-if(this.editor.height){
-dojo.window.scrollIntoView(_10);
-}
-}else{
-if(dijit.range.atBeginningOfContainer(_e.blockNode,_8.startContainer,_8.startOffset)){
-dojo.place(_10,_e.blockNode,_e.blockNode===_e.blockContainer?"first":"before");
-if(_10.nextSibling&&this.editor.height){
-_9=dijit.range.create(this.editor.window);
-_9.setStart(_10.nextSibling,0);
-_7.removeAllRanges();
-_7.addRange(_9);
-dojo.window.scrollIntoView(_10.nextSibling);
-}
-_d=false;
-}else{
-if(_e.blockNode===_e.blockContainer){
-_e.blockNode.appendChild(_10);
-}else{
-dojo.place(_10,_e.blockNode,"after");
-}
-_d=false;
-if(_e.blockNode.style){
-if(_10.style){
-if(_e.blockNode.style.cssText){
-_10.style.cssText=_e.blockNode.style.cssText;
-}
-}
-}
-var rs=_8.startContainer;
-if(rs&&rs.nodeType==3){
-var _11,_12;
-var txt=rs.nodeValue;
-var _13=_a.createTextNode(txt.substring(0,_8.startOffset));
-var _14=_a.createTextNode(txt.substring(_8.startOffset,txt.length));
-dojo.place(_13,rs,"before");
-dojo.place(_14,rs,"after");
-dojo.destroy(rs);
-var _15=_13.parentNode;
-while(_15!==_e.blockNode){
-var tg=_15.tagName;
-var _16=_a.createElement(tg);
-if(_15.style){
-if(_16.style){
-if(_15.style.cssText){
-_16.style.cssText=_15.style.cssText;
-}
-}
-}
-_11=_14;
-while(_11){
-_12=_11.nextSibling;
-_16.appendChild(_11);
-_11=_12;
-}
-dojo.place(_16,_15,"after");
-_13=_15;
-_14=_16;
-_15=_15.parentNode;
-}
-_11=_14;
-if(_11.nodeType==1||(_11.nodeType==3&&_11.nodeValue)){
-_10.innerHTML="";
-}
-while(_11){
-_12=_11.nextSibling;
-_10.appendChild(_11);
-_11=_12;
-}
-}
-_9=dijit.range.create(this.editor.window);
-_9.setStart(_10,0);
-_7.removeAllRanges();
-_7.addRange(_9);
-if(this.editor.height){
-dijit.scrollIntoView(_10);
-}
-if(dojo.isMoz){
-this._pressedEnterInBlock=_e.blockNode;
-}
-}
-}
-return _d;
-},removeTrailingBr:function(_17){
-var _18=/P|DIV|LI/i.test(_17.tagName)?_17:dijit._editor.selection.getParentOfType(_17,["P","DIV","LI"]);
-if(!_18){
-return;
-}
-if(_18.lastChild){
-if((_18.childNodes.length>1&&_18.lastChild.nodeType==3&&/^[\s\xAD]*$/.test(_18.lastChild.nodeValue))||_18.lastChild.tagName=="BR"){
-dojo.destroy(_18.lastChild);
-}
-}
-if(!_18.childNodes.length){
-_18.innerHTML=this.bogusHtmlContent;
-}
-},_fixNewLineBehaviorForIE:function(d){
-var doc=this.editor.document;
-if(doc.__INSERTED_EDITIOR_NEWLINE_CSS===undefined){
-var _19=dojo.create("style",{type:"text/css"},doc.getElementsByTagName("head")[0]);
-_19.styleSheet.cssText="p{margin:0;}";
-this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS=true;
-}
-return d;
-},regularPsToSingleLinePs:function(_1a,_1b){
-function _1c(el){
-function _1d(_1e){
-var _1f=_1e[0].ownerDocument.createElement("p");
-_1e[0].parentNode.insertBefore(_1f,_1e[0]);
-dojo.forEach(_1e,function(_20){
-_1f.appendChild(_20);
-});
-};
-var _21=0;
-var _22=[];
-var _23;
-while(_21<el.childNodes.length){
-_23=el.childNodes[_21];
-if(_23.nodeType==3||(_23.nodeType==1&&_23.nodeName!="BR"&&dojo.style(_23,"display")!="block")){
-_22.push(_23);
-}else{
-var _24=_23.nextSibling;
-if(_22.length){
-_1d(_22);
-_21=(_21+1)-_22.length;
-if(_23.nodeName=="BR"){
-dojo.destroy(_23);
-}
-}
-_22=[];
-}
-_21++;
-}
-if(_22.length){
-_1d(_22);
-}
-};
-function _25(el){
-var _26=null;
-var _27=[];
-var _28=el.childNodes.length-1;
-for(var i=_28;i>=0;i--){
-_26=el.childNodes[i];
-if(_26.nodeName=="BR"){
-var _29=_26.ownerDocument.createElement("p");
-dojo.place(_29,el,"after");
-if(_27.length==0&&i!=_28){
-_29.innerHTML="&nbsp;";
-}
-dojo.forEach(_27,function(_2a){
-_29.appendChild(_2a);
-});
-dojo.destroy(_26);
-_27=[];
-}else{
-_27.unshift(_26);
-}
-}
-};
-var _2b=[];
-var ps=_1a.getElementsByTagName("p");
-dojo.forEach(ps,function(p){
-_2b.push(p);
+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;
+ }
+ }
});
-dojo.forEach(_2b,function(p){
-var _2c=p.previousSibling;
-if((_2c)&&(_2c.nodeType==1)&&(_2c.nodeName=="P"||dojo.style(_2c,"display")!="block")){
-var _2d=p.parentNode.insertBefore(this.document.createElement("p"),p);
-_2d.innerHTML=_1b?"":"&nbsp;";
-}
-_25(p);
-},this.editor);
-_1c(_1a);
-return _1a;
-},singleLinePsToRegularPs:function(_2e){
-function _2f(_30){
-var ps=_30.getElementsByTagName("p");
-var _31=[];
-for(var i=0;i<ps.length;i++){
-var p=ps[i];
-var _32=false;
-for(var k=0;k<_31.length;k++){
-if(_31[k]===p.parentNode){
-_32=true;
-break;
-}
-}
-if(!_32){
-_31.push(p.parentNode);
-}
-}
-return _31;
-};
-function _33(_34){
-return (!_34.childNodes.length||_34.innerHTML=="&nbsp;");
-};
-var _35=_2f(_2e);
-for(var i=0;i<_35.length;i++){
-var _36=_35[i];
-var _37=null;
-var _38=_36.firstChild;
-var _39=null;
-while(_38){
-if(_38.nodeType!=1||_38.tagName!="P"||(_38.getAttributeNode("style")||{}).specified){
-_37=null;
-}else{
-if(_33(_38)){
-_39=_38;
-_37=null;
-}else{
-if(_37==null){
-_37=_38;
-}else{
-if((!_37.lastChild||_37.lastChild.nodeName!="BR")&&(_38.firstChild)&&(_38.firstChild.nodeName!="BR")){
-_37.appendChild(this.editor.document.createElement("br"));
-}
-while(_38.firstChild){
-_37.appendChild(_38.firstChild);
-}
-_39=_38;
-}
-}
-}
-_38=_38.nextSibling;
-if(_39){
-dojo.destroy(_39);
-_39=null;
-}
-}
-}
-return _2e;
-}});
+
}
diff --git a/lib/dijit/_editor/plugins/FontChoice.js b/lib/dijit/_editor/plugins/FontChoice.js
index c5578e3fb..ef91fd676 100644
--- a/lib/dijit/_editor/plugins/FontChoice.js
+++ b/lib/dijit/_editor/plugins/FontChoice.js
@@ -1,12 +1,12 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.FontChoice"]=true;
+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");
@@ -14,252 +14,570 @@ 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,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],{label:"",widgetsInTemplate:true,plainText:false,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(){
-this.inherited(arguments);
-this.strings=dojo.i18n.getLocalization("dijit._editor","FontChoice");
-this.label=this.strings[this.command];
-this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
-this.selectId=this.id+"_select";
-this.inherited(arguments);
-},postCreate:function(){
-var _1=dojo.map(this.values,function(_2){
-var _3=this.strings[_2]||_2;
-return {label:this.getLabel(_2,_3),name:_3,value:_2};
-},this);
-this.select.store=new dojo.data.ItemFileReadStore({data:{identifier:"value",items:_1}});
-this.select.set("value","",false);
-this.disabled=this.select.get("disabled");
-},_setValueAttr:function(_4,_5){
-_5=_5!==false?true:false;
-this.select.set("value",dojo.indexOf(this.values,_4)<0?"":_4,_5);
-if(!_5){
-this.select._lastValueReported=null;
-}
-},_getValueAttr:function(){
-return this.select.get("value");
-},focus:function(){
-this.select.focus();
-},_setDisabledAttr:function(_6){
-this.disabled=_6;
-this.select.set("disabled",_6);
-}});
-dojo.declare("dijit._editor.plugins._FontNameDropDown",dijit._editor.plugins._FontDropDown,{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(_7,_8){
-if(this.plainText){
-return _8;
-}else{
-return "<div style='font-family: "+_7+"'>"+_8+"</div>";
-}
-},_setValueAttr:function(_9,_a){
-_a=_a!==false?true:false;
-if(this.generic){
-var _b={"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"};
-_9=_b[_9]||_9;
-}
-this.inherited(arguments,[_9,_a]);
-}});
-dojo.declare("dijit._editor.plugins._FontSizeDropDown",dijit._editor.plugins._FontDropDown,{command:"fontSize",values:[1,2,3,4,5,6,7],getLabel:function(_c,_d){
-if(this.plainText){
-return _d;
-}else{
-return "<font size="+_c+"'>"+_d+"</font>";
-}
-},_setValueAttr:function(_e,_f){
-_f=_f!==false?true:false;
-if(_e.indexOf&&_e.indexOf("px")!=-1){
-var _10=parseInt(_e,10);
-_e={10:1,13:2,16:3,18:4,24:5,32:6,48:7}[_10]||_e;
-}
-this.inherited(arguments,[_e,_f]);
-}});
-dojo.declare("dijit._editor.plugins._FormatBlockDropDown",dijit._editor.plugins._FontDropDown,{command:"formatBlock",values:["noFormat","p","h1","h2","h3","pre"],postCreate:function(){
-this.inherited(arguments);
-this.set("value","noFormat",false);
-},getLabel:function(_11,_12){
-if(this.plainText){
-return _12;
-}else{
-return "<"+_11+">"+_12+"</"+_11+">";
-}
-},_execCommand:function(_13,_14,_15){
-if(_15==="noFormat"){
-var _16;
-var end;
-var sel=dijit.range.getSelection(_13.window);
-if(sel&&sel.rangeCount>0){
-var _17=sel.getRangeAt(0);
-var _18,tag;
-if(_17){
-_16=_17.startContainer;
-end=_17.endContainer;
-while(_16&&_16!==_13.editNode&&_16!==_13.document.body&&_16.nodeType!==1){
-_16=_16.parentNode;
-}
-while(end&&end!==_13.editNode&&end!==_13.document.body&&end.nodeType!==1){
-end=end.parentNode;
-}
-var _19=dojo.hitch(this,function(_1a,_1b){
-if(_1a.childNodes&&_1a.childNodes.length){
-var i;
-for(i=0;i<_1a.childNodes.length;i++){
-var c=_1a.childNodes[i];
-if(c.nodeType==1){
-if(dojo.withGlobal(_13.window,"inSelection",dijit._editor.selection,[c])){
-var tag=c.tagName?c.tagName.toLowerCase():"";
-if(dojo.indexOf(this.values,tag)!==-1){
-_1b.push(c);
-}
-_19(c,_1b);
-}
-}
-}
-}
+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);
+ }
});
-var _1c=dojo.hitch(this,function(_1d){
-if(_1d&&_1d.length){
-_13.beginEditing();
-while(_1d.length){
-this._removeFormat(_13,_1d.pop());
-}
-_13.endEditing();
-}
+
+
+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]);
+ }
});
-var _1e=[];
-if(_16==end){
-var _1f;
-_18=_16;
-while(_18&&_18!==_13.editNode&&_18!==_13.document.body){
-if(_18.nodeType==1){
-tag=_18.tagName?_18.tagName.toLowerCase():"";
-if(dojo.indexOf(this.values,tag)!==-1){
-_1f=_18;
-break;
-}
-}
-_18=_18.parentNode;
-}
-_19(_16,_1e);
-if(_1f){
-_1e=[_1f].concat(_1e);
-}
-_1c(_1e);
-}else{
-_18=_16;
-while(dojo.withGlobal(_13.window,"inSelection",dijit._editor.selection,[_18])){
-if(_18.nodeType==1){
-tag=_18.tagName?_18.tagName.toLowerCase():"";
-if(dojo.indexOf(this.values,tag)!==-1){
-_1e.push(_18);
-}
-_19(_18,_1e);
-}
-_18=_18.nextSibling;
-}
-_1c(_1e);
-}
-_13.onDisplayChanged();
-}
-}
-}else{
-_13.execCommand(_14,_15);
-}
-},_removeFormat:function(_20,_21){
-if(_20.customUndo){
-while(_21.firstChild){
-dojo.place(_21.firstChild,_21,"before");
-}
-_21.parentNode.removeChild(_21);
-}else{
-dojo.withGlobal(_20.window,"selectElementChildren",dijit._editor.selection,[_21]);
-var _22=dojo.withGlobal(_20.window,"getSelectedHtml",dijit._editor.selection,[null]);
-dojo.withGlobal(_20.window,"selectElement",dijit._editor.selection,[_21]);
-_20.execCommand("inserthtml",_22||"");
-}
-}});
-dojo.declare("dijit._editor.plugins.FontChoice",dijit._editor._Plugin,{useDefaultCommand:false,_initButton:function(){
-var _23={fontName:dijit._editor.plugins._FontNameDropDown,fontSize:dijit._editor.plugins._FontSizeDropDown,formatBlock:dijit._editor.plugins._FormatBlockDropDown}[this.command],_24=this.params;
-if(this.params.custom){
-_24.values=this.params.custom;
-}
-var _25=this.editor;
-this.button=new _23(dojo.delegate({dir:_25.dir,lang:_25.lang},_24));
-this.connect(this.button.select,"onChange",function(_26){
-this.editor.focus();
-if(this.command=="fontName"&&_26.indexOf(" ")!=-1){
-_26="'"+_26+"'";
-}
-if(this.button._execCommand){
-this.button._execCommand(this.editor,this.command,_26);
-}else{
-this.editor.execCommand(this.command,_26);
-}
-this.editor.customUndo=this.editor.customUndo||dojo.isWebKit;
+
+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]);
+ }
});
-},updateState:function(){
-var _27=this.editor;
-var _28=this.command;
-if(!_27||!_27.isLoaded||!_28.length){
-return;
-}
-if(this.button){
-var _29;
-try{
-_29=_27.queryCommandValue(_28)||"";
-}
-catch(e){
-_29="";
-}
-var _2a=dojo.isString(_29)&&_29.match(/'([^']*)'/);
-if(_2a){
-_29=_2a[1];
-}
-if(_28==="formatBlock"){
-if(!_29||_29=="p"){
-_29=null;
-var _2b;
-var sel=dijit.range.getSelection(this.editor.window);
-if(sel&&sel.rangeCount>0){
-var _2c=sel.getRangeAt(0);
-if(_2c){
-_2b=_2c.endContainer;
-}
-}
-while(_2b&&_2b!==_27.editNode&&_2b!==_27.document){
-var tg=_2b.tagName?_2b.tagName.toLowerCase():"";
-if(tg&&dojo.indexOf(this.button.values,tg)>-1){
-_29=tg;
-break;
-}
-_2b=_2b.parentNode;
-}
-if(!_29){
-_29="noFormat";
-}
-}else{
-if(dojo.indexOf(this.button.values,_29)<0){
-_29="noFormat";
-}
-}
-}
-if(_29!==this.button.get("value")){
-this.button.set("value",_29,false);
-}
-}
-}});
-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});
-}
+
+
+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
+ });
+ }
+});
+
}
diff --git a/lib/dijit/_editor/plugins/FullScreen.js b/lib/dijit/_editor/plugins/FullScreen.js
index 7a6dac55d..6978252c8 100644
--- a/lib/dijit/_editor/plugins/FullScreen.js
+++ b/lib/dijit/_editor/plugins/FullScreen.js
@@ -1,232 +1,441 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.FullScreen"]=true;
+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,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,{zIndex:500,_origState:null,_origiFrameState:null,_resizeHandle:null,isFullscreen:false,toggle:function(){
-this.button.set("checked",!this.button.get("checked"));
-},_initButton:function(){
-var _1=dojo.i18n.getLocalization("dijit._editor","commands"),_2=this.editor;
-this.button=new dijit.form.ToggleButton({label:_1["fullScreen"],dir:_2.dir,lang:_2.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"FullScreen",tabIndex:"-1",onChange:dojo.hitch(this,"_setFullScreen")});
-},setEditor:function(_3){
-this.editor=_3;
-this._initButton();
-this.editor.addKeyHandler(dojo.keys.F11,true,true,dojo.hitch(this,function(e){
-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){
-if(this.isFullscreen){
-var ed=this.editor;
-if(!ed.isTabIndent&&ed._fullscreen_oldOnKeyDown&&e.keyCode===dojo.keys.TAB){
-var f=dijit.getFocus();
-var _4=this._getAltViewNode();
-if(f.node==ed.iframe||(_4&&f.node===_4)){
-setTimeout(dojo.hitch(this,function(){
-ed.toolbar.focus();
-}),10);
-}else{
-if(_4&&dojo.style(ed.iframe,"display")==="none"){
-setTimeout(dojo.hitch(this,function(){
-dijit.focus(_4);
-}),10);
-}else{
-setTimeout(dojo.hitch(this,function(){
-ed.focus();
-}),10);
-}
-}
-dojo.stopEvent(e);
-}else{
-if(ed._fullscreen_oldOnKeyDown){
-ed._fullscreen_oldOnKeyDown(e);
-}
-}
-}
-},_resizeEditor:function(){
-var vp=dojo.window.getBox();
-dojo.marginBox(this.editor.domNode,{w:vp.w,h:vp.h});
-var _5=this.editor.getHeaderHeight();
-var _6=this.editor.getFooterHeight();
-var _7=dojo._getPadBorderExtents(this.editor.domNode);
-var _8=dojo._getPadBorderExtents(this.editor.iframe.parentNode);
-var _9=dojo._getMarginExtents(this.editor.iframe.parentNode);
-var _a=vp.h-(_5+_7.h+_6);
-dojo.marginBox(this.editor.iframe.parentNode,{h:_a,w:vp.w});
-dojo.marginBox(this.editor.iframe,{h:_a-(_8.h+_9.h)});
-},_getAltViewNode:function(){
-},_setFullScreen:function(_b){
-var vp=dojo.window.getBox();
-var ed=this.editor;
-var _c=dojo.body();
-var _d=ed.domNode.parentNode;
-this.isFullscreen=_b;
-if(_b){
-while(_d&&_d!==dojo.body()){
-dojo.addClass(_d,"dijitForceStatic");
-_d=_d.parentNode;
-}
-this._editorResizeHolder=this.editor.resize;
-ed.resize=function(){
-};
-ed._fullscreen_oldOnKeyDown=ed.onKeyDown;
-ed.onKeyDown=dojo.hitch(this,this._containFocus);
-this._origState={};
-this._origiFrameState={};
-var _e=ed.domNode,_f=_e&&_e.style||{};
-this._origState={width:_f.width||"",height:_f.height||"",top:dojo.style(_e,"top")||"",left:dojo.style(_e,"left")||"",position:dojo.style(_e,"position")||"static",marginBox:dojo.marginBox(ed.domNode)};
-var _10=ed.iframe,_11=_10&&_10.style||{};
-var bc=dojo.style(ed.iframe,"backgroundColor");
-this._origiFrameState={backgroundColor:bc||"transparent",width:_11.width||"auto",height:_11.height||"auto",zIndex:_11.zIndex||""};
-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%"});
-if(_c.style&&_c.style.overflow){
-this._oldOverflow=dojo.style(_c,"overflow");
-}else{
-this._oldOverflow="";
-}
-if(dojo.isIE&&!dojo.isQuirks){
-if(_c.parentNode&&_c.parentNode.style&&_c.parentNode.style.overflow){
-this._oldBodyParentOverflow=_c.parentNode.style.overflow;
-}else{
-try{
-this._oldBodyParentOverflow=dojo.style(_c.parentNode,"overflow");
-}
-catch(e){
-this._oldBodyParentOverflow="scroll";
-}
-}
-dojo.style(_c.parentNode,"overflow","hidden");
-}
-dojo.style(_c,"overflow","hidden");
-var _12=function(){
-var vp=dojo.window.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(dojo.hitch(this,function(){
-delete this._resizer;
-this._resizeEditor();
-}),10);
-};
-this._resizeHandle=dojo.connect(window,"onresize",this,_12);
-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);
-}));
-this._resizeEditor();
-var dn=this.editor.toolbar.domNode;
-setTimeout(function(){
-dojo.window.scrollIntoView(dn);
-},250);
-}else{
-if(this._resizeHandle){
-dojo.disconnect(this._resizeHandle);
-this._resizeHandle=null;
-}
-if(this._resizeHandle2){
-dojo.disconnect(this._resizeHandle2);
-this._resizeHandle2=null;
-}
-if(this._rst){
-clearTimeout(this._rst);
-this._rst=null;
-}
-while(_d&&_d!==dojo.body()){
-dojo.removeClass(_d,"dijitForceStatic");
-_d=_d.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 _13=this;
-setTimeout(function(){
-var mb=_13._origState.marginBox;
-var oh=_13._origState.height;
-if(dojo.isIE&&!dojo.isQuirks){
-_c.parentNode.style.overflow=_13._oldBodyParentOverflow;
-delete _13._oldBodyParentOverflow;
-}
-dojo.style(_c,"overflow",_13._oldOverflow);
-delete _13._oldOverflow;
-dojo.style(ed.domNode,_13._origState);
-dojo.style(ed.iframe.parentNode,{height:"",width:""});
-dojo.style(ed.iframe,_13._origiFrameState);
-delete _13._origState;
-delete _13._origiFrameState;
-var _14=dijit.getEnclosingWidget(ed.domNode.parentNode);
-if(_14&&_14.resize){
-_14.resize();
-}else{
-if(!oh||oh.indexOf("%")<0){
-setTimeout(dojo.hitch(this,function(){
-ed.resize({h:mb.h});
-}),0);
-}
-}
-dojo.window.scrollIntoView(_13.editor.toolbar.domNode);
-},100);
-}
-},destroy:function(){
-if(this._resizeHandle){
-dojo.disconnect(this._resizeHandle);
-this._resizeHandle=null;
-}
-if(this._resizeHandle2){
-dojo.disconnect(this._resizeHandle2);
-this._resizeHandle2=null;
-}
-if(this._resizer){
-clearTimeout(this._resizer);
-this._resizer=null;
-}
-this.inherited(arguments);
-}});
-dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
-if(o.plugin){
-return;
-}
-var _15=o.args.name.toLowerCase();
-if(_15==="fullscreen"){
-o.plugin=new dijit._editor.plugins.FullScreen({zIndex:("zIndex" in o.args)?o.args.zIndex:500});
-}
+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
+ });
+ }
+});
+
}
diff --git a/lib/dijit/_editor/plugins/LinkDialog.js b/lib/dijit/_editor/plugins/LinkDialog.js
index 71de3ad8f..feb5cf9ec 100644
--- a/lib/dijit/_editor/plugins/LinkDialog.js
+++ b/lib/dijit/_editor/plugins/LinkDialog.js
@@ -1,236 +1,516 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.LinkDialog"]=true;
+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._Templated");
dojo.require("dijit._editor._Plugin");
dojo.require("dijit.TooltipDialog");
-dojo.require("dijit.form.Button");
+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,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,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,{buttonClass:dijit.form.DropDownButton,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/]+(?:\\?[^?#\\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:new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),_userAtRxp:new RegExp("^([!#-'*+\\-\\/-9=?A-Z^-~]+[.])*[!#-'*+\\-\\/-9=?A-Z^-~]+@","i"),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(){
-var _1=this;
-this.tag=this.command=="insertImage"?"img":"a";
-var _2=dojo.mixin(dojo.i18n.getLocalization("dijit","common",this.lang),dojo.i18n.getLocalization("dijit._editor","LinkDialog",this.lang));
-var _3=(this.dropDown=new dijit.TooltipDialog({title:_2[this.command+"Title"],execute:dojo.hitch(this,"setValue"),onOpen:function(){
-_1._onOpenDialog();
-dijit.TooltipDialog.prototype.onOpen.apply(this,arguments);
-},onCancel:function(){
-setTimeout(dojo.hitch(_1,"_onCloseDialog"),0);
-}}));
-_2.urlRegExp=this.urlRegExp;
-_2.id=dijit.getUniqueId(this.editor.id);
-this._uniqueId=_2.id;
-this._setContent(_3.title+"<div style='border-bottom: 1px black solid;padding-bottom:2pt;margin-bottom:4pt'></div>"+dojo.string.substitute(this.linkDialogTemplate,_2));
-_3.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();
+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);
+ }
+ }
+ }
});
-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=dojo.hitch(this,function(){
-var _4=this._urlInput.get("value");
-return this._urlRegExp.test(_4)||this._emailRegExp.test(_4);
+
+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);
+ }
+ }
+ }
});
-this._connectTagEvents();
-this.inherited(arguments);
-},_checkAndFixInput:function(){
-var _5=this;
-var _6=this._urlInput.get("value");
-var _7=function(_8){
-var _9=false;
-var _a=false;
-if(_8&&_8.length>1){
-_8=dojo.trim(_8);
-if(_8.indexOf("mailto:")!==0){
-if(_8.indexOf("/")>0){
-if(_8.indexOf("://")===-1){
-if(_8.charAt(0)!=="/"&&_8.indexOf("./")!==0){
-if(_5._hostRxp.test(_8)){
-_9=true;
-}
-}
-}
-}else{
-if(_5._userAtRxp.test(_8)){
-_a=true;
-}
-}
-}
-}
-if(_9){
-_5._urlInput.set("value","http://"+_8);
-}
-if(_a){
-_5._urlInput.set("value","mailto:"+_8);
-}
-_5._setButton.set("disabled",!_5._isValid());
-};
-if(this._delayedCheck){
-clearTimeout(this._delayedCheck);
-this._delayedCheck=null;
-}
-this._delayedCheck=setTimeout(function(){
-_7(_6);
-},250);
-},_connectTagEvents:function(){
-this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){
-this.connect(this.editor.editNode,"ondblclick",this._onDblClick);
-}));
-},_isValid:function(){
-return this._urlInput.isValid()&&this._textInput.isValid();
-},_setContent:function(_b){
-this.dropDown.set("content",_b);
-},_checkValues:function(_c){
-if(_c&&_c.urlInput){
-_c.urlInput=_c.urlInput.replace(/"/g,"&quot;");
-}
-return _c;
-},setValue:function(_d){
-this._onCloseDialog();
-if(dojo.isIE){
-var _e=dijit.range.getSelection(this.editor.window);
-var _f=_e.getRangeAt(0);
-var a=_f.endContainer;
-if(a.nodeType===3){
-a=a.parentNode;
-}
-if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){
-a=dojo.withGlobal(this.editor.window,"getSelectedElement",dijit._editor.selection,[this.tag]);
-}
-if(a&&(a.nodeName&&a.nodeName.toLowerCase()===this.tag)){
-if(this.editor.queryCommandEnabled("unlink")){
-dojo.withGlobal(this.editor.window,"selectElementChildren",dijit._editor.selection,[a]);
-this.editor.execCommand("unlink");
-}
-}
-}
-_d=this._checkValues(_d);
-this.editor.execCommand("inserthtml",dojo.string.substitute(this.htmlTemplate,_d));
-},_onCloseDialog:function(){
-this.editor.focus();
-},_getCurrentValues:function(a){
-var url,_10,_11;
-if(a&&a.tagName.toLowerCase()===this.tag){
-url=a.getAttribute("_djrealurl")||a.getAttribute("href");
-_11=a.getAttribute("target")||"_self";
-_10=a.textContent||a.innerText;
-dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[a,true]);
-}else{
-_10=dojo.withGlobal(this.editor.window,dijit._editor.selection.getSelectedText);
-}
-return {urlInput:url||"",textInput:_10||"",targetSelect:_11||""};
-},_onOpenDialog:function(){
-var a;
-if(dojo.isIE){
-var sel=dijit.range.getSelection(this.editor.window);
-var _12=sel.getRangeAt(0);
-a=_12.endContainer;
-if(a.nodeType===3){
-a=a.parentNode;
-}
-if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){
-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){
-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(){
-this.button.set("disabled",false);
-this.button.openDropDown();
-}),10);
-}
-}
-}});
-dojo.declare("dijit._editor.plugins.ImgLinkDialog",[dijit._editor.plugins.LinkDialog],{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:"<img src=\"${urlInput}\" _djrealurl=\"${urlInput}\" alt=\"${textInput}\" />",tag:"img",_getCurrentValues:function(img){
-var url,_13;
-if(img&&img.tagName.toLowerCase()===this.tag){
-url=img.getAttribute("_djrealurl")||img.getAttribute("src");
-_13=img.getAttribute("alt");
-dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[img,true]);
-}else{
-_13=dojo.withGlobal(this.editor.window,dijit._editor.selection.getSelectedText);
-}
-return {urlInput:url||"",textInput:_13||""};
-},_isValid:function(){
-return this._urlInput.isValid();
-},_connectTagEvents:function(){
-this.inherited(arguments);
-this.editor.onLoadDeferred.addCallback(dojo.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){
-dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[t]);
-}
-}
-},_checkValues:function(_14){
-if(_14&&_14.urlInput){
-_14.urlInput=_14.urlInput.replace(/"/g,"&quot;");
-}
-if(_14&&_14.textInput){
-_14.textInput=_14.textInput.replace(/"/g,"&quot;");
-}
-return _14;
-},_onDblClick:function(e){
-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(){
-this.button.set("disabled",false);
-this.button.openDropDown();
-}),10);
-}
-}
-}});
-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;
-}
+
+// 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;
+ }
});
+
}
diff --git a/lib/dijit/_editor/plugins/NewPage.js b/lib/dijit/_editor/plugins/NewPage.js
index 14c2cfa62..7e628d364 100644
--- a/lib/dijit/_editor/plugins/NewPage.js
+++ b/lib/dijit/_editor/plugins/NewPage.js
@@ -1,36 +1,81 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.NewPage"]=true;
+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,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,{content:"<br>",_initButton:function(){
-var _1=dojo.i18n.getLocalization("dijit._editor","commands"),_2=this.editor;
-this.button=new dijit.form.Button({label:_1["newPage"],dir:_2.dir,lang:_2.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"NewPage",tabIndex:"-1",onClick:dojo.hitch(this,"_newPage")});
-},setEditor:function(_3){
-this.editor=_3;
-this._initButton();
-},_newPage:function(){
-this.editor.beginEditing();
-this.editor.set("value",this.content);
-this.editor.endEditing();
-this.editor.focus();
-}});
-dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
-if(o.plugin){
-return;
-}
-var _4=o.args.name.toLowerCase();
-if(_4==="newpage"){
-o.plugin=new dijit._editor.plugins.NewPage({content:("content" in o.args)?o.args.content:"<br>"});
-}
+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>"
+ });
+ }
+});
+
}
diff --git a/lib/dijit/_editor/plugins/Print.js b/lib/dijit/_editor/plugins/Print.js
index b2e739aee..83cf0ddc7 100644
--- a/lib/dijit/_editor/plugins/Print.js
+++ b/lib/dijit/_editor/plugins/Print.js
@@ -1,65 +1,125 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.Print"]=true;
+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,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,{_initButton:function(){
-var _1=dojo.i18n.getLocalization("dijit._editor","commands"),_2=this.editor;
-this.button=new dijit.form.Button({label:_1["print"],dir:_2.dir,lang:_2.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"Print",tabIndex:"-1",onClick:dojo.hitch(this,"_print")});
-},setEditor:function(_3){
-this.editor=_3;
-this._initButton();
-this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){
-if(!this.editor.iframe.contentWindow["print"]){
-this.button.set("disabled",true);
-}
-}));
-},_print:function(){
-var _4=this.editor.iframe;
-if(_4.contentWindow["print"]){
-if(!dojo.isOpera&&!dojo.isChrome){
-dijit.focus(_4);
-_4.contentWindow.print();
-}else{
-var _5=this.editor.document;
-var _6=this.editor.get("value");
-_6="<html><head><meta http-equiv='Content-Type' "+"content='text/html; charset='UTF-8'></head><body>"+_6+"</body></html>";
-var _7=window.open("javascript: ''","","status=0,menubar=0,location=0,toolbar=0,"+"width=1,height=1,resizable=0,scrollbars=0");
-_7.document.open();
-_7.document.write(_6);
-_7.document.close();
-var _8=[];
-var _9=_5.getElementsByTagName("style");
-if(_9){
-var i;
-for(i=0;i<_9.length;i++){
-var _a=_9[i].innerHTML;
-var _b=_7.document.createElement("style");
-_b.appendChild(_7.document.createTextNode(_a));
-_7.document.getElementsByTagName("head")[0].appendChild(_b);
-}
-}
-_7.print();
-_7.close();
-}
-}
-}});
-dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
-if(o.plugin){
-return;
-}
-var _c=o.args.name.toLowerCase();
-if(_c==="print"){
-o.plugin=new dijit._editor.plugins.Print({command:"print"});
-}
+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"});
+ }
});
+
}
diff --git a/lib/dijit/_editor/plugins/TabIndent.js b/lib/dijit/_editor/plugins/TabIndent.js
index 74cda400f..eb27f69dd 100644
--- a/lib/dijit/_editor/plugins/TabIndent.js
+++ b/lib/dijit/_editor/plugins/TabIndent.js
@@ -1,33 +1,69 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.TabIndent"]=true;
+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.experimental("dijit._editor.plugins.TabIndent");
dojo.require("dijit._editor._Plugin");
dojo.require("dijit.form.ToggleButton");
-dojo.declare("dijit._editor.plugins.TabIndent",dijit._editor._Plugin,{useDefaultCommand:false,buttonClass:dijit.form.ToggleButton,command:"tabIndent",_initButton:function(){
-this.inherited(arguments);
-var e=this.editor;
-this.connect(this.button,"onChange",function(_1){
-e.set("isTabIndent",_1);
-});
-this.updateState();
-},updateState:function(){
-this.button.set("checked",this.editor.isTabIndent,false);
-}});
-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});
-}
+
+
+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});
+ }
});
+
}
diff --git a/lib/dijit/_editor/plugins/TextColor.js b/lib/dijit/_editor/plugins/TextColor.js
index da7bbc9a6..2f24d0424 100644
--- a/lib/dijit/_editor/plugins/TextColor.js
+++ b/lib/dijit/_editor/plugins/TextColor.js
@@ -1,62 +1,105 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.TextColor"]=true;
+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,{buttonClass:dijit.form.DropDownButton,useDefaultCommand:false,constructor:function(){
-this.dropDown=new dijit.ColorPalette();
-this.connect(this.dropDown,"onChange",function(_1){
-this.editor.execCommand(this.command,_1);
+
+
+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);
+ }
+ }
});
-},updateState:function(){
-var _2=this.editor;
-var _3=this.command;
-if(!_2||!_2.isLoaded||!_3.length){
-return;
-}
-if(this.button){
-var _4;
-try{
-_4=_2.queryCommandValue(_3)||"";
-}
-catch(e){
-_4="";
-}
-}
-if(_4==""){
-_4="#000000";
-}
-if(_4=="transparent"){
-_4="#ffffff";
-}
-if(typeof _4=="string"){
-if(_4.indexOf("rgb")>-1){
-_4=dojo.colorFromRgb(_4).toHex();
-}
-}else{
-_4=((_4&255)<<16)|(_4&65280)|((_4&16711680)>>>16);
-_4=_4.toString(16);
-_4="#000000".slice(0,7-_4.length)+_4;
-}
-if(_4!==this.dropDown.get("value")){
-this.dropDown.set("value",_4,false);
-}
-}});
-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});
-}
+
+// 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
+ });
+ }
});
+
}
diff --git a/lib/dijit/_editor/plugins/ToggleDir.js b/lib/dijit/_editor/plugins/ToggleDir.js
index f5ecb7909..92e3d91c8 100644
--- a/lib/dijit/_editor/plugins/ToggleDir.js
+++ b/lib/dijit/_editor/plugins/ToggleDir.js
@@ -1,42 +1,80 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.ToggleDir"]=true;
+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,{useDefaultCommand:false,command:"toggleDir",buttonClass:dijit.form.ToggleButton,_initButton:function(){
-this.inherited(arguments);
-this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){
-var _1=this.editor.editorObject.contentWindow.document.documentElement;
-_1=_1.getElementsByTagName("body")[0];
-var _2=dojo.getComputedStyle(_1).direction=="ltr";
-this.button.set("checked",!_2);
-this.connect(this.button,"onChange","_setRtl");
-}));
-},updateState:function(){
-},_setRtl:function(_3){
-var _4="ltr";
-if(_3){
-_4="rtl";
-}
-var _5=this.editor.editorObject.contentWindow.document.documentElement;
-_5=_5.getElementsByTagName("body")[0];
-_5.dir=_4;
-}});
-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});
-}
+
+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});
+ }
});
+
}
diff --git a/lib/dijit/_editor/plugins/ViewSource.js b/lib/dijit/_editor/plugins/ViewSource.js
index 41ea2970f..e655ad21d 100644
--- a/lib/dijit/_editor/plugins/ViewSource.js
+++ b/lib/dijit/_editor/plugins/ViewSource.js
@@ -1,317 +1,555 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.plugins.ViewSource"]=true;
+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,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,{stripScripts:true,stripComments:true,stripIFrames:true,readOnly:false,_fsPlugin:null,toggle:function(){
-if(dojo.isWebKit){
-this._vsFocused=true;
-}
-this.button.set("checked",!this.button.get("checked"));
-},_initButton:function(){
-var _1=dojo.i18n.getLocalization("dijit._editor","commands"),_2=this.editor;
-this.button=new dijit.form.ToggleButton({label:_1["viewSource"],dir:_2.dir,lang:_2.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"ViewSource",tabIndex:"-1",onChange:dojo.hitch(this,"_showSource")});
-if(dojo.isIE==7){
-this._ieFixNode=dojo.create("div",{style:{opacity:"0",zIndex:"-1000",position:"absolute",top:"-1000px"}},dojo.body());
-}
-this.button.set("readOnly",false);
-},setEditor:function(_3){
-this.editor=_3;
-this._initButton();
-this.editor.addKeyHandler(dojo.keys.F12,true,true,dojo.hitch(this,function(e){
-this.button.focus();
-this.toggle();
-dojo.stopEvent(e);
-setTimeout(dojo.hitch(this,function(){
-this.editor.focus();
-}),100);
-}));
-},_showSource:function(_4){
-var ed=this.editor;
-var _5=ed._plugins;
-var _6;
-this._sourceShown=_4;
-var _7=this;
-try{
-if(!this.sourceArea){
-this._createSourceView();
-}
-if(_4){
-ed._sourceQueryCommandEnabled=ed.queryCommandEnabled;
-ed.queryCommandEnabled=function(_8){
-var _9=_8.toLowerCase();
-if(_9==="viewsource"){
-return true;
-}else{
-return false;
-}
-};
-this.editor.onDisplayChanged();
-_6=ed.get("value");
-_6=this._filter(_6);
-ed.set("value",_6);
-this._pluginList=[];
-this._disabledPlugins=dojo.filter(_5,function(p){
-if(p&&p.button&&!p.button.get("disabled")&&!(p instanceof dijit._editor.plugins.ViewSource)){
-p._vs_updateState=p.updateState;
-p.updateState=function(){
-return false;
-};
-p.button.set("disabled",true);
-if(p.command){
-switch(p.command){
-case "bold":
-case "italic":
-case "underline":
-case "strikethrough":
-case "superscript":
-case "subscript":
-p.button.set("checked",false);
-break;
-default:
-break;
-}
-}
-return true;
-}
-});
-if(this._fsPlugin){
-this._fsPlugin._getAltViewNode=function(){
-return _7.sourceArea;
-};
-}
-this.sourceArea.value=_6;
-var is=dojo.marginBox(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 _a=function(){
-var vp=dojo.window.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(dojo.hitch(this,function(){
-delete this._resizer;
-this._resize();
-}),10);
-};
-this._resizeHandle=dojo.connect(window,"onresize",this,_a);
-setTimeout(dojo.hitch(this,this._resize),100);
-this.editor.onNormalizedDisplayChanged();
-}else{
-if(!ed._sourceQueryCommandEnabled){
-return;
-}
-dojo.disconnect(this._resizeHandle);
-delete this._resizeHandle;
-ed.queryCommandEnabled=ed._sourceQueryCommandEnabled;
-if(!this._readOnly){
-_6=this.sourceArea.value;
-_6=this._filter(_6);
-ed.beginEditing();
-ed.set("value",_6);
-ed.endEditing();
-}
-dojo.forEach(this._disabledPlugins,function(p){
-p.button.set("disabled",false);
-if(p._vs_updateState){
-p.updateState=p._vs_updateState;
-}
+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);
+ }
});
-this._disabledPlugins=null;
-dojo.style(this.sourceArea,"display","none");
-dojo.style(ed.iframe,"display","block");
-delete ed._sourceQueryCommandEnabled;
-this.editor.onDisplayChanged();
-}
-setTimeout(dojo.hitch(this,function(){
-var _b=ed.domNode.parentNode;
-if(_b){
-var _c=dijit.getEnclosingWidget(_b);
-if(_c&&_c.resize){
-_c.resize();
-}
-}
-ed.resize();
-}),300);
-}
-catch(e){
-}
-},_resize:function(){
-var ed=this.editor;
-var _d=ed.getHeaderHeight();
-var fH=ed.getFooterHeight();
-var eb=dojo.position(ed.domNode);
-var _e=dojo._getPadBorderExtents(ed.iframe.parentNode);
-var _f=dojo._getMarginExtents(ed.iframe.parentNode);
-var _10=dojo._getPadBorderExtents(ed.domNode);
-var _11=dojo._getMarginExtents(ed.domNode);
-var edb={w:eb.w-(_10.w+_11.w),h:eb.h-(_d+_10.h+_11.h+fH)};
-if(this._fsPlugin&&this._fsPlugin.isFullscreen){
-var vp=dojo.window.getBox();
-edb.w=(vp.w-_10.w);
-edb.h=(vp.h-(_d+_10.h+fH));
-}
-if(dojo.isIE){
-edb.h-=2;
-}
-if(this._ieFixNode){
-var _12=-this._ieFixNode.offsetTop/1000;
-edb.w=Math.floor((edb.w+0.9)/_12);
-edb.h=Math.floor((edb.h+0.9)/_12);
-}
-dojo.marginBox(this.sourceArea,{w:edb.w-(_e.w+_f.w),h:edb.h-(_e.h+_f.h)});
-dojo.marginBox(ed.iframe.parentNode,{h:edb.h});
-},_createSourceView:function(){
-var ed=this.editor;
-var _13=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){
-dojo.style(ed.iframe.parentNode.lastChild,{width:"0px",height:"0px",padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});
-}
-ed._viewsource_oldFocus=ed.focus;
-var _14=this;
-ed.focus=function(){
-if(_14._sourceShown){
-_14.setSourceAreaCaret();
-}else{
-try{
-if(this._vsFocused){
-delete this._vsFocused;
-dijit.focus(ed.editNode);
-}else{
-ed._viewsource_oldFocus();
-}
-}
-catch(e){
-}
-}
-};
-var i,p;
-for(i=0;i<_13.length;i++){
-p=_13[i];
-if(p&&(p.declaredClass==="dijit._editor.plugins.FullScreen"||p.declaredClass===(dijit._scopeName+"._editor.plugins.FullScreen"))){
-this._fsPlugin=p;
-break;
-}
-}
-if(this._fsPlugin){
-this._fsPlugin._viewsource_getAltViewNode=this._fsPlugin._getAltViewNode;
-this._fsPlugin._getAltViewNode=function(){
-return _14._sourceShown?_14.sourceArea:this._viewsource_getAltViewNode();
-};
-}
-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(_15){
-if(_15){
-_15=_15.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig,"");
-_15=_15.replace(/<\s*script\b([^<>]|\s)*>?/ig,"");
-_15=_15.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig,"");
-}
-return _15;
-},_stripComments:function(_16){
-if(_16){
-_16=_16.replace(/<!--(.|\s){1,}?-->/g,"");
-}
-return _16;
-},_stripIFrames:function(_17){
-if(_17){
-_17=_17.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig,"");
-}
-return _17;
-},_filter:function(_18){
-if(_18){
-if(this.stripScripts){
-_18=this._stripScripts(_18);
-}
-if(this.stripComments){
-_18=this._stripComments(_18);
-}
-if(this.stripIFrames){
-_18=this._stripIFrames(_18);
-}
-}
-return _18;
-},setSourceAreaCaret:function(){
-var win=dojo.global;
-var _19=this.sourceArea;
-dijit.focus(_19);
-if(this._sourceShown&&!this.readOnly){
-if(dojo.isIE){
-if(this.sourceArea.createTextRange){
-var _1a=_19.createTextRange();
-_1a.collapse(true);
-_1a.moveStart("character",-99999);
-_1a.moveStart("character",0);
-_1a.moveEnd("character",0);
-_1a.select();
-}
-}else{
-if(win.getSelection){
-if(_19.setSelectionRange){
-_19.setSelectionRange(0,0);
-}
-}
-}
-}
-},destroy:function(){
-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);
-}});
-dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
-if(o.plugin){
-return;
-}
-var _1b=o.args.name.toLowerCase();
-if(_1b==="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});
-}
+
+// 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
+ });
+ }
});
+
}
diff --git a/lib/dijit/_editor/range.js b/lib/dijit/_editor/range.js
index 2b1bd81e3..2e5074583 100644
--- a/lib/dijit/_editor/range.js
+++ b/lib/dijit/_editor/range.js
@@ -1,453 +1,541 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.range"]=true;
+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(_1,_2){
-var _3=[],_4=[];
-var _5=_2;
-var _6=_1;
-var _7,n;
-while(_1!=_5){
-var i=0;
-_7=_1.parentNode;
-while((n=_7.childNodes[i++])){
-if(n===_1){
---i;
-break;
-}
-}
-_3.unshift(i);
-_4.unshift(i-_7.childNodes.length);
-_1=_7;
-}
-if(_3.length>0&&_6.nodeType==3){
-n=_6.previousSibling;
-while(n&&n.nodeType==3){
-_3[_3.length-1]--;
-n=n.previousSibling;
-}
-n=_6.nextSibling;
-while(n&&n.nodeType==3){
-_4[_4.length-1]++;
-n=n.nextSibling;
-}
-}
-return {o:_3,r:_4};
-};
-dijit.range.getNode=function(_8,_9){
-if(!dojo.isArray(_8)||_8.length==0){
-return _9;
-}
-var _a=_9;
-dojo.every(_8,function(i){
-if(i>=0&&i<_a.childNodes.length){
-_a=_a.childNodes[i];
-}else{
-_a=null;
-return false;
-}
-return true;
-});
-return _a;
-};
-dijit.range.getCommonAncestor=function(n1,n2,_b){
-_b=_b||n1.ownerDocument.body;
-var _c=function(n){
-var as=[];
-while(n){
-as.unshift(n);
-if(n!==_b){
-n=n.parentNode;
-}else{
-break;
-}
-}
-return as;
-};
-var _d=_c(n1);
-var _e=_c(n2);
-var m=Math.min(_d.length,_e.length);
-var _f=_d[0];
-for(var i=1;i<m;i++){
-if(_d[i]===_e[i]){
-_f=_d[i];
-}else{
-break;
-}
-}
-return _f;
-};
-dijit.range.getAncestor=function(_10,_11,_12){
-_12=_12||_10.ownerDocument.body;
-while(_10&&_10!==_12){
-var _13=_10.nodeName.toUpperCase();
-if(_11.test(_13)){
-return _10;
-}
-_10=_10.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(_14,_15,_16){
-_16=_16||_14.ownerDocument.body;
-_15=_15||dijit.range.BlockTagNames;
-var _17=null,_18;
-while(_14&&_14!==_16){
-var _19=_14.nodeName.toUpperCase();
-if(!_17&&_15.test(_19)){
-_17=_14;
-}
-if(!_18&&(/^(?:BODY|TD|TH|CAPTION)$/).test(_19)){
-_18=_14;
-}
-_14=_14.parentNode;
-}
-return {blockNode:_17,blockContainer:_18||_14.ownerDocument.body};
-};
-dijit.range.atBeginningOfContainer=function(_1a,_1b,_1c){
-var _1d=false;
-var _1e=(_1c==0);
-if(!_1e&&_1b.nodeType==3){
-if(/^[\s\xA0]+$/.test(_1b.nodeValue.substr(0,_1c))){
-_1e=true;
-}
-}
-if(_1e){
-var _1f=_1b;
-_1d=true;
-while(_1f&&_1f!==_1a){
-if(_1f.previousSibling){
-_1d=false;
-break;
-}
-_1f=_1f.parentNode;
-}
-}
-return _1d;
-};
-dijit.range.atEndOfContainer=function(_20,_21,_22){
-var _23=false;
-var _24=(_22==(_21.length||_21.childNodes.length));
-if(!_24&&_21.nodeType==3){
-if(/^[\s\xA0]+$/.test(_21.nodeValue.substr(_22))){
-_24=true;
+
+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;
}
-if(_24){
-var _25=_21;
-_23=true;
-while(_25&&_25!==_20){
-if(_25.nextSibling){
-_23=false;
-break;
+
+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;
}
-_25=_25.parentNode;
+
+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};
}
-return _23;
-};
-dijit.range.adjacentNoneTextNode=function(_26,_27){
-var _28=_26;
-var len=(0-_26.length)||0;
-var _29=_27?"nextSibling":"previousSibling";
-while(_28){
-if(_28.nodeType!=3){
-break;
+
+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;
}
-len+=_28.length;
-_28=_28[_29];
+
+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;
}
-return [_28,len];
-};
-dijit.range._w3c=Boolean(window["getSelection"]);
-dijit.range.create=function(win){
-if(dijit.range._w3c){
-return (win||dojo.global).document.createRange();
-}else{
-return new dijit.range.W3CRange;
+
+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.getSelection=function(win,_2a){
-if(dijit.range._w3c){
-return win.getSelection();
-}else{
-var s=new dijit.range.ie.selection(win);
-if(!_2a){
-s._getCurrentSelection();
+
+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;
+ }
}
-return s;
+
+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,_2b){
-this._ranges.push(r);
-if(!_2b){
-r._select();
-}
-this.rangeCount=this._ranges.length;
-};
-this.removeAllRanges=function(){
-this._ranges=[];
-this.rangeCount=0;
-};
-var _2c=function(){
-var r=win.document.selection.createRange();
-var _2d=win.document.selection.type.toUpperCase();
-if(_2d=="CONTROL"){
-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=_2c();
-if(r){
-this.addRange(r,true);
-}
-};
-},decomposeControlRange:function(_2e){
-var _2f=_2e.item(0),_30=_2e.item(_2e.length-1);
-var _31=_2f.parentNode,_32=_30.parentNode;
-var _33=dijit.range.getIndex(_2f,_31).o;
-var _34=dijit.range.getIndex(_30,_32).o+1;
-return [_31,_33,_32,_34];
-},getEndPoint:function(_35,end){
-var _36=_35.duplicate();
-_36.collapse(!end);
-var _37="EndTo"+(end?"End":"Start");
-var _38=_36.parentElement();
-var _39,_3a,_3b;
-if(_38.childNodes.length>0){
-dojo.every(_38.childNodes,function(_3c,i){
-var _3d;
-if(_3c.nodeType!=3){
-_36.moveToElementText(_3c);
-if(_36.compareEndPoints(_37,_35)>0){
-if(_3b&&_3b.nodeType==3){
-_39=_3b;
-_3d=true;
-}else{
-_39=_38;
-_3a=i;
-return false;
-}
-}else{
-if(i==_38.childNodes.length-1){
-_39=_38;
-_3a=_38.childNodes.length;
-return false;
-}
-}
-}else{
-if(i==_38.childNodes.length-1){
-_39=_3c;
-_3d=true;
-}
-}
-if(_3d&&_39){
-var _3e=dijit.range.adjacentNoneTextNode(_39)[0];
-if(_3e){
-_39=_3e.nextSibling;
-}else{
-_39=_38.firstChild;
-}
-var _3f=dijit.range.adjacentNoneTextNode(_39);
-_3e=_3f[0];
-var _40=_3f[1];
-if(_3e){
-_36.moveToElementText(_3e);
-_36.collapse(false);
-}else{
-_36.moveToElementText(_38);
-}
-_36.setEndPoint(_37,_35);
-_3a=_36.text.length-_40;
-return false;
+ 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;
}
-_3b=_3c;
-return true;
});
-}else{
-_39=_38;
-_3a=0;
-}
-if(!end&&_39.nodeType==1&&_3a==_39.childNodes.length){
-var _41=_39.nextSibling;
-if(_41&&_41.nodeType==3){
-_39=_41;
-_3a=0;
-}
-}
-return [_39,_3a];
-},setEndPoint:function(_42,_43,_44){
-var _45=_42.duplicate(),_46,len;
-if(_43.nodeType!=3){
-if(_44>0){
-_46=_43.childNodes[_44-1];
-if(_46){
-if(_46.nodeType==3){
-_43=_46;
-_44=_46.length;
-}else{
-if(_46.nextSibling&&_46.nextSibling.nodeType==3){
-_43=_46.nextSibling;
-_44=0;
-}else{
-_45.moveToElementText(_46.nextSibling?_46:_43);
-var _47=_46.parentNode;
-var _48=_47.insertBefore(_46.ownerDocument.createTextNode(" "),_46.nextSibling);
-_45.collapse(false);
-_47.removeChild(_48);
-}
-}
-}
-}else{
-_45.moveToElementText(_43);
-_45.collapse(true);
-}
-}
-if(_43.nodeType==3){
-var _49=dijit.range.adjacentNoneTextNode(_43);
-var _4a=_49[0];
-len=_49[1];
-if(_4a){
-_45.moveToElementText(_4a);
-_45.collapse(false);
-if(_4a.contentEditable!="inherit"){
-len++;
-}
-}else{
-_45.moveToElementText(_43.parentNode);
-_45.collapse(true);
-}
-_44+=len;
-if(_44>0){
-if(_45.move("character",_44)!=_44){
-console.error("Error when moving!");
-}
-}
-}
-return _45;
-},decomposeTextRange:function(_4b){
-var _4c=dijit.range.ie.getEndPoint(_4b);
-var _4d=_4c[0],_4e=_4c[1];
-var _4f=_4c[0],_50=_4c[1];
-if(_4b.htmlText.length){
-if(_4b.htmlText==_4b.text){
-_50=_4e+_4b.text.length;
-}else{
-_4c=dijit.range.ie.getEndPoint(_4b,true);
-_4f=_4c[0],_50=_4c[1];
-}
-}
-return [_4d,_4e,_4f,_50];
-},setRange:function(_51,_52,_53,_54,_55,_56){
-var _57=dijit.range.ie.setEndPoint(_51,_52,_53);
-_51.setEndPoint("StartToStart",_57);
-if(!_56){
-var end=dijit.range.ie.setEndPoint(_51,_54,_55);
-}
-_51.setEndPoint("EndToEnd",end||_57);
-return _51;
-}};
-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(_58,_59){
-_59=parseInt(_59);
-if(this.startContainer===_58&&this.startOffset==_59){
-return;
-}
-delete this._cachedBookmark;
-this.startContainer=_58;
-this.startOffset=_59;
-if(!this.endContainer){
-this.setEnd(_58,_59);
-}else{
-this._updateInternal();
-}
-},setEnd:function(_5a,_5b){
-_5b=parseInt(_5b);
-if(this.endContainer===_5a&&this.endOffset==_5b){
-return;
-}
-delete this._cachedBookmark;
-this.endContainer=_5a;
-this.endOffset=_5b;
-if(!this.startContainer){
-this.setStart(_5a,_5b);
-}else{
-this._updateInternal();
-}
-},setStartAfter:function(_5c,_5d){
-this._setPoint("setStart",_5c,_5d,1);
-},setStartBefore:function(_5e,_5f){
-this._setPoint("setStart",_5e,_5f,0);
-},setEndAfter:function(_60,_61){
-this._setPoint("setEnd",_60,_61,1);
-},setEndBefore:function(_62,_63){
-this._setPoint("setEnd",_62,_63,0);
-},_setPoint:function(_64,_65,_66,ext){
-var _67=dijit.range.getIndex(_65,_65.parentNode).o;
-this[_64](_65.parentNode,_67.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(_68){
-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)
+
}
diff --git a/lib/dijit/_editor/selection.js b/lib/dijit/_editor/selection.js
index 3c99c0610..6fed82770 100644
--- a/lib/dijit/_editor/selection.js
+++ b/lib/dijit/_editor/selection.js
@@ -1,267 +1,369 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._editor.selection"]=true;
+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.mixin(dijit._editor.selection,{getType:function(){
-if(dojo.isIE){
-return dojo.doc.selection.type.toLowerCase();
-}else{
-var _1="text";
-var _2;
-try{
-_2=dojo.global.getSelection();
-}
-catch(e){
-}
-if(_2&&_2.rangeCount==1){
-var _3=_2.getRangeAt(0);
-if((_3.startContainer==_3.endContainer)&&((_3.endOffset-_3.startOffset)==1)&&(_3.startContainer.nodeType!=3)){
-_1="control";
-}
-}
-return _1;
-}
-},getSelectedText:function(){
-if(dojo.isIE){
-if(dijit._editor.selection.getType()=="control"){
-return null;
-}
-return dojo.doc.selection.createRange().text;
-}else{
-var _4=dojo.global.getSelection();
-if(_4){
-return _4.toString();
-}
-}
-return "";
-},getSelectedHtml:function(){
-if(dojo.isIE){
-if(dijit._editor.selection.getType()=="control"){
-return null;
-}
-return dojo.doc.selection.createRange().htmlText;
-}else{
-var _5=dojo.global.getSelection();
-if(_5&&_5.rangeCount){
-var i;
-var _6="";
-for(i=0;i<_5.rangeCount;i++){
-var _7=_5.getRangeAt(i).cloneContents();
-var _8=dojo.doc.createElement("div");
-_8.appendChild(_7);
-_6+=_8.innerHTML;
-}
-return _6;
-}
-return null;
-}
-},getSelectedElement:function(){
-if(dijit._editor.selection.getType()=="control"){
-if(dojo.isIE){
-var _9=dojo.doc.selection.createRange();
-if(_9&&_9.item){
-return dojo.doc.selection.createRange().item(0);
-}
-}else{
-var _a=dojo.global.getSelection();
-return _a.anchorNode.childNodes[_a.anchorOffset];
-}
-}
-return null;
-},getParentElement:function(){
-if(dijit._editor.selection.getType()=="control"){
-var p=this.getSelectedElement();
-if(p){
-return p.parentNode;
-}
-}else{
-if(dojo.isIE){
-var r=dojo.doc.selection.createRange();
-r.collapse(true);
-return r.parentElement();
-}else{
-var _b=dojo.global.getSelection();
-if(_b){
-var _c=_b.anchorNode;
-while(_c&&(_c.nodeType!=1)){
-_c=_c.parentNode;
-}
-return _c;
-}
-}
-}
-return null;
-},hasAncestorElement:function(_d){
-return this.getAncestorElement.apply(this,arguments)!=null;
-},getAncestorElement:function(_e){
-var _f=this.getSelectedElement()||this.getParentElement();
-return this.getParentOfType(_f,arguments);
-},isTag:function(_10,_11){
-if(_10&&_10.tagName){
-var _12=_10.tagName.toLowerCase();
-for(var i=0;i<_11.length;i++){
-var _13=String(_11[i]).toLowerCase();
-if(_12==_13){
-return _13;
-}
-}
-}
-return "";
-},getParentOfType:function(_14,_15){
-while(_14){
-if(this.isTag(_14,_15).length){
-return _14;
-}
-_14=_14.parentNode;
-}
-return null;
-},collapse:function(_16){
-if(window.getSelection){
-var _17=dojo.global.getSelection();
-if(_17.removeAllRanges){
-if(_16){
-_17.collapseToStart();
-}else{
-_17.collapseToEnd();
-}
-}else{
-_17.collapse(_16);
-}
-}else{
-if(dojo.isIE){
-var _18=dojo.doc.selection.createRange();
-_18.collapse(_16);
-_18.select();
-}
-}
-},remove:function(){
-var sel=dojo.doc.selection;
-if(dojo.isIE){
-if(sel.type.toLowerCase()!="none"){
-sel.clear();
-}
-return sel;
-}else{
-sel=dojo.global.getSelection();
-sel.deleteFromDocument();
-return sel;
-}
-},selectElementChildren:function(_19,_1a){
-var win=dojo.global;
-var doc=dojo.doc;
-var _1b;
-_19=dojo.byId(_19);
-if(doc.selection&&dojo.isIE&&dojo.body().createTextRange){
-_1b=_19.ownerDocument.body.createTextRange();
-_1b.moveToElementText(_19);
-if(!_1a){
-try{
-_1b.select();
-}
-catch(e){
-}
-}
-}else{
-if(win.getSelection){
-var _1c=dojo.global.getSelection();
-if(dojo.isOpera){
-if(_1c.rangeCount){
-_1b=_1c.getRangeAt(0);
-}else{
-_1b=doc.createRange();
-}
-_1b.setStart(_19,0);
-_1b.setEnd(_19,(_19.nodeType==3)?_19.length:_19.childNodes.length);
-_1c.addRange(_1b);
-}else{
-_1c.selectAllChildren(_19);
-}
-}
-}
-},selectElement:function(_1d,_1e){
-var _1f;
-var doc=dojo.doc;
-var win=dojo.global;
-_1d=dojo.byId(_1d);
-if(dojo.isIE&&dojo.body().createTextRange){
-try{
-_1f=dojo.body().createControlRange();
-_1f.addElement(_1d);
-if(!_1e){
-_1f.select();
-}
-}
-catch(e){
-this.selectElementChildren(_1d,_1e);
-}
-}else{
-if(dojo.global.getSelection){
-var _20=win.getSelection();
-_1f=doc.createRange();
-if(_20.removeAllRanges){
-if(dojo.isOpera){
-if(_20.getRangeAt(0)){
-_1f=_20.getRangeAt(0);
-}
-}
-_1f.selectNode(_1d);
-_20.removeAllRanges();
-_20.addRange(_1f);
-}
-}
-}
-},inSelection:function(_21){
-if(_21){
-var _22;
-var doc=dojo.doc;
-var _23;
-if(dojo.global.getSelection){
-var sel=dojo.global.getSelection();
-if(sel&&sel.rangeCount>0){
-_23=sel.getRangeAt(0);
-}
-if(_23&&_23.compareBoundaryPoints&&doc.createRange){
-try{
-_22=doc.createRange();
-_22.setStart(_21,0);
-if(_23.compareBoundaryPoints(_23.START_TO_END,_22)===1){
-return true;
-}
-}
-catch(e){
-}
-}
-}else{
-if(doc.selection){
-_23=doc.selection.createRange();
-try{
-_22=_21.ownerDocument.body.createControlRange();
-if(_22){
-_22.addElement(_21);
-}
-}
-catch(e1){
-try{
-_22=_21.ownerDocument.body.createTextRange();
-_22.moveToElementText(_21);
-}
-catch(e2){
-}
-}
-if(_23&&_22){
-if(_23.compareEndPoints("EndToStart",_22)===1){
-return true;
-}
-}
-}
-}
-}
-return false;
-}});
+
+
+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
+ }
+
+});
+
}
diff --git a/lib/dijit/_tree/dndSource.js b/lib/dijit/_tree/dndSource.js
index 41f9f2adc..2f2c968be 100644
--- a/lib/dijit/_tree/dndSource.js
+++ b/lib/dijit/_tree/dndSource.js
@@ -1,14 +1,19 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit._tree.dndSource"]=true;
+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");
-dojo.deprecated("dijit._tree.dndSource has been moved to dijit.tree.dndSource, use that instead","","2.0");
-dijit._tree.dndSource=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;
+
}
diff --git a/lib/dijit/dijit-all.js b/lib/dijit/dijit-all.js
index 40393115c..e504b096e 100644
--- a/lib/dijit/dijit-all.js
+++ b/lib/dijit/dijit-all.js
@@ -1,14 +1,77 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
-/*
- This is an optimized version of Dojo, built for deployment and not for
- development. To get sources and documentation, please visit:
- http://dojotoolkit.org
-*/
+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.
+};
+=====*/
-if(!dojo._hasResource["dojo.colors"]){dojo._hasResource["dojo.colors"]=true;dojo.provide("dojo.colors");(function(){var _1=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(_2,_3){var m=_2.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,_3);}return dojo.colorFromArray(c,_3);}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=[_1(m1,m2,H+1/3)*256,_1(m1,m2,H)*256,_1(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,_3);}}return null;};var _4=function(c,_5,_6){c=Number(c);return isNaN(c)?_6:c<_5?_5:c>_6?_6:c;};dojo.Color.prototype.sanitize=function(){var t=this;t.r=Math.round(_4(t.r,0,255));t.g=Math.round(_4(t.g,0,255));t.b=Math.round(_4(t.b,0,255));t.a=_4(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.i18n.getLocalization=function(_7,_8,_9){_9=dojo.i18n.normalizeLocale(_9);var _a=_9.split("-");var _b=[_7,"nls",_8].join(".");var _c=dojo._loadedModules[_b];if(_c){var _d;for(var i=_a.length;i>0;i--){var _e=_a.slice(0,i).join("_");if(_c[_e]){_d=_c[_e];break;}}if(!_d){_d=_c.ROOT;}if(_d){var _f=function(){};_f.prototype=_d;return new _f();}}throw new Error("Bundle not found: "+_8+" in "+_7+" , locale="+_9);};dojo.i18n.normalizeLocale=function(_10){var _11=_10?_10.toLowerCase():dojo.locale;if(_11=="root"){_11="ROOT";}return _11;};dojo.i18n._requireLocalization=function(_12,_13,_14,_15){var _16=dojo.i18n.normalizeLocale(_14);var _17=[_12,"nls",_13].join(".");var _18="";if(_15){var _19=_15.split(",");for(var i=0;i<_19.length;i++){if(_16["indexOf"](_19[i])==0){if(_19[i].length>_18.length){_18=_19[i];}}}if(!_18){_18="ROOT";}}var _1a=_15?_18:_16;var _1b=dojo._loadedModules[_17];var _1c=null;if(_1b){if(dojo.config.localizationComplete&&_1b._built){return;}var _1d=_1a.replace(/-/g,"_");var _1e=_17+"."+_1d;_1c=dojo._loadedModules[_1e];}if(!_1c){_1b=dojo["provide"](_17);var _1f=dojo._getModuleSymbols(_12);var _20=_1f.concat("nls").join("/");var _21;dojo.i18n._searchLocalePath(_1a,_15,function(loc){var _22=loc.replace(/-/g,"_");var _23=_17+"."+_22;var _24=false;if(!dojo._loadedModules[_23]){dojo["provide"](_23);var _25=[_20];if(loc!="ROOT"){_25.push(loc);}_25.push(_13);var _26=_25.join("/")+".js";_24=dojo._loadPath(_26,null,function(_27){var _28=function(){};_28.prototype=_21;_1b[_22]=new _28();for(var j in _27){_1b[_22][j]=_27[j];}});}else{_24=true;}if(_24&&_1b[_22]){_21=_1b[_22];}else{_1b[_22]=_21;}if(_15){return true;}});}if(_15&&_16!=_18){_1b[_16.replace(/-/g,"_")]=_1b[_18.replace(/-/g,"_")];}};(function(){var _29=dojo.config.extraLocale;if(_29){if(!_29 instanceof Array){_29=[_29];}var req=dojo.i18n._requireLocalization;dojo.i18n._requireLocalization=function(m,b,_2a,_2b){req(m,b,_2a,_2b);if(_2a){return;}for(var i=0;i<_29.length;i++){req(m,b,_29[i],_2b);}};}})();dojo.i18n._searchLocalePath=function(_2c,_2d,_2e){_2c=dojo.i18n.normalizeLocale(_2c);var _2f=_2c.split("-");var _30=[];for(var i=_2f.length;i>0;i--){_30.push(_2f.slice(0,i).join("-"));}_30.push(false);if(_2d){_30.reverse();}for(var j=_30.length-1;j>=0;j--){var loc=_30[j]||"ROOT";var _31=_2e(loc);if(_31){break;}}};dojo.i18n._preloadLocalizations=function(_32,_33){function _34(_35){_35=dojo.i18n.normalizeLocale(_35);dojo.i18n._searchLocalePath(_35,true,function(loc){for(var i=0;i<_33.length;i++){if(_33[i]==loc){dojo["require"](_32+"_"+loc);return true;}}return false;});};_34();var _36=dojo.config.extraLocale||[];for(var i=0;i<_36.length;i++){_34(_36[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(_37,_38){this._cells=[];var url=this._blankGif;var _39=dojo.getObject(this.dyeClass);for(var row=0;row<_37.length;row++){var _3a=dojo.create("tr",{tabIndex:"-1"},this.gridNode);for(var col=0;col<_37[row].length;col++){var _3b=_37[row][col];if(_3b){var _3c=new _39(_3b);var _3d=dojo.create("td",{"class":this.cellClass,tabIndex:"-1",title:_38[_3b]});_3c.fillCell(_3d,url);this.connect(_3d,"ondijitclick","_onCellClick");this._trackMouseState(_3d,this.cellClass);dojo.place(_3d,_3a);_3d.index=this._cells.length;this._cells.push({node:_3d,dye:_3c});}}}this._xDim=_37[0].length;this._yDim=_37.length;var _3e={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};for(var key in _3e){this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _3f=_3e[key];return function(_40){this._navigateByKey(_3f,_40);};}(),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 _41=evt.currentTarget,_42=this._getDye(_41).getValue();this._setCurrent(_41);setTimeout(dojo.hitch(this,function(){dijit.focus(_41);this._setValueAttr(_42,true);}));dojo.removeClass(_41,"dijitPaletteCellHover");dojo.stopEvent(evt);},_setCurrent:function(_43){if("_currentFocus" in this){dojo.attr(this._currentFocus,"tabIndex","-1");}this._currentFocus=_43;if(_43){dojo.attr(_43,"tabIndex",this.tabIndex);}},_setValueAttr:function(_44,_45){this.value=null;if(this._selectedCell>=0){dojo.removeClass(this._cells[this._selectedCell].node,"dijitPaletteCellSelected");}this._selectedCell=-1;if(_44){for(var i=0;i<this._cells.length;i++){if(_44==this._cells[i].dye.getValue()){this._selectedCell=i;this.value=_44;dojo.addClass(this._cells[i].node,"dijitPaletteCellSelected");if(_45||_45===undefined){this.onChange(_44);}break;}}}},onChange:function(_46){},_navigateByKey:function(_47,_48){if(_48==-1){return;}var _49=this._currentFocus.index+_47;if(_49<this._cells.length&&_49>-1){var _4a=this._cells[_49].node;this._setCurrent(_4a);setTimeout(dojo.hitch(dijit,"focus",_4a),0);}},_getDye:function(_4b){return this._cells[_4b.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"]]},_imagePaths:{"7x10":dojo.moduleUrl("dijit.themes","a11y/colors7x10.png"),"3x4":dojo.moduleUrl("dijit.themes","a11y/colors3x4.png"),"7x10-rtl":dojo.moduleUrl("dijit.themes","a11y/colors7x10-rtl.png"),"3x4-rtl":dojo.moduleUrl("dijit.themes","a11y/colors3x4-rtl.png")},templateString:dojo.cache("dijit","templates/ColorPalette.html","<div class=\"dijitInline dijitColorPalette\">\n\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\" alt=\"\"/>\n\t<table class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\">\n\t\t<tbody dojoAttachPoint=\"gridNode\"></tbody>\n\t</table>\n</div>\n"),baseClass:"dijitColorPalette",dyeClass:"dijit._Color",buildRendering:function(){this.inherited(arguments);this.imageNode.setAttribute("src",this._imagePaths[this.palette+(this.isLeftToRight()?"":"-rtl")].toString());var _4c=dojo.i18n.getLocalization("dojo","colors",this.lang);this._preparePalette(this._palettes[this.palette],_4c);}});dojo.declare("dijit._Color",dojo.Color,{constructor:function(_4d){this._alias=_4d;this.setColor(dojo.Color.named[_4d]);},getValue:function(){return this.toHex();},fillCell:function(_4e,_4f){dojo.create("img",{src:_4f,"class":"dijitPaletteImg",alt:this._alias},_4e);}});}if(!dojo._hasResource["dijit.Declaration"]){dojo._hasResource["dijit.Declaration"]=true;dojo.provide("dijit.Declaration");dojo.declare("dijit.Declaration",dijit._Widget,{_noScript:true,widgetClass:"",defaults:null,mixins:[],buildRendering:function(){var src=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef),_50=dojo.query("> script[type^='dojo/method'][event]",src).orphan(),_51=dojo.query("> script[type^='dojo/method']",src).orphan(),_52=dojo.query("> script[type^='dojo/connect']",src).orphan(),_53=src.nodeName;var _54=this.defaults||{};dojo.forEach(_50,function(s){var evt=s.getAttribute("event"),_55=dojo.parser._functionFromScript(s);_54[evt]=_55;});this.mixins=this.mixins.length?dojo.map(this.mixins,function(_56){return dojo.getObject(_56);}):[dijit._Widget,dijit._Templated];_54.widgetsInTemplate=true;_54._skipNodeCache=true;_54.templateString="<"+_53+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint")||"")+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent")||"")+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_53+">";dojo.query("[dojoType]",src).forEach(function(_57){_57.removeAttribute("dojoType");});var wc=dojo.declare(this.widgetClass,this.mixins,_54);var _58=_52.concat(_51);dojo.forEach(_58,function(s){var evt=s.getAttribute("event")||"postscript",_59=dojo.parser._functionFromScript(s);dojo.connect(wc.prototype,evt,_59);});}});}if(!dojo._hasResource["dojo.dnd.common"]){dojo._hasResource["dojo.dnd.common"]=true;dojo.provide("dojo.dnd.common");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.dnd.getViewport=function(){var d=dojo.doc,dd=d.documentElement,w=window,b=dojo.body();if(dojo.isMozilla){return {w:dd.clientWidth,h:w.innerHeight};}else{if(!dojo.isOpera&&w.innerWidth){return {w:w.innerWidth,h:w.innerHeight};}else{if(!dojo.isOpera&&dd&&dd.clientWidth){return {w:dd.clientWidth,h:dd.clientHeight};}else{if(b.clientWidth){return {w:b.clientWidth,h:b.clientHeight};}}}}return null;};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.dnd.getViewport(),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 _5a=n.scrollLeft,_5b=n.scrollTop;n.scrollLeft=n.scrollLeft+dx;n.scrollTop=n.scrollTop+dy;if(_5a!=n.scrollLeft||_5b!=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(_5c,e,_5d){this.node=dojo.byId(_5c);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=this.host=_5d,d=_5c.ownerDocument,_5e=dojo.connect(d,"onmousemove",this,"onFirstMove");this.events=[dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent),_5e];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.pop());},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(_5f,_60){this.node=dojo.byId(_5f);if(!_60){_60={};}this.handle=_60.handle?dojo.byId(_60.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_60.delay>0?_60.delay:0;this.skip=_60.skip;this.mover=_60.mover?_60.mover:dojo.dnd.Mover;this.events=[dojo.connect(this.handle,"onmousedown",this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_61,_62){return new dojo.dnd.Moveable(_62,_61);},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,"onmouseup",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(_63){dojo.publish("/dnd/move/start",[_63]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_64){dojo.publish("/dnd/move/stop",[_64]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_65,e){},onMove:function(_66,_67,e){this.onMoving(_66,_67);var s=_66.node.style;s.left=_67.l+"px";s.top=_67.t+"px";this.onMoved(_66,_67);},onMoving:function(_68,_69){},onMoved:function(_6a,_6b){}});}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(_6c,_6d){return new dojo.dnd.move.constrainedMoveable(_6d,_6c);},constructor:function(_6e,_6f){if(!_6f){_6f={};}this.constraints=_6f.constraints;this.within=_6f.within;},onFirstMove:function(_70){var c=this.constraintBox=this.constraints.call(this,_70);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo.marginBox(_70.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_71,_72){var c=this.constraintBox,s=_71.node.style;s.left=(_72.l<c.l?c.l:c.r<_72.l?c.r:_72.l)+"px";s.top=(_72.t<c.t?c.t:c.b<_72.t?c.b:_72.t)+"px";}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_73,_74){return new dojo.dnd.move.boxConstrainedMoveable(_74,_73);},constructor:function(_75,_76){var box=_76&&_76.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_77,_78){return new dojo.dnd.move.parentConstrainedMoveable(_78,_77);},constructor:function(_79,_7a){var _7b=_7a&&_7a.area;this.constraints=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(_7b=="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(_7b=="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(_7b=="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.move.constrainedMover=function(fun,_7c){dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");var _7d=function(_7e,e,_7f){dojo.dnd.Mover.call(this,_7e,e,_7f);};dojo.extend(_7d,dojo.dnd.Mover.prototype);dojo.extend(_7d,{onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox,c=this.constraintBox,l=m.l+e.pageX,t=m.t+e.pageY;l=l<c.l?c.l:c.r<l?c.r:l;t=t<c.t?c.t:c.b<t?c.b:t;this.host.onMove(this,{l:l,t:t});},onFirstMove:function(){dojo.dnd.Mover.prototype.onFirstMove.call(this);var c=this.constraintBox=fun.call(this);c.r=c.l+c.w;c.b=c.t+c.h;if(_7c){var mb=dojo.marginBox(this.node);c.r-=mb.w;c.b-=mb.h;}}});return _7d;};dojo.dnd.move.boxConstrainedMover=function(box,_80){dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");return dojo.dnd.move.constrainedMover(function(){return box;},_80);};dojo.dnd.move.parentConstrainedMover=function(_81,_82){dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");var fun=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(_81=="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(_81=="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(_81=="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;};return dojo.dnd.move.constrainedMover(fun,_82);};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 _83=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(_84,_85){if(!_85){_85={};}if(_85.timeout&&typeof _85.timeout=="number"&&_85.timeout>=0){this.timeout=_85.timeout;}},markupFactory:function(_86,_87){return new dojo.dnd.TimedMoveable(_87,_86);},onMoveStop:function(_88){if(_88._timer){clearTimeout(_88._timer);_83.call(this,_88,_88._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_89,_8a){_89._leftTop=_8a;if(!_89._timer){var _8b=this;_89._timer=setTimeout(function(){_89._timer=null;_83.call(_8b,_89,_89._leftTop);},this.timeout);}}});})();}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(_8c){var _8d=this;dojo.mixin(_8d,_8c);_8d.node=_8c.node;_8d._showArgs=dojo.mixin({},_8c);_8d._showArgs.node=_8d.node;_8d._showArgs.duration=_8d.showDuration;_8d.showAnim=_8d.showFunc(_8d._showArgs);_8d._hideArgs=dojo.mixin({},_8c);_8d._hideArgs.node=_8d.node;_8d._hideArgs.duration=_8d.hideDuration;_8d.hideAnim=_8d.hideFunc(_8d._hideArgs);dojo.connect(_8d.showAnim,"beforeBegin",dojo.hitch(_8d.hideAnim,"stop",true));dojo.connect(_8d.hideAnim,"beforeBegin",dojo.hitch(_8d.showAnim,"stop",true));},show:function(_8e){return this.showAnim.play(_8e||0);},hide:function(_8f){return this.hideAnim.play(_8f||0);}});}if(!dojo._hasResource["dojo.fx"]){dojo._hasResource["dojo.fx"]=true;dojo.provide("dojo.fx");(function(){var d=dojo,_90={_fire:function(evt,_91){if(this[evt]){this[evt].apply(this,_91||[]);}return this;}};var _92=function(_93){this._index=-1;this._animations=_93||[];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(_92,{_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(_94,_95){if(!this._current){this._current=this._animations[this._index=0];}if(!_95&&this._current.status()=="playing"){return this;}var _96=d.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_97=d.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_98=d.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);d.disconnect(_96);d.disconnect(_97);d.disconnect(_98);});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(_99,_9a){this.pause();var _9b=this.duration*_99;this._current=null;d.some(this._animations,function(a){if(a.duration<=_9b){this._current=a;return true;}_9b-=a.duration;return false;});if(this._current){this._current.gotoPercent(_9b/this._current.duration,_9a);}return this;},stop:function(_9c){if(this._current){if(_9c){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(_92,_90);dojo.fx.chain=function(_9d){return new _92(_9d);};var _9e=function(_9f){this._animations=_9f||[];this._connects=[];this._finished=0;this.duration=0;d.forEach(_9f,function(a){var _a0=a.duration;if(a.delay){_a0+=a.delay;}if(this.duration<_a0){this.duration=_a0;}this._connects.push(d.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new d.Animation({curve:[0,1],duration:this.duration});var _a1=this;d.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){_a1._connects.push(d.connect(_a1._pseudoAnimation,evt,function(){_a1._fire(evt,arguments);}));});};d.extend(_9e,{_doAction:function(_a2,_a3){d.forEach(this._animations,function(a){a[_a2].apply(a,_a3);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_a4,_a5){var t=this._pseudoAnimation;t[_a4].apply(t,_a5);},play:function(_a6,_a7){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(_a8,_a9){var ms=this.duration*_a8;d.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_a9);});this._call("gotoPercent",arguments);return this;},stop:function(_aa){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(_9e,_90);dojo.fx.combine=function(_ab){return new _9e(_ab);};dojo.fx.wipeIn=function(_ac){var _ad=_ac.node=d.byId(_ac.node),s=_ad.style,o;var _ae=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 _af=d.style(_ad,"height");return Math.max(_af,1);}},end:function(){return _ad.scrollHeight;}}}},_ac));d.connect(_ae,"onEnd",function(){s.height="auto";s.overflow=o;});return _ae;};dojo.fx.wipeOut=function(_b0){var _b1=_b0.node=d.byId(_b0.node),s=_b1.style,o;var _b2=d.animateProperty(d.mixin({properties:{height:{end:1}}},_b0));d.connect(_b2,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});d.connect(_b2,"onEnd",function(){s.overflow=o;s.height="auto";s.display="none";});return _b2;};dojo.fx.slideTo=function(_b3){var _b4=_b3.node=d.byId(_b3.node),top=null,_b5=null;var _b6=(function(n){return function(){var cs=d.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);_b5=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=d.position(n,true);top=ret.y;_b5=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=_b5+"px";}};})(_b4);_b6();var _b7=d.animateProperty(d.mixin({properties:{top:_b3.top||0,left:_b3.left||0}},_b3));d.connect(_b7,"beforeBegin",_b7,_b6);return _b7;};})();}if(!dojo._hasResource["dijit.form._FormMixin"]){dojo._hasResource["dijit.form._FormMixin"]=true;dojo.provide("dijit.form._FormMixin");dojo.declare("dijit.form._FormMixin",null,{reset:function(){dojo.forEach(this.getDescendants(),function(_b8){if(_b8.reset){_b8.reset();}});},validate:function(){var _b9=false;return dojo.every(dojo.map(this.getDescendants(),function(_ba){_ba._hasBeenBlurred=true;var _bb=_ba.disabled||!_ba.validate||_ba.validate();if(!_bb&&!_b9){dojo.window.scrollIntoView(_ba.containerNode||_ba.domNode);_ba.focus();_b9=true;}return _bb;}),function(_bc){return _bc;});},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(_bd){if(!_bd.name){return;}var _be=map[_bd.name]||(map[_bd.name]=[]);_be.push(_bd);});for(var _bf in map){if(!map.hasOwnProperty(_bf)){continue;}var _c0=map[_bf],_c1=dojo.getObject(_bf,false,obj);if(_c1===undefined){continue;}if(!dojo.isArray(_c1)){_c1=[_c1];}if(typeof _c0[0].checked=="boolean"){dojo.forEach(_c0,function(w,i){w.set("value",dojo.indexOf(_c1,w.value)!=-1);});}else{if(_c0[0].multiple){_c0[0].set("value",_c1);}else{dojo.forEach(_c0,function(w,i){w.set("value",_c1[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(_c2){var _c3=_c2.name;if(!_c3||_c2.disabled){return;}var _c4=_c2.get("value");if(typeof _c2.checked=="boolean"){if(/Radio/.test(_c2.declaredClass)){if(_c4!==false){dojo.setObject(_c3,_c4,obj);}else{_c4=dojo.getObject(_c3,false,obj);if(_c4===undefined){dojo.setObject(_c3,null,obj);}}}else{var ary=dojo.getObject(_c3,false,obj);if(!ary){ary=[];dojo.setObject(_c3,ary,obj);}if(_c4!==false){ary.push(_c4);}}}else{var _c5=dojo.getObject(_c3,false,obj);if(typeof _c5!="undefined"){if(dojo.isArray(_c5)){_c5.push(_c4);}else{dojo.setObject(_c3,[_c5,_c4],obj);}}else{dojo.setObject(_c3,_c4,obj);}}});return obj;},isValid:function(){this._invalidWidgets=dojo.filter(this.getDescendants(),function(_c6){return !_c6.disabled&&_c6.isValid&&!_c6.isValid();});return !this._invalidWidgets.length;},onValidStateChange:function(_c7){},_widgetChange:function(_c8){var _c9=this._lastValidState;if(!_c8||this._lastValidState===undefined){_c9=this.isValid();if(this._lastValidState===undefined){this._lastValidState=_c9;}}else{if(_c8.isValid){this._invalidWidgets=dojo.filter(this._invalidWidgets||[],function(w){return (w!=_c8);},this);if(!_c8.isValid()&&!_c8.get("disabled")){this._invalidWidgets.push(_c8);}_c9=(this._invalidWidgets.length===0);}}if(_c9!==this._lastValidState){this._lastValidState=_c9;this.onValidStateChange(_c9);}},connectChildren:function(){dojo.forEach(this._changeConnections,dojo.hitch(this,"disconnect"));var _ca=this;var _cb=(this._changeConnections=[]);dojo.forEach(dojo.filter(this.getDescendants(),function(_cc){return _cc.validate;}),function(_cd){_cb.push(_ca.connect(_cd,"validate",dojo.hitch(_ca,"_widgetChange",_cd)));_cb.push(_ca.connect(_cd,"_setDisabledAttr",dojo.hitch(_ca,"_widgetChange",_cd)));});this._widgetChange(null);},startup:function(){this.inherited(arguments);this._changeConnections=[];this.connectChildren();}});}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(_ce){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.get("value"));},_getFocusItems:function(_cf){var _d0=dijit._getTabNavigable(dojo.byId(_cf));this._firstFocusItem=_d0.lowest||_d0.first||_cf;this._lastFocusItem=_d0.last||_d0.highest||this._firstFocusItem;if(dojo.isMoz&&this._firstFocusItem.tagName.toLowerCase()=="input"&&dojo.getNodeProp(this._firstFocusItem,"type").toLowerCase()=="file"){dojo.attr(_cf,"tabIndex","0");this._firstFocusItem=_cf;}}});}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");},_setClassAttr:function(_d1){this.node.className="dijitDialogUnderlay "+_d1;},postCreate:function(){dojo.body().appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _d2=dojo.window.getBox();os.top=_d2.t+"px";os.left=_d2.l+"px";is.width=_d2.w+"px";is.height=_d2.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();this.domNode.style.display="none";},uninitialize:function(){if(this.bgIframe){this.bgIframe.destroy();}this.inherited(arguments);}});}if(!dojo._hasResource["dojo.html"]){dojo._hasResource["dojo.html"]=true;dojo.provide("dojo.html");(function(){var _d3=0,d=dojo;dojo.html._secureForInnerHtml=function(_d4){return _d4.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");};dojo.html._emptyNode=dojo.empty;dojo.html._setNodeContent=function(_d5,_d6){d.empty(_d5);if(_d6){if(typeof _d6=="string"){_d6=d._toDom(_d6,_d5.ownerDocument);}if(!_d6.nodeType&&d.isArrayLike(_d6)){for(var _d7=_d6.length,i=0;i<_d6.length;i=_d7==_d6.length?i+1:0){d.place(_d6[i],_d5,"last");}}else{d.place(_d6,_d5,"last");}}return _d5;};dojo.declare("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,constructor:function(_d8,_d9){dojo.mixin(this,_d8||{});_d9=this.node=dojo.byId(this.node||_d9);if(!this.id){this.id=["Setter",(_d9)?_d9.id||_d9.tagName:"",_d3++].join("_");}},set:function(_da,_db){if(undefined!==_da){this.content=_da;}if(_db){this._mixin(_db);}this.onBegin();this.setContent();this.onEnd();return this.node;},setContent:function(){var _dc=this.node;if(!_dc){throw new Error(this.declaredClass+": setContent given no node");}try{_dc=dojo.html._setNodeContent(_dc,this.content);}catch(e){var _dd=this.onContentError(e);try{_dc.innerHTML=_dd;}catch(e){console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);}}this.node=_dc;},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 _de=this.content;if(dojo.isString(_de)){if(this.cleanContent){_de=dojo.html._secureForInnerHtml(_de);}if(this.extractContent){var _df=_de.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_df){_de=_df[1];}}}this.empty();this.content=_de;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(_e0){var _e1={},key;for(key in _e0){if(key in _e1){continue;}this[key]=_e0[key];}},_parse:function(){var _e2=this.node;try{this.parseResults=dojo.parser.parse({rootNode:_e2,dir:this.dir,lang:this.lang});}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(_e3,err,_e4){var _e5=this["on"+_e3+"Error"].call(this,err);if(_e4){console.error(_e4,err);}else{if(_e5){dojo.html._setNodeContent(this.node,_e5,true);}}}});dojo.html.set=function(_e6,_e7,_e8){if(undefined==_e7){console.warn("dojo.html.set: no cont argument provided, using empty string");_e7="";}if(!_e8){return dojo.html._setNodeContent(_e6,_e7,true);}else{var op=new dojo.html._ContentSetter(dojo.mixin(_e8,{content:_e7,node:_e6}));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,{href:"",extractContent:false,parseOnLoad:true,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",doLayout:true,ioArgs:{},isContainer:true,isLayoutContainer:true,onLoadDeferred:null,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{title:[]}),postMixInProperties:function(){this.inherited(arguments);var _e9=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_e9);this.errorMessage=dojo.string.substitute(this.errorMessage,_e9);if(!this.href&&this.srcNodeRef&&this.srcNodeRef.innerHTML){this.isLoaded=true;}},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},postCreate:function(){this.domNode.title="";if(!dojo.attr(this.domNode,"role")){dijit.setWaiRole(this.domNode,"group");}dojo.addClass(this.domNode,this.baseClass);},startup:function(){if(this._started){return;}var _ea=dijit._Contained.prototype.getParent.call(this);this._childOfLayoutWidget=_ea&&_ea.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;if(this.isLoaded){dojo.forEach(this.getChildren(),function(_eb){_eb.startup();});}if(this._isShown()||this.preload){this._onShow();}this.inherited(arguments);},_checkIfSingleChild:function(){var _ec=dojo.query("> *",this.containerNode).filter(function(_ed){return _ed.tagName!=="SCRIPT";}),_ee=_ec.filter(function(_ef){return dojo.hasAttr(_ef,"dojoType")||dojo.hasAttr(_ef,"widgetId");}),_f0=dojo.filter(_ee.map(dijit.byNode),function(_f1){return _f1&&_f1.domNode&&_f1.resize;});if(_ec.length==_ee.length&&_f0.length==1){this._singleChild=_f0[0];}else{delete this._singleChild;}dojo.toggleClass(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},setHref:function(_f2){dojo.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");return this.set("href",_f2);},_setHrefAttr:function(_f3){this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this.href=_f3;if(this._created&&(this.preload||this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(_f4){dojo.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");this.set("content",_f4);},_setContentAttr:function(_f5){this.href="";this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this._setContent(_f5||"");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(_f6){if(this._beingDestroyed){return;}this.inherited(arguments);},resize:function(_f7,_f8){if(!this._wasShown){this._onShow();}this._resizeCalled=true;if(_f7){dojo.marginBox(this.domNode,_f7);}var cn=this.containerNode;if(cn===this.domNode){var mb=_f8||{};dojo.mixin(mb,_f7||{});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();},_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 _f9=this.domNode;return (_f9.style.display!="none")&&(_f9.style.visibility!="hidden")&&!dojo.hasClass(_f9,"dijitHidden");}}},_onShow:function(){if(this.href){if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){this.refresh();}}else{if(!this._childOfLayoutWidget&&this._needLayout){this._layoutChildren();}}this.inherited(arguments);this._wasShown=true;},refresh:function(){this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var _fa=this;var _fb={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(dojo.isObject(this.ioArgs)){dojo.mixin(_fb,this.ioArgs);}var _fc=(this._xhrDfd=(this.ioMethod||dojo.xhrGet)(_fb));_fc.addCallback(function(_fd){try{_fa._isDownloaded=true;_fa._setContent(_fd,false);_fa.onDownloadEnd();}catch(err){_fa._onError("Content",err);}delete _fa._xhrDfd;return _fd;});_fc.addErrback(function(err){if(!_fc.canceled){_fa._onError("Download",err);}delete _fa._xhrDfd;return err;});delete this._hrefChanged;},_onLoadHandler:function(_fe){this.isLoaded=true;try{this.onLoadDeferred.callback(_fe);this.onLoad(_fe);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);}},_onUnloadHandler:function(){this.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 _ff=this._contentSetter;dojo.forEach(this.getChildren(),function(_100){if(_100.destroyRecursive){_100.destroyRecursive();}});if(_ff){dojo.forEach(_ff.parseResults,function(_101){if(_101.destroyRecursive&&_101.domNode&&_101.domNode.parentNode==dojo.body()){_101.destroyRecursive();}});delete _ff.parseResults;}dojo.html._emptyNode(this.containerNode);delete this._singleChild;},_setContent:function(cont,_102){this.destroyDescendants();var _103=this._contentSetter;if(!(_103&&_103 instanceof dojo.html._ContentSetter)){_103=this._contentSetter=new dojo.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){var _104=this.onContentError(e);try{this.containerNode.innerHTML=_104;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _105=dojo.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:this.parseOnLoad,dir:this.dir,lang:this.lang},this._contentSetterParams||{});dojo.mixin(_103,_105);_103.set((dojo.isObject(cont)&&cont.domNode)?cont.domNode:cont);delete this._contentSetterParams;if(!_102){dojo.forEach(this.getChildren(),function(_106){if(!this.parseOnLoad||_106.getParent){_106.startup();}},this);this._scheduleLayout();this._onLoadHandler(cont);}},_onError:function(type,err,_107){this.onLoadDeferred.errback(err);var _108=this["on"+type+"Error"].call(this,err);if(_107){console.error(_107,err);}else{if(_108){this._setContent(_108,true);}}},_scheduleLayout:function(){if(this._isShown()){this._layoutChildren();}else{this._needLayout=true;}},_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(_109){if(_109.resize){_109.resize();}});}delete this._needLayout;},onLoad:function(data){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(_10a){},onDownloadError:function(_10b){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 waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presentation\"></div>\n</div>\n"),postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");this.containerNode.title=this.title;},orient:function(node,_10c,_10d){var c=this._currentOrientClass;if(c){dojo.removeClass(this.domNode,c);}c="dijitTooltipAB"+(_10d.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_10d.charAt(0)=="T"?"Below":"Above");dojo.addClass(this.domNode,c);this._currentOrientClass=c;},onOpen:function(pos){this.orient(this.domNode,pos.aroundCorner,pos.corner);this._onShow();if(this.autofocus){this._getFocusItems(this.containerNode);dijit.focus(this._firstFocusItem);}},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 _10e=(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(!_10e){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_10e){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\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"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=\"onclick: onCancel\" title=\"${buttonCancel}\">\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 _10f=dojo.i18n.getLocalization("dijit","common");dojo.mixin(this,_10f);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){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});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(" ")};this._fadeIn=dojo.fadeIn({node:node,duration:this.duration,beforeBegin:dojo.hitch(this,function(){var _110=dijit._underlay;if(!_110){_110=dijit._underlay=new dijit.DialogUnderlay(this.underlayAttrs);}else{_110.set(this.underlayAttrs);}var ds=dijit._dialogStack,_111=948+ds.length*2;if(ds.length==1){_110.show();}dojo.style(dijit._underlay.domNode,"zIndex",_111);dojo.style(this.domNode,"zIndex",_111+1);}),onEnd:dojo.hitch(this,function(){if(this.autofocus){this._getFocusItems(this.domNode);dijit.focus(this._firstFocusItem);}})});this._fadeOut=dojo.fadeOut({node:node,duration:this.duration,onEnd:dojo.hitch(this,function(){node.style.display="none";var ds=dijit._dialogStack;if(ds.length==0){dijit._underlay.hide();}else{dojo.style(dijit._underlay.domNode,"zIndex",948+ds.length*2);dijit._underlay.set(ds[ds.length-1].underlayAttrs);}if(this.refocus){var _112=this._savedFocus;if(ds.length>0){var pd=ds[ds.length-1];if(!dojo.isDescendant(_112.node,pd.domNode)){pd._getFocusItems(pd.domNode);_112=pd._firstFocusItem;}}dijit.focus(_112);}})});},uninitialize:function(){var _113=false;if(this._fadeIn&&this._fadeIn.status()=="playing"){_113=true;this._fadeIn.stop();}if(this._fadeOut&&this._fadeOut.status()=="playing"){_113=true;this._fadeOut.stop();}if((this.open||_113)&&!dijit._underlay._destroyed){dijit._underlay.hide();}if(this._moveable){this._moveable.destroy();}this.inherited(arguments);},_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.marginBox(this.domNode);var _114=dojo.window.getBox();if(mb.w>=_114.w||mb.h>=_114.h){var w=Math.min(mb.w,Math.floor(_114.w*0.75)),h=Math.min(mb.h,Math.floor(_114.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,_115=dojo.window.getBox(),p=this._relativePosition,bb=p?null:dojo._getBorderBox(node),l=Math.floor(_115.l+(p?p.x:(_115.w-bb.w)/2)),t=Math.floor(_115.t+(p?p.y:(_115.h-bb.h)/2));dojo.style(node,{left:l+"px",top:t+"px"});}},_onKey:function(evt){var ds=dijit._dialogStack;if(ds[ds.length-1]!=this){return;}if(evt.charOrCode){var dk=dojo.keys;var node=evt.target;if(evt.charOrCode===dk.TAB){this._getFocusItems(this.domNode);}var _116=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){if(!_116){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_116){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._alreadyInitialized){this._setup();this._alreadyInitialized=true;}if(this._fadeOut.status()=="playing"){this._fadeOut.stop();}this._modalconnects.push(dojo.connect(window,"onscroll",this,"layout"));this._modalconnects.push(dojo.connect(window,"onresize",this,function(){var _117=dojo.window.getBox();if(!this._oldViewport||_117.h!=this._oldViewport.h||_117.w!=this._oldViewport.w){this.layout();this._oldViewport=_117;}}));this._modalconnects.push(dojo.connect(dojo.doc.documentElement,"onkeypress",this,"_onKey"));dojo.style(this.domNode,{opacity:0,display:""});this.open=true;this._onShow();this._size();this._position();dijit._dialogStack.push(this);this._fadeIn.play();this._savedFocus=dijit.getFocus(this);},hide:function(){var ds=dijit._dialogStack;if(!this._alreadyInitialized||this!=ds[ds.length-1]){return;}if(this._fadeIn.status()=="playing"){this._fadeIn.stop();}ds.pop();this._fadeOut.play();if(this._scrollConnected){this._scrollConnected=false;}dojo.forEach(this._modalconnects,dojo.disconnect);this._modalconnects=[];if(this._relativePosition){delete this._relativePosition;}this.open=false;this.onHide();},layout:function(){if(this.domNode.style.display!="none"){if(dijit._underlay){dijit._underlay.layout();}this._position();}},destroy:function(){dojo.forEach(this._modalconnects,dojo.disconnect);if(this.refocus&&this.open){setTimeout(dojo.hitch(dijit,"focus",this._savedFocus),25);}this.inherited(arguments);}});dojo.declare("dijit.Dialog",[dijit.layout.ContentPane,dijit._DialogBase],{});dijit._dialogStack=[];}if(!dojo._hasResource["dijit._editor.selection"]){dojo._hasResource["dijit._editor.selection"]=true;dojo.provide("dijit._editor.selection");dojo.mixin(dijit._editor.selection,{getType:function(){if(dojo.isIE){return dojo.doc.selection.type.toLowerCase();}else{var _118="text";var oSel;try{oSel=dojo.global.getSelection();}catch(e){}if(oSel&&oSel.rangeCount==1){var _119=oSel.getRangeAt(0);if((_119.startContainer==_119.endContainer)&&((_119.endOffset-_119.startOffset)==1)&&(_119.startContainer.nodeType!=3)){_118="control";}}return _118;}},getSelectedText:function(){if(dojo.isIE){if(dijit._editor.selection.getType()=="control"){return null;}return dojo.doc.selection.createRange().text;}else{var _11a=dojo.global.getSelection();if(_11a){return _11a.toString();}}return "";},getSelectedHtml:function(){if(dojo.isIE){if(dijit._editor.selection.getType()=="control"){return null;}return dojo.doc.selection.createRange().htmlText;}else{var _11b=dojo.global.getSelection();if(_11b&&_11b.rangeCount){var i;var html="";for(i=0;i<_11b.rangeCount;i++){var frag=_11b.getRangeAt(i).cloneContents();var div=dojo.doc.createElement("div");div.appendChild(frag);html+=div.innerHTML;}return html;}return null;}},getSelectedElement:function(){if(dijit._editor.selection.getType()=="control"){if(dojo.isIE){var _11c=dojo.doc.selection.createRange();if(_11c&&_11c.item){return dojo.doc.selection.createRange().item(0);}}else{var _11d=dojo.global.getSelection();return _11d.anchorNode.childNodes[_11d.anchorOffset];}}return null;},getParentElement:function(){if(dijit._editor.selection.getType()=="control"){var p=this.getSelectedElement();if(p){return p.parentNode;}}else{if(dojo.isIE){var r=dojo.doc.selection.createRange();r.collapse(true);return r.parentElement();}else{var _11e=dojo.global.getSelection();if(_11e){var node=_11e.anchorNode;while(node&&(node.nodeType!=1)){node=node.parentNode;}return node;}}}return null;},hasAncestorElement:function(_11f){return this.getAncestorElement.apply(this,arguments)!=null;},getAncestorElement:function(_120){var node=this.getSelectedElement()||this.getParentElement();return this.getParentOfType(node,arguments);},isTag:function(node,tags){if(node&&node.tagName){var _121=node.tagName.toLowerCase();for(var i=0;i<tags.length;i++){var _122=String(tags[i]).toLowerCase();if(_121==_122){return _122;}}}return "";},getParentOfType:function(node,tags){while(node){if(this.isTag(node,tags).length){return node;}node=node.parentNode;}return null;},collapse:function(_123){if(window.getSelection){var _124=dojo.global.getSelection();if(_124.removeAllRanges){if(_123){_124.collapseToStart();}else{_124.collapseToEnd();}}else{_124.collapse(_123);}}else{if(dojo.isIE){var _125=dojo.doc.selection.createRange();_125.collapse(_123);_125.select();}}},remove:function(){var sel=dojo.doc.selection;if(dojo.isIE){if(sel.type.toLowerCase()!="none"){sel.clear();}return sel;}else{sel=dojo.global.getSelection();sel.deleteFromDocument();return sel;}},selectElementChildren:function(_126,_127){var win=dojo.global;var doc=dojo.doc;var _128;_126=dojo.byId(_126);if(doc.selection&&dojo.isIE&&dojo.body().createTextRange){_128=_126.ownerDocument.body.createTextRange();_128.moveToElementText(_126);if(!_127){try{_128.select();}catch(e){}}}else{if(win.getSelection){var _129=dojo.global.getSelection();if(dojo.isOpera){if(_129.rangeCount){_128=_129.getRangeAt(0);}else{_128=doc.createRange();}_128.setStart(_126,0);_128.setEnd(_126,(_126.nodeType==3)?_126.length:_126.childNodes.length);_129.addRange(_128);}else{_129.selectAllChildren(_126);}}}},selectElement:function(_12a,_12b){var _12c;var doc=dojo.doc;var win=dojo.global;_12a=dojo.byId(_12a);if(dojo.isIE&&dojo.body().createTextRange){try{_12c=dojo.body().createControlRange();_12c.addElement(_12a);if(!_12b){_12c.select();}}catch(e){this.selectElementChildren(_12a,_12b);}}else{if(dojo.global.getSelection){var _12d=win.getSelection();_12c=doc.createRange();if(_12d.removeAllRanges){if(dojo.isOpera){if(_12d.getRangeAt(0)){_12c=_12d.getRangeAt(0);}}_12c.selectNode(_12a);_12d.removeAllRanges();_12d.addRange(_12c);}}}},inSelection:function(node){if(node){var _12e;var doc=dojo.doc;var _12f;if(dojo.global.getSelection){var sel=dojo.global.getSelection();if(sel&&sel.rangeCount>0){_12f=sel.getRangeAt(0);}if(_12f&&_12f.compareBoundaryPoints&&doc.createRange){try{_12e=doc.createRange();_12e.setStart(node,0);if(_12f.compareBoundaryPoints(_12f.START_TO_END,_12e)===1){return true;}}catch(e){}}}else{if(doc.selection){_12f=doc.selection.createRange();try{_12e=node.ownerDocument.body.createControlRange();if(_12e){_12e.addElement(node);}}catch(e1){try{_12e=node.ownerDocument.body.createTextRange();_12e.moveToElementText(node);}catch(e2){}}if(_12f&&_12e){if(_12f.compareEndPoints("EndToStart",_12e)===1){return true;}}}}}return false;}});}if(!dojo._hasResource["dijit._editor.range"]){dojo._hasResource["dijit._editor.range"]=true;dojo.provide("dijit._editor.range");dijit.range={};dijit.range.getIndex=function(node,_130){var ret=[],retR=[];var stop=_130;var _131=node;var _132,n;while(node!=stop){var i=0;_132=node.parentNode;while((n=_132.childNodes[i++])){if(n===node){--i;break;}}ret.unshift(i);retR.unshift(i-_132.childNodes.length);node=_132;}if(ret.length>0&&_131.nodeType==3){n=_131.previousSibling;while(n&&n.nodeType==3){ret[ret.length-1]--;n=n.previousSibling;}n=_131.nextSibling;while(n&&n.nodeType==3){retR[retR.length-1]++;n=n.nextSibling;}}return {o:ret,r:retR};};dijit.range.getNode=function(_133,_134){if(!dojo.isArray(_133)||_133.length==0){return _134;}var node=_134;dojo.every(_133,function(i){if(i>=0&&i<node.childNodes.length){node=node.childNodes[i];}else{node=null;return false;}return true;});return node;};dijit.range.getCommonAncestor=function(n1,n2,root){root=root||n1.ownerDocument.body;var _135=function(n){var as=[];while(n){as.unshift(n);if(n!==root){n=n.parentNode;}else{break;}}return as;};var n1as=_135(n1);var n2as=_135(n2);var m=Math.min(n1as.length,n2as.length);var com=n1as[0];for(var i=1;i<m;i++){if(n1as[i]===n2as[i]){com=n1as[i];}else{break;}}return com;};dijit.range.getAncestor=function(node,_136,root){root=root||node.ownerDocument.body;while(node&&node!==root){var name=node.nodeName.toUpperCase();if(_136.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(node,_137,root){root=root||node.ownerDocument.body;_137=_137||dijit.range.BlockTagNames;var _138=null,_139;while(node&&node!==root){var name=node.nodeName.toUpperCase();if(!_138&&_137.test(name)){_138=node;}if(!_139&&(/^(?:BODY|TD|TH|CAPTION)$/).test(name)){_139=node;}node=node.parentNode;}return {blockNode:_138,blockContainer:_139||node.ownerDocument.body};};dijit.range.atBeginningOfContainer=function(_13a,node,_13b){var _13c=false;var _13d=(_13b==0);if(!_13d&&node.nodeType==3){if(/^[\s\xA0]+$/.test(node.nodeValue.substr(0,_13b))){_13d=true;}}if(_13d){var _13e=node;_13c=true;while(_13e&&_13e!==_13a){if(_13e.previousSibling){_13c=false;break;}_13e=_13e.parentNode;}}return _13c;};dijit.range.atEndOfContainer=function(_13f,node,_140){var _141=false;var _142=(_140==(node.length||node.childNodes.length));if(!_142&&node.nodeType==3){if(/^[\s\xA0]+$/.test(node.nodeValue.substr(_140))){_142=true;}}if(_142){var _143=node;_141=true;while(_143&&_143!==_13f){if(_143.nextSibling){_141=false;break;}_143=_143.parentNode;}}return _141;};dijit.range.adjacentNoneTextNode=function(_144,next){var node=_144;var len=(0-_144.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(win){if(dijit.range._w3c){return (win||dojo.global).document.createRange();}else{return new dijit.range.W3CRange;}};dijit.range.getSelection=function(win,_145){if(dijit.range._w3c){return win.getSelection();}else{var s=new dijit.range.ie.selection(win);if(!_145){s._getCurrentSelection();}return s;}};if(!dijit.range._w3c){dijit.range.ie={cachedSelection:{},selection:function(win){this._ranges=[];this.addRange=function(r,_146){this._ranges.push(r);if(!_146){r._select();}this.rangeCount=this._ranges.length;};this.removeAllRanges=function(){this._ranges=[];this.rangeCount=0;};var _147=function(){var r=win.document.selection.createRange();var type=win.document.selection.type.toUpperCase();if(type=="CONTROL"){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=_147();if(r){this.addRange(r,true);}};},decomposeControlRange:function(_148){var _149=_148.item(0),_14a=_148.item(_148.length-1);var _14b=_149.parentNode,_14c=_14a.parentNode;var _14d=dijit.range.getIndex(_149,_14b).o;var _14e=dijit.range.getIndex(_14a,_14c).o+1;return [_14b,_14d,_14c,_14e];},getEndPoint:function(_14f,end){var _150=_14f.duplicate();_150.collapse(!end);var _151="EndTo"+(end?"End":"Start");var _152=_150.parentElement();var _153,_154,_155;if(_152.childNodes.length>0){dojo.every(_152.childNodes,function(node,i){var _156;if(node.nodeType!=3){_150.moveToElementText(node);if(_150.compareEndPoints(_151,_14f)>0){if(_155&&_155.nodeType==3){_153=_155;_156=true;}else{_153=_152;_154=i;return false;}}else{if(i==_152.childNodes.length-1){_153=_152;_154=_152.childNodes.length;return false;}}}else{if(i==_152.childNodes.length-1){_153=node;_156=true;}}if(_156&&_153){var _157=dijit.range.adjacentNoneTextNode(_153)[0];if(_157){_153=_157.nextSibling;}else{_153=_152.firstChild;}var _158=dijit.range.adjacentNoneTextNode(_153);_157=_158[0];var _159=_158[1];if(_157){_150.moveToElementText(_157);_150.collapse(false);}else{_150.moveToElementText(_152);}_150.setEndPoint(_151,_14f);_154=_150.text.length-_159;return false;}_155=node;return true;});}else{_153=_152;_154=0;}if(!end&&_153.nodeType==1&&_154==_153.childNodes.length){var _15a=_153.nextSibling;if(_15a&&_15a.nodeType==3){_153=_15a;_154=0;}}return [_153,_154];},setEndPoint:function(_15b,_15c,_15d){var _15e=_15b.duplicate(),node,len;if(_15c.nodeType!=3){if(_15d>0){node=_15c.childNodes[_15d-1];if(node){if(node.nodeType==3){_15c=node;_15d=node.length;}else{if(node.nextSibling&&node.nextSibling.nodeType==3){_15c=node.nextSibling;_15d=0;}else{_15e.moveToElementText(node.nextSibling?node:_15c);var _15f=node.parentNode;var _160=_15f.insertBefore(node.ownerDocument.createTextNode(" "),node.nextSibling);_15e.collapse(false);_15f.removeChild(_160);}}}}else{_15e.moveToElementText(_15c);_15e.collapse(true);}}if(_15c.nodeType==3){var _161=dijit.range.adjacentNoneTextNode(_15c);var _162=_161[0];len=_161[1];if(_162){_15e.moveToElementText(_162);_15e.collapse(false);if(_162.contentEditable!="inherit"){len++;}}else{_15e.moveToElementText(_15c.parentNode);_15e.collapse(true);}_15d+=len;if(_15d>0){if(_15e.move("character",_15d)!=_15d){console.error("Error when moving!");}}}return _15e;},decomposeTextRange:function(_163){var _164=dijit.range.ie.getEndPoint(_163);var _165=_164[0],_166=_164[1];var _167=_164[0],_168=_164[1];if(_163.htmlText.length){if(_163.htmlText==_163.text){_168=_166+_163.text.length;}else{_164=dijit.range.ie.getEndPoint(_163,true);_167=_164[0],_168=_164[1];}}return [_165,_166,_167,_168];},setRange:function(_169,_16a,_16b,_16c,_16d,_16e){var _16f=dijit.range.ie.setEndPoint(_169,_16a,_16b);_169.setEndPoint("StartToStart",_16f);if(!_16e){var end=dijit.range.ie.setEndPoint(_169,_16c,_16d);}_169.setEndPoint("EndToEnd",end||_16f);return _169;}};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,_170){_170=parseInt(_170);if(this.startContainer===node&&this.startOffset==_170){return;}delete this._cachedBookmark;this.startContainer=node;this.startOffset=_170;if(!this.endContainer){this.setEnd(node,_170);}else{this._updateInternal();}},setEnd:function(node,_171){_171=parseInt(_171);if(this.endContainer===node&&this.endOffset==_171){return;}delete this._cachedBookmark;this.endContainer=node;this.endOffset=_171;if(!this.startContainer){this.setStart(node,_171);}else{this._updateInternal();}},setStartAfter:function(node,_172){this._setPoint("setStart",node,_172,1);},setStartBefore:function(node,_173){this._setPoint("setStart",node,_173,0);},setEndAfter:function(node,_174){this._setPoint("setEnd",node,_174,1);},setEndBefore:function(node,_175){this._setPoint("setEnd",node,_175,0);},_setPoint:function(what,node,_176,ext){var _177=dijit.range.getIndex(node,node.parentNode).o;this[what](node.parentNode,_177.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(!dojo._hasResource["dijit._editor.html"]){dojo._hasResource["dijit._editor.html"]=true;dojo.provide("dijit._editor.html");dijit._editor.escapeXml=function(str,_178){str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_178){str=str.replace(/'/gm,"&#39;");}return str;};dijit._editor.getNodeHtml=function(node){var _179;switch(node.nodeType){case 1:var _17a=node.nodeName.toLowerCase();if(!_17a||_17a.charAt(0)=="/"){return "";}_179="<"+_17a;var _17b=[];var attr;if(dojo.isIE&&node.outerHTML){var s=node.outerHTML;s=s.substr(0,s.indexOf(">")).replace(/(['"])[^"']*\1/g,"");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")){_17b.push([key,node.getAttribute("_djrealurl")]);continue;}}var val,_17c;switch(key){case "style":val=node.style.cssText.toLowerCase();break;case "class":val=node.className;break;case "width":if(_17a==="img"){_17c=/width=(\S+)/i.exec(s);if(_17c){val=_17c[1];}break;}case "height":if(_17a==="img"){_17c=/height=(\S+)/i.exec(s);if(_17c){val=_17c[1];}break;}default:val=node.getAttribute(key);}if(val!=null){_17b.push([key,val.toString()]);}}}}else{var i=0;while((attr=node.attributes[i++])){var n=attr.name;if(n.substr(0,3)!="_dj"){var v=attr.value;if(n=="src"||n=="href"){if(node.getAttribute("_djrealurl")){v=node.getAttribute("_djrealurl");}}_17b.push([n,v]);}}}_17b.sort(function(a,b){return a[0]<b[0]?-1:(a[0]==b[0]?0:1);});var j=0;while((attr=_17b[j++])){_179+=" "+attr[0]+"=\""+(dojo.isString(attr[1])?dijit._editor.escapeXml(attr[1],true):attr[1])+"\"";}if(_17a==="script"){_179+=">"+node.innerHTML+"</"+_17a+">";}else{if(node.childNodes.length){_179+=">"+dijit._editor.getChildrenHtml(node)+"</"+_17a+">";}else{switch(_17a){case "br":case "hr":case "img":case "input":case "base":case "meta":case "area":case "basefont":_179+=" />";break;default:_179+="></"+_17a+">";}}}break;case 4:case 3:_179=dijit._editor.escapeXml(node.nodeValue,true);break;case 8:_179="<!--"+dijit._editor.escapeXml(node.nodeValue,true)+"-->";break;default:_179="<!-- Element not recognized - Type: "+node.nodeType+" Name: "+node.nodeName+"-->";}return _179;};dijit._editor.getChildrenHtml=function(dom){var out="";if(!dom){return out;}var _17d=dom["childNodes"]||dom;var _17e=!dojo.isIE||_17d!==dom;var node,i=0;while((node=_17d[i++])){if(!_17e||node.parentNode==dom){out+=dijit._editor.getNodeHtml(node);}}return out;};}if(!dojo._hasResource["dijit._editor.RichText"]){dojo._hasResource["dijit._editor.RichText"]=true;dojo.provide("dijit._editor.RichText");if(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"]){if(dojo._postLoad){(function(){var _17f=dojo.doc.createElement("textarea");_17f.id=dijit._scopeName+"._editor.RichText.savedContent";dojo.style(_17f,{display:"none",position:"absolute",top:"-100px",height:"3px",width:"3px"});dojo.body().appendChild(_17f);})();}else{try{dojo.doc.write("<textarea id=\""+dijit._scopeName+"._editor.RichText.savedContent\" "+"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(_180){this.contentPreFilters=[];this.contentPostFilters=[];this.contentDomPreFilters=[];this.contentDomPostFilters=[];this.editingAreaStyleSheets=[];this.events=[].concat(this.events);this._keyHandlers={};this.contentPreFilters.push(dojo.hitch(this,"_preFixUrlAttributes"));if(dojo.isMoz){this.contentPreFilters.push(this._normalizeFontStyle);this.contentPostFilters.push(this._removeMozBogus);}if(dojo.isWebKit){this.contentPreFilters.push(this._removeWebkitBogus);this.contentPostFilters.push(this._removeWebkitBogus);}if(dojo.isIE){this.contentPostFilters.push(this._normalizeFontStyle);}if(_180&&dojo.isString(_180.value)){this.value=_180.value;}this.onLoadDeferred=new dojo.Deferred();},baseClass:"dijitEditor",inheritWidth:false,focusOnLoad:false,name:"",styleSheets:"",_content:"",height:"300px",minHeight:"1em",isClosed:true,isLoaded:false,_SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@",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.inherited(arguments);dojo.publish(dijit._scopeName+"._editor.RichText::init",[this]);this.open();this.setupDefaultShortcuts();},setupDefaultShortcuts:function(){var exec=dojo.hitch(this,function(cmd,arg){return function(){return !this.execCommand(cmd,arg);};});var _181={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){_181.Z=exec("redo");}for(var key in _181){this.addKeyHandler(key,true,false,_181[key]);}},events:["onKeyPress","onKeyDown","onKeyUp","onClick"],captureEvents:[],_editorCommandsLocalized:false,_localizeEditorCommands:function(){if(this._editorCommandsLocalized){return;}this._editorCommandsLocalized=true;var _182=["div","p","pre","h1","h2","h3","h4","h5","h6","ol","ul","address"];var _183="",_184,i=0;while((_184=_182[i++])){if(_184.charAt(1)!="l"){_183+="<"+_184+"><span>content</span></"+_184+"><br/>";}else{_183+="<"+_184+"><li>content</li></"+_184+"><br/>";}}var div=dojo.doc.createElement("div");dojo.style(div,{position:"absolute",top:"-2000px"});dojo.doc.body.appendChild(div);div.innerHTML=_183;var node=div.firstChild;while(node){dijit._editor.selection.selectElement(node.firstChild);dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[node.firstChild]);var _185=node.tagName.toLowerCase();this._local2NativeFormatNames[_185]=document.queryCommandValue("formatblock");this._native2LocalFormatNames[this._local2NativeFormatNames[_185]]=_185;node=node.nextSibling.nextSibling;}dojo.body().removeChild(div);},open:function(_186){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]);this._content="";if(arguments.length==1&&_186.nodeName){this.domNode=_186;}var dn=this.domNode;var html;if(dojo.isString(this.value)){html=this.value;delete this.value;dn.innerHTML="";}else{if(dn.nodeName&&dn.nodeName.toLowerCase()=="textarea"){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 _187=dojo.hitch(this,function(){dojo.style(ta,{display:"block",position:"absolute",top:"-1000px"});if(dojo.isIE){var s=ta.style;this.__overflow=s.overflow;s.overflow="hidden";}});if(dojo.isIE){setTimeout(_187,10);}else{_187();}if(ta.form){dojo.connect(ta.form,"onsubmit",this,function(){ta.value=this.getValue();});}}else{html=dijit._editor.getChildrenHtml(dn);dn.innerHTML="";}}var _188=dojo.contentBox(dn);this._oldHeight=_188.h;this._oldWidth=_188.w;this.savedContent=html;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!==""&&(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"])){var _189=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");if(_189.value!==""){var _18a=_189.value.split(this._SEPARATOR),i=0,dat;while((dat=_18a[i++])){var data=dat.split(":");if(data[0]==this.name){html=data[1];_18a.splice(i,1);break;}}}dojo.addOnUnload(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){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();}this.onLoad(html);});var s="javascript:parent."+dijit._scopeName+".byId(\""+this.id+"\")._iframeSrc";ifr.setAttribute("src",s);this.editingArea.appendChild(ifr);if(dn.nodeName=="LI"){dn.lastChild.style.marginTop="-1.2em";}dojo.addClass(this.domNode,this.baseClass);},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_getIframeDocTxt:function(){var _18b=dojo.getComputedStyle(this.domNode);var html="";var _18c=true;if(dojo.isIE||(!this.height&&!dojo.isMoz)){html="<div id='dijitEditorBody'></div>";_18c=false;}else{if(dojo.isMoz){this._cursorToStart=true;html="&nbsp;";}}var font=[_18b.fontWeight,_18b.fontSize,_18b.fontFamily].join(" ");var _18d=_18b.lineHeight;if(_18d.indexOf("px")>=0){_18d=parseFloat(_18d)/parseFloat(_18b.fontSize);}else{if(_18d.indexOf("em")>=0){_18d=parseFloat(_18d);}else{_18d="normal";}}var _18e="";var self=this;this.style.replace(/(^|;)\s*(line-|font-?)[^;]+/ig,function(_18f){_18f=_18f.replace(/^;/ig,"")+";";var s=_18f.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,"");}_18e+=_18f+";";});var _190=dojo.query("label[for=\""+this.id+"\"]");return [this.isLeftToRight()?"<html>\n<head>\n":"<html dir='rtl'>\n<head>\n",(dojo.isMoz&&_190.length?"<title>"+_190[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",((dojo.isWebKit)?"\t\twidth: 100%;\n":""),((dojo.isWebKit)?"\t\theight: 100%;\n":""),"\t}\n","\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"),"\t\tmin-height:",this.minHeight,";\n","\t\tline-height:",_18d,";\n","\t}\n","\tp{ margin: 1em 0; }\n",(!_18c&&!this.height?"\tbody,html {overflow-y: hidden;}\n":""),"\t#dijitEditorBody{overflow-x: auto; overflow-y:"+(this.height?"auto;":"hidden;")+"}\n","\tli > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; }\n","\tli{ min-height:1.2em; }\n","</style>\n",this._applyEditingAreaStyleSheets(),"\n","</head>\n<body ",(_18c?"id='dijitEditorBody' ":""),"onload='frameElement._loadFunc(window,document)' style='"+_18e+"'>",html,"</body>\n</html>"].join("");},_applyEditingAreaStyleSheets:function(){var _191=[];if(this.styleSheets){_191=this.styleSheets.split(";");this.styleSheets="";}_191=_191.concat(this.editingAreaStyleSheets);this.editingAreaStyleSheets=[];var text="",i=0,url;while((url=_191[i++])){var _192=(new dojo._Url(dojo.global.location,url)).toString();this.editingAreaStyleSheets.push(_192);text+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_192+"\"/>";}return text;},addStyleSheet:function(uri){var url=uri.toString();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){return;}this.editingAreaStyleSheets.push(url);this.onLoadDeferred.addCallback(dojo.hitch(function(){if(this.document.createStyleSheet){this.document.createStyleSheet(url);}else{var head=this.document.getElementsByTagName("head")[0];var _193=this.document.createElement("link");_193.rel="stylesheet";_193.type="text/css";_193.href=url;head.appendChild(_193);}}));},removeStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)=="."||(url.charAt(0)!="/"&&!uri.host)){url=(new dojo._Url(dojo.global.location,url)).toString();}var _194=dojo.indexOf(this.editingAreaStyleSheets,url);if(_194==-1){return;}delete this.editingAreaStyleSheets[_194];dojo.withGlobal(this.window,"query",dojo,["link:[href=\""+url+"\"]"]).orphan();},disabled:false,_mozSettingProps:{"styleWithCSS":false},_setDisabledAttr:function(_195){this.disabled=_195;if(!this.isLoaded){return;}_195=!!_195;if(dojo.isIE||dojo.isWebKit||dojo.isOpera){var _196=dojo.isIE&&(this.isLoaded||!this.focusOnLoad);if(_196){this.editNode.unselectable="on";}this.editNode.contentEditable=!_195;if(_196){var _197=this;setTimeout(function(){_197.editNode.unselectable="off";},0);}}else{try{this.document.designMode=(_195?"off":"on");}catch(e){return;}if(!_195&&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._disabledOK=true;},onLoad:function(html){if(!this.window.__registeredWindow){this.window.__registeredWindow=true;this._iframeRegHandle=dijit.registerIframe(this.iframe);}if(!dojo.isIE&&(this.height||dojo.isMoz)){this.editNode=this.document.body;}else{this.editNode=this.document.body.firstChild;var _198=this;if(dojo.isIE){var _199=(this.tabStop=dojo.doc.createElement("<div tabIndex=-1>"));this.editingArea.appendChild(_199);this.iframe.onfocus=function(){_198.editNode.setActive();};}}this.focusNode=this.editNode;var _19a=this.events.concat(this.captureEvents);var ap=this.iframe?this.document:this.editNode;dojo.forEach(_19a,function(item){this.connect(ap,item.toLowerCase(),item);},this);if(dojo.isIE){this.connect(this.document,"onmousedown","_onIEMouseDown");this.editNode.style.zoom=1;}else{this.connect(this.document,"onmousedown",function(){delete this._cursorToStart;});}if(dojo.isWebKit){this._webkitListener=this.connect(this.document,"onmouseup","onDisplayChanged");}if(dojo.isIE){try{this.document.execCommand("RespectVisibilityInDesign",true,null);}catch(e){}}this.isLoaded=true;this.set("disabled",this.disabled);var _19b=dojo.hitch(this,function(){this.setValue(html);if(this.onLoadDeferred){this.onLoadDeferred.callback(true);}this.onDisplayChanged();if(this.focusOnLoad){dojo.addOnLoad(dojo.hitch(this,function(){setTimeout(dojo.hitch(this,"focus"),this.updateInterval);}));}this.savedContent=this.getValue(true);});if(this.setValueDeferred){this.setValueDeferred.addCallback(_19b);}else{_19b();}},onKeyDown:function(e){if(e.keyCode===dojo.keys.TAB&&this.isTabIndent){dojo.stopEvent(e);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){this.iframe.focus();}else{if(!e.shiftKey&&!e.ctrlKey&&!e.altKey){this.tabStop.focus();}}}else{if(e.keyCode===dojo.keys.BACKSPACE&&this.document.selection.type==="Control"){dojo.stopEvent(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);}}}}return true;},onKeyUp:function(e){return;},setDisabled:function(_19c){dojo.deprecated("dijit.Editor::setDisabled is deprecated","use dijit.Editor::attr(\"disabled\",boolean) instead",2);this.set("disabled",_19c);},_setValueAttr:function(_19d){this.setValue(_19d);},_setDisableSpellCheckAttr:function(_19e){if(this.document){dojo.attr(this.document.body,"spellcheck",!_19e);}else{this.onLoadDeferred.addCallback(dojo.hitch(this,function(){dojo.attr(this.document.body,"spellcheck",!_19e);}));}this.disableSpellCheck=_19e;},onKeyPress:function(e){var c=(e.keyChar&&e.keyChar.toLowerCase())||e.keyCode,_19f=this._keyHandlers[c],args=arguments;if(_19f&&!e.altKey){dojo.some(_19f,function(h){if(!(h.shift^e.shiftKey)&&!(h.ctrl^(e.ctrlKey||e.metaKey))){if(!h.handler.apply(this,args)){e.preventDefault();}return true;}},this);}if(!this._onKeyHitch){this._onKeyHitch=dojo.hitch(this,"onKeyPressed");}setTimeout(this._onKeyHitch,1);return true;},addKeyHandler:function(key,ctrl,_1a0,_1a1){if(!dojo.isArray(this._keyHandlers[key])){this._keyHandlers[key]=[];}this._keyHandlers[key].push({shift:_1a0||false,ctrl:ctrl||false,handler:_1a1});},onKeyPressed:function(){this.onDisplayChanged();},onClick:function(e){this.onDisplayChanged(e);},_onIEMouseDown:function(e){if(!this._focused&&!this.disabled){this.focus();}},_onBlur:function(e){this.inherited(arguments);var _1a2=this.getValue(true);if(_1a2!=this.savedContent){this.onChange(_1a2);this.savedContent=_1a2;}},_onFocus:function(e){if(!this.disabled){if(!this._disabledOK){this.set("disabled",false);}this.inherited(arguments);}},blur:function(){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(){if(!this.isLoaded){this.focusOnLoad=true;return;}if(this._cursorToStart){delete this._cursorToStart;if(this.editNode.childNodes){this.placeCursorAtStart();return;}}if(!dojo.isIE){dijit.focus(this.iframe);}else{if(this.editNode&&this.editNode.focus){this.iframe.fireEvent("onfocus",document.createEventObject());}}},updateInterval:200,_updateTimer:null,onDisplayChanged:function(e){if(this._updateTimer){clearTimeout(this._updateTimer);}if(!this._updateHandler){this._updateHandler=dojo.hitch(this,"onNormalizedDisplayChanged");}this._updateTimer=setTimeout(this._updateHandler,this.updateInterval);},onNormalizedDisplayChanged:function(){delete this._updateTimer;},onChange:function(_1a3){},_normalizeCommand:function(cmd,_1a4){var _1a5=cmd.toLowerCase();if(_1a5=="formatblock"){if(dojo.isSafari&&_1a4===undefined){_1a5="heading";}}else{if(_1a5=="hilitecolor"&&!dojo.isMoz){_1a5="backcolor";}}return _1a5;},_qcaCache:{},queryCommandAvailable:function(_1a6){var ca=this._qcaCache[_1a6];if(ca!==undefined){return ca;}return (this._qcaCache[_1a6]=this._queryCommandAvailable(_1a6));},_queryCommandAvailable:function(_1a7){var ie=1;var _1a8=1<<1;var _1a9=1<<2;var _1aa=1<<3;var _1ab=1<<4;function _1ac(_1ad){return {ie:Boolean(_1ad&ie),mozilla:Boolean(_1ad&_1a8),webkit:Boolean(_1ad&_1a9),webkit420:Boolean(_1ad&_1ab),opera:Boolean(_1ad&_1aa)};};var _1ae=null;switch(_1a7.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":_1ae=_1ac(_1a8|ie|_1a9|_1aa);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":_1ae=_1ac(_1a8|ie|_1aa|_1ab);break;case "blockdirltr":case "blockdirrtl":case "dirltr":case "dirrtl":case "inlinedirltr":case "inlinedirrtl":_1ae=_1ac(ie);break;case "cut":case "copy":case "paste":_1ae=_1ac(ie|_1a8|_1ab);break;case "inserttable":_1ae=_1ac(_1a8|ie);break;case "insertcell":case "insertcol":case "insertrow":case "deletecells":case "deletecols":case "deleterows":case "mergecells":case "splitcell":_1ae=_1ac(ie|_1a8);break;default:return false;}return (dojo.isIE&&_1ae.ie)||(dojo.isMoz&&_1ae.mozilla)||(dojo.isWebKit&&_1ae.webkit)||(dojo.isWebKit>420&&_1ae.webkit420)||(dojo.isOpera&&_1ae.opera);},execCommand:function(_1af,_1b0){var _1b1;this.focus();_1af=this._normalizeCommand(_1af,_1b0);if(_1b0!==undefined){if(_1af=="heading"){throw new Error("unimplemented");}else{if((_1af=="formatblock")&&dojo.isIE){_1b0="<"+_1b0+">";}}}var _1b2="_"+_1af+"Impl";if(this[_1b2]){_1b1=this[_1b2](_1b0);}else{_1b0=arguments.length>1?_1b0:null;if(_1b0||_1af!="createlink"){_1b1=this.document.execCommand(_1af,false,_1b0);}}this.onDisplayChanged();return _1b1;},queryCommandEnabled:function(_1b3){if(this.disabled||!this._disabledOK){return false;}_1b3=this._normalizeCommand(_1b3);if(dojo.isMoz||dojo.isWebKit){if(_1b3=="unlink"){return this._sCall("hasAncestorElement",["a"]);}else{if(_1b3=="inserttable"){return true;}}}if(dojo.isWebKit){if(_1b3=="copy"){_1b3="cut";}else{if(_1b3=="paste"){return true;}}}var elem=dojo.isIE?this.document.selection.createRange():this.document;try{return elem.queryCommandEnabled(_1b3);}catch(e){return false;}},queryCommandState:function(_1b4){if(this.disabled||!this._disabledOK){return false;}_1b4=this._normalizeCommand(_1b4);try{return this.document.queryCommandState(_1b4);}catch(e){return false;}},queryCommandValue:function(_1b5){if(this.disabled||!this._disabledOK){return false;}var r;_1b5=this._normalizeCommand(_1b5);if(dojo.isIE&&_1b5=="formatblock"){r=this._native2LocalFormatNames[this.document.queryCommandValue(_1b5)];}else{if(dojo.isMoz&&_1b5==="hilitecolor"){var _1b6;try{_1b6=this.document.queryCommandValue("styleWithCSS");}catch(e){_1b6=false;}this.document.execCommand("styleWithCSS",false,true);r=this.document.queryCommandValue(_1b5);this.document.execCommand("styleWithCSS",false,_1b6);}else{r=this.document.queryCommandValue(_1b5);}}return r;},_sCall:function(name,args){return dojo.withGlobal(this.window,name,dijit._editor.selection,args);},placeCursorAtStart:function(){this.focus();var _1b7=false;if(dojo.isMoz){var _1b8=this.editNode.firstChild;while(_1b8){if(_1b8.nodeType==3){if(_1b8.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_1b7=true;this._sCall("selectElement",[_1b8]);break;}}else{if(_1b8.nodeType==1){_1b7=true;var tg=_1b8.tagName?_1b8.tagName.toLowerCase():"";if(/br|input|img|base|meta|area|basefont|hr|link/.test(tg)){this._sCall("selectElement",[_1b8]);}else{this._sCall("selectElementChildren",[_1b8]);}break;}}_1b8=_1b8.nextSibling;}}else{_1b7=true;this._sCall("selectElementChildren",[this.editNode]);}if(_1b7){this._sCall("collapse",[true]);}},placeCursorAtEnd:function(){this.focus();var _1b9=false;if(dojo.isMoz){var last=this.editNode.lastChild;while(last){if(last.nodeType==3){if(last.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_1b9=true;this._sCall("selectElement",[last]);break;}}else{if(last.nodeType==1){_1b9=true;if(last.lastChild){this._sCall("selectElement",[last.lastChild]);}else{this._sCall("selectElement",[last]);}break;}}last=last.previousSibling;}}else{_1b9=true;this._sCall("selectElementChildren",[this.editNode]);}if(_1b9){this._sCall("collapse",[false]);}},getValue:function(_1ba){if(this.textarea){if(this.isClosed||!this.isLoaded){return this.textarea.value;}}return this._postFilterContent(null,_1ba);},_getValueAttr:function(){return this.getValue(true);},setValue:function(html){if(!this.isLoaded){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.isWebKit){html="&nbsp;";}node.innerHTML=html;this._preDomFilterContent(node);}this.onDisplayChanged();},replaceValue:function(html){if(this.isClosed){this.setValue(html);}else{if(this.window&&this.window.getSelection&&!dojo.isMoz){this.setValue(html);}else{if(this.window&&this.window.getSelection){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){this.setValue(html);}}}}},_preFilterContent:function(html){var ec=html;dojo.forEach(this.contentPreFilters,function(ef){if(ef){ec=ef(ec);}});return ec;},_preDomFilterContent:function(dom){dom=dom||this.editNode;dojo.forEach(this.contentDomPreFilters,function(ef){if(ef&&dojo.isFunction(ef)){ef(dom);}},this);},_postFilterContent:function(dom,_1bb){var ec;if(!dojo.isString(dom)){dom=dom||this.editNode;if(this.contentDomPostFilters.length){if(_1bb){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="";}dojo.forEach(this.contentPostFilters,function(ef){ec=ef(ec);});return ec;},_saveContent:function(e){var _1bc=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");if(_1bc.value){_1bc.value+=this._SEPARATOR;}_1bc.value+=this.name+":"+this.getValue(true);},escapeXml:function(str,_1bd){str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_1bd){str=str.replace(/'/gm,"&#39;");}return str;},getNodeHtml:function(node){dojo.deprecated("dijit.Editor::getNodeHtml is deprecated","use dijit._editor.getNodeHtml instead",2);return dijit._editor.getNodeHtml(node);},getNodeChildrenHtml:function(dom){dojo.deprecated("dijit.Editor::getNodeChildrenHtml is deprecated","use dijit._editor.getChildrenHtml instead",2);return dijit._editor.getChildrenHtml(dom);},close:function(save){if(this.isClosed){return false;}if(!arguments.length){save=true;}this._content=this.getValue();var _1be=(this.savedContent!=this._content);if(this.interval){clearInterval(this.interval);}if(this._webkitListener){this.disconnect(this._webkitListener);delete this._webkitListener;}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=save?this._content:this.savedContent;dojo.destroy(this.domNode);this.domNode=this.textarea;}else{this.domNode.innerHTML=save?this._content:this.savedContent;}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;return _1be;},destroy:function(){if(!this.isClosed){this.close(false);}this.inherited(arguments);},_removeMozBogus:function(html){return html.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"").replace(/_moz_resizing="(true|false)"/gi,"");},_removeWebkitBogus:function(html){html=html.replace(/\sclass="webkit-block-placeholder"/gi,"");html=html.replace(/\sclass="apple-style-span"/gi,"");return html;},_normalizeFontStyle:function(html){return html.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");},_preFixUrlAttributes:function(html){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");},_inserthorizontalruleImpl:function(_1bf){if(dojo.isIE){return this._inserthtmlImpl("<hr>");}return this.document.execCommand("inserthorizontalrule",false,_1bf);},_unlinkImpl:function(_1c0){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,_1c0);},_hilitecolorImpl:function(_1c1){var _1c2;if(dojo.isMoz){this.document.execCommand("styleWithCSS",false,true);_1c2=this.document.execCommand("hilitecolor",false,_1c1);this.document.execCommand("styleWithCSS",false,false);}else{_1c2=this.document.execCommand("hilitecolor",false,_1c1);}return _1c2;},_backcolorImpl:function(_1c3){if(dojo.isIE){_1c3=_1c3?_1c3:null;}return this.document.execCommand("backcolor",false,_1c3);},_forecolorImpl:function(_1c4){if(dojo.isIE){_1c4=_1c4?_1c4:null;}return this.document.execCommand("forecolor",false,_1c4);},_inserthtmlImpl:function(_1c5){_1c5=this._preFilterContent(_1c5);var rv=true;if(dojo.isIE){var _1c6=this.document.selection.createRange();if(this.document.selection.type.toUpperCase()=="CONTROL"){var n=_1c6.item(0);while(_1c6.length){_1c6.remove(_1c6.item(0));}n.outerHTML=_1c5;}else{_1c6.pasteHTML(_1c5);}_1c6.select();}else{if(dojo.isMoz&&!_1c5.length){this._sCall("remove");}else{rv=this.document.execCommand("inserthtml",false,_1c5);}}return rv;},getHeaderHeight:function(){return this._getNodeChildrenHeight(this.header);},getFooterHeight:function(){return this._getNodeChildrenHeight(this.footer);},_getNodeChildrenHeight:function(node){var h=0;if(node&&node.childNodes){var i;for(i=0;i<node.childNodes.length;i++){var size=dojo.position(node.childNodes[i]);h+=size.h;}}return h;}});}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(_1c7,_1c8){var _1c9=(this._keyNavCodes={});var prev=dojo.hitch(this,this.focusPrev);var next=dojo.hitch(this,this.focusNext);dojo.forEach(_1c7,function(code){_1c9[code]=prev;});dojo.forEach(_1c8,function(code){_1c9[code]=next;});this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){dojo.forEach(this.getChildren(),dojo.hitch(this,"_startupChild"));},addChild:function(_1ca,_1cb){dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);this._startupChild(_1ca);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){var _1cc=this._getFirstFocusableChild();if(_1cc){this.focusChild(_1cc);}},focusNext:function(){var _1cd=this._getNextFocusableChild(this.focusedChild,1);this.focusChild(_1cd);},focusPrev:function(){var _1ce=this._getNextFocusableChild(this.focusedChild,-1);this.focusChild(_1ce,true);},focusChild:function(_1cf,last){if(this.focusedChild&&_1cf!==this.focusedChild){this._onChildBlur(this.focusedChild);}_1cf.focus(last?"end":"start");this.focusedChild=_1cf;},_startupChild:function(_1d0){_1d0.set("tabIndex","-1");this.connect(_1d0,"_onFocus",function(){_1d0.set("tabIndex",this.tabIndex);});this.connect(_1d0,"_onBlur",function(){_1d0.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(_1d1){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getNextFocusableChild:function(_1d2,dir){if(_1d2){_1d2=this._getSiblingOfChild(_1d2,dir);}var _1d3=this.getChildren();for(var i=0;i<_1d3.length;i++){if(!_1d2){_1d2=_1d3[(dir>0)?0:(_1d3.length-1)];}if(_1d2.isFocusable()){return _1d2;}_1d2=this._getSiblingOfChild(_1d2,dir);}return null;}});}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\" waiRole=\"presentation\"></div>",postCreate:function(){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\" waiRole=\"toolbar\" tabIndex=\"${tabIndex}\" dojoAttachPoint=\"containerNode\">"+"</div>",baseClass:"dijitToolbar",postCreate:function(){this.connectKeyNavHandlers(this.isLeftToRight()?[dojo.keys.LEFT_ARROW]:[dojo.keys.RIGHT_ARROW],this.isLeftToRight()?[dojo.keys.RIGHT_ARROW]:[dojo.keys.LEFT_ARROW]);this.inherited(arguments);},startup:function(){if(this._started){return;}this.startupKeyNavChildren();this.inherited(arguments);}});}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;}this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseUp");this.toggleDropDown();},_onDropDownMouseUp:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _1d4=this.dropDown,_1d5=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&&!_1d5){if(dojo.hasClass(t,"dijitPopup")){_1d5=true;}else{t=t.parentNode;}}if(_1d5){t=e.target;if(_1d4.onItemClick){var _1d6;while(t&&!(_1d6=dijit.byNode(t))){t=t.parentNode;}if(_1d6&&_1d6.onClick&&_1d6.getParent){_1d6.getParent().onItemClick(_1d6,e);}}return;}}}if(this._opened&&_1d4.focus){window.setTimeout(dojo.hitch(_1d4,"focus"),1);}},_onDropDownClick:function(e){if(this._stopClickEvents){dojo.stopEvent(e);}},_setupDropdown:function(){this._buttonNode=this._buttonNode||this.focusNode||this.domNode;this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;this._aroundNode=this._aroundNode||this.domNode;this.connect(this._buttonNode,"onmousedown","_onDropDownMouseDown");this.connect(this._buttonNode,"onclick","_onDropDownClick");this.connect(this._buttonNode,"onkeydown","_onDropDownKeydown");this.connect(this._buttonNode,"onkeyup","_onKey");if(this._setStateClass){this.connect(this,"openDropDown","_setStateClass");this.connect(this,"closeDropDown","_setStateClass");}var _1d7={"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"+_1d7+"ArrowButton");},postCreate:function(){this._setupDropdown();this.inherited(arguments);},destroyDescendants:function(){if(this.dropDown){if(!this.dropDown._destroyed){this.dropDown.destroyRecursive();}delete this.dropDown;}this.inherited(arguments);},_onDropDownKeydown:function(e){if(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.keyCode==dojo.keys.SPACE){e.preventDefault();}},_onKey:function(e){if(this.disabled||this.readOnly){return;}var d=this.dropDown;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){return;}}if(d&&this._opened&&e.keyCode==dojo.keys.ESCAPE){this.toggleDropDown();}else{if(d&&!this._opened&&(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.keyCode==dojo.keys.SPACE)){this.toggleDropDown();if(d.focus){setTimeout(dojo.hitch(d,"focus"),1);}}}},_onBlur:function(){this.closeDropDown();this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_1d8){_1d8();},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}this.focus();var _1d9=this.dropDown;if(!_1d9){return;}if(!this._opened){if(!this.isLoaded()){this.loadDropDown(dojo.hitch(this,"openDropDown"));return;}else{this.openDropDown();}}else{this.closeDropDown();}},openDropDown:function(){var _1da=this.dropDown;var _1db=_1da.domNode;var self=this;if(!this._preparedNode){dijit.popup.moveOffScreen(_1db);this._preparedNode=true;if(_1db.style.width){this._explicitDDWidth=true;}if(_1db.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _1dc={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_1dc.width="";}if(!this._explicitDDHeight){_1dc.height="";}dojo.style(_1db,_1dc);var mb=dojo.marginBox(_1db);var _1dd=(this.maxHeight&&mb.h>this.maxHeight);dojo.style(_1db,{overflowX:"hidden",overflowY:_1dd?"auto":"hidden"});if(_1dd){mb.h=this.maxHeight;if("w" in mb){mb.w+=16;}}else{delete mb.h;}delete mb.t;delete mb.l;if(this.forceWidth){mb.w=this.domNode.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,this.domNode.offsetWidth);}else{delete mb.w;}}if(dojo.isFunction(_1da.resize)){_1da.resize(mb);}else{dojo.marginBox(_1db,mb);}}var _1de=dijit.popup.open({parent:this,popup:_1da,around:this._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;self.state="";}});dojo.attr(this._popupStateNode,"popupActive","true");dojo.addClass(self._popupStateNode,"dijitHasDropDownOpen");this._opened=true;this.state="Opened";return _1de;},closeDropDown:function(_1df){if(this._opened){if(_1df){this.focus();}dijit.popup.close(this.dropDown);this._opened=false;this.state="";}}});}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\twaiRole=\"button\" waiState=\"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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"valueNode",iconClass:{node:"iconNode",type:"class"}}),_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 _1e0=dijit.byNode(node);if(_1e0&&typeof _1e0._onSubmit=="function"){_1e0._onSubmit(e);break;}}}else{if(this.valueNode){this.valueNode.click();e.preventDefault();}}}},_fillContent:function(_1e1){if(_1e1&&(!this.params||!("label" in this.params))){this.set("label",_1e1.innerHTML);}},postCreate:function(){dojo.setSelectable(this.focusNode,false);this.inherited(arguments);},_setShowLabelAttr:function(val){if(this.containerNode){dojo.toggleClass(this.containerNode,"dijitDisplayNone",!val);}this.showLabel=val;},onClick:function(e){return true;},_clicked:function(e){},setLabel:function(_1e2){dojo.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_1e2);},_setLabelAttr:function(_1e3){this.containerNode.innerHTML=this.label=_1e3;if(this.showLabel==false&&!this.params.title){this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});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\twaiRole=\"button\" waiState=\"haspopup-true,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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),_fillContent:function(){if(this.srcNodeRef){var _1e4=dojo.query("*",this.srcNodeRef);dijit.form.DropDownButton.superclass._fillContent.call(this,_1e4[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown){var _1e5=dojo.query("[widgetId]",this.dropDownContainer)[0];this.dropDown=dijit.byNode(_1e5);delete this.dropDownContainer;}dijit.popup.moveOffScreen(this.dropDown.domNode);this.inherited(arguments);},isLoaded:function(){var _1e6=this.dropDown;return (!_1e6.href||_1e6.isLoaded);},loadDropDown:function(){var _1e7=this.dropDown;if(!_1e7){return;}if(!this.isLoaded()){var _1e8=dojo.connect(_1e7,"onLoad",this,function(){dojo.disconnect(_1e8);this.openDropDown();});_1e7.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' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"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\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"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\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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(_1e9){dijit.focus(_1e9=="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(_1ea,_1eb){this.checked=_1ea;dojo.attr(this.focusNode||this.domNode,"checked",_1ea);dijit.setWaiState(this.focusNode||this.domNode,"pressed",_1ea);this._handleOnChange(_1ea,_1eb);},setChecked:function(_1ec){dojo.deprecated("setChecked("+_1ec+") is deprecated. Use set('checked',"+_1ec+") instead.","","2.0");this.set("checked",_1ec);},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);}});}if(!dojo._hasResource["dijit._editor._Plugin"]){dojo._hasResource["dijit._editor._Plugin"]=true;dojo.provide("dijit._editor._Plugin");dojo.declare("dijit._editor._Plugin",null,{constructor:function(args,node){this.params=args||{};dojo.mixin(this,this.params);this._connects=[];},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,command:"",useDefaultCommand:true,buttonClass:dijit.form.Button,getLabel:function(key){return this.editor.commands[key];},_initButton:function(){if(this.command.length){var _1ed=this.getLabel(this.command),_1ee=this.editor,_1ef=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);if(!this.button){var _1f0=dojo.mixin({label:_1ed,dir:_1ee.dir,lang:_1ee.lang,showLabel:false,iconClass:_1ef,dropDown:this.dropDown,tabIndex:"-1"},this.params||{});this.button=new this.buttonClass(_1f0);}}},destroy:function(){dojo.forEach(this._connects,dojo.disconnect);if(this.dropDown){this.dropDown.destroyRecursive();}},connect:function(o,f,tf){this._connects.push(dojo.connect(o,f,this,tf));},updateState:function(){var e=this.editor,c=this.command,_1f1,_1f2;if(!e||!e.isLoaded||!c.length){return;}if(this.button){try{_1f2=e.queryCommandEnabled(c);if(this.enabled!==_1f2){this.enabled=_1f2;this.button.set("disabled",!_1f2);}if(typeof this.button.checked=="boolean"){_1f1=e.queryCommandState(c);if(this.checked!==_1f1){this.checked=_1f1;this.button.set("checked",e.queryCommandState(c));}}}catch(e){}}},setEditor:function(_1f3){this.editor=_1f3;this._initButton();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{this.button.domNode.style.display="none";}}this.connect(this.editor,"onNormalizedDisplayChanged","updateState");},setToolbar:function(_1f4){if(this.button){_1f4.addChild(this.button);}}});}if(!dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]){dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]=true;dojo.provide("dijit._editor.plugins.EnterKeyHandling");dojo.declare("dijit._editor.plugins.EnterKeyHandling",dijit._editor._Plugin,{blockNodeForEnter:"BR",constructor:function(args){if(args){dojo.mixin(this,args);}},setEditor:function(_1f5){this.editor=_1f5;if(this.blockNodeForEnter=="BR"){if(dojo.isIE){_1f5.contentDomPreFilters.push(dojo.hitch(this,"regularPsToSingleLinePs"));_1f5.contentDomPostFilters.push(dojo.hitch(this,"singleLinePsToRegularPs"));_1f5.onLoadDeferred.addCallback(dojo.hitch(this,"_fixNewLineBehaviorForIE"));}else{_1f5.onLoadDeferred.addCallback(dojo.hitch(this,function(d){try{this.editor.document.execCommand("insertBrOnReturn",false,true);}catch(e){}return d;}));}}else{if(this.blockNodeForEnter){dojo["require"]("dijit._editor.range");var h=dojo.hitch(this,this.handleEnterKey);_1f5.addKeyHandler(13,0,0,h);_1f5.addKeyHandler(13,0,1,h);this.connect(this.editor,"onKeyPressed","onKeyPressed");}}},onKeyPressed:function(e){if(this._checkListLater){if(dojo.withGlobal(this.editor.window,"isCollapsed",dijit)){var _1f6=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,["LI"]);if(!_1f6){dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);var _1f7=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]);if(_1f7){_1f7.innerHTML=this.bogusHtmlContent;if(dojo.isIE){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(dojo.isMoz){if(_1f6.parentNode.parentNode.nodeName=="LI"){_1f6=_1f6.parentNode.parentNode;}}var fc=_1f6.firstChild;if(fc&&fc.nodeType==1&&(fc.nodeName=="UL"||fc.nodeName=="OL")){_1f6.insertBefore(fc.ownerDocument.createTextNode(" "),fc);var _1f8=dijit.range.create(this.editor.window);_1f8.setStart(_1f6.firstChild,0);var _1f9=dijit.range.getSelection(this.editor.window,true);_1f9.removeAllRanges();_1f9.addRange(_1f8);}}}this._checkListLater=false;}if(this._pressedEnterInBlock){if(this._pressedEnterInBlock.previousSibling){this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);}delete this._pressedEnterInBlock;}},bogusHtmlContent:"&nbsp;",blockNodes:/^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,handleEnterKey:function(e){var _1fa,_1fb,_1fc,doc=this.editor.document,br;if(e.shiftKey){var _1fd=dojo.withGlobal(this.editor.window,"getParentElement",dijit._editor.selection);var _1fe=dijit.range.getAncestor(_1fd,this.blockNodes);if(_1fe){if(!e.shiftKey&&_1fe.tagName=="LI"){return true;}_1fa=dijit.range.getSelection(this.editor.window);_1fb=_1fa.getRangeAt(0);if(!_1fb.collapsed){_1fb.deleteContents();_1fa=dijit.range.getSelection(this.editor.window);_1fb=_1fa.getRangeAt(0);}if(dijit.range.atBeginningOfContainer(_1fe,_1fb.startContainer,_1fb.startOffset)){if(e.shiftKey){br=doc.createElement("br");_1fc=dijit.range.create(this.editor.window);_1fe.insertBefore(br,_1fe.firstChild);_1fc.setStartBefore(br.nextSibling);_1fa.removeAllRanges();_1fa.addRange(_1fc);}else{dojo.place(br,_1fe,"before");}}else{if(dijit.range.atEndOfContainer(_1fe,_1fb.startContainer,_1fb.startOffset)){_1fc=dijit.range.create(this.editor.window);br=doc.createElement("br");if(e.shiftKey){_1fe.appendChild(br);_1fe.appendChild(doc.createTextNode(" "));_1fc.setStart(_1fe.lastChild,0);}else{dojo.place(br,_1fe,"after");_1fc.setStartAfter(_1fe);}_1fa.removeAllRanges();_1fa.addRange(_1fc);}else{return true;}}}else{dijit._editor.RichText.prototype.execCommand.call(this.editor,"inserthtml","<br>");}return false;}var _1ff=true;_1fa=dijit.range.getSelection(this.editor.window);_1fb=_1fa.getRangeAt(0);if(!_1fb.collapsed){_1fb.deleteContents();_1fa=dijit.range.getSelection(this.editor.window);_1fb=_1fa.getRangeAt(0);}var _200=dijit.range.getBlockAncestor(_1fb.endContainer,null,this.editor.editNode);var _201=_200.blockNode;if((this._checkListLater=(_201&&(_201.nodeName=="LI"||_201.parentNode.nodeName=="LI")))){if(dojo.isMoz){this._pressedEnterInBlock=_201;}if(/^(\s|&nbsp;|\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s|&nbsp;|\xA0)<\/span>)?(<br>)?$/.test(_201.innerHTML)){_201.innerHTML="";if(dojo.isWebKit){_1fc=dijit.range.create(this.editor.window);_1fc.setStart(_201,0);_1fa.removeAllRanges();_1fa.addRange(_1fc);}this._checkListLater=false;}return true;}if(!_200.blockNode||_200.blockNode===this.editor.editNode){try{dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);}catch(e2){}_200={blockNode:dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]),blockContainer:this.editor.editNode};if(_200.blockNode){if(_200.blockNode!=this.editor.editNode&&(!(_200.blockNode.textContent||_200.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length)){this.removeTrailingBr(_200.blockNode);return false;}}else{_200.blockNode=this.editor.editNode;}_1fa=dijit.range.getSelection(this.editor.window);_1fb=_1fa.getRangeAt(0);}var _202=doc.createElement(this.blockNodeForEnter);_202.innerHTML=this.bogusHtmlContent;this.removeTrailingBr(_200.blockNode);if(dijit.range.atEndOfContainer(_200.blockNode,_1fb.endContainer,_1fb.endOffset)){if(_200.blockNode===_200.blockContainer){_200.blockNode.appendChild(_202);}else{dojo.place(_202,_200.blockNode,"after");}_1ff=false;_1fc=dijit.range.create(this.editor.window);_1fc.setStart(_202,0);_1fa.removeAllRanges();_1fa.addRange(_1fc);if(this.editor.height){dojo.window.scrollIntoView(_202);}}else{if(dijit.range.atBeginningOfContainer(_200.blockNode,_1fb.startContainer,_1fb.startOffset)){dojo.place(_202,_200.blockNode,_200.blockNode===_200.blockContainer?"first":"before");if(_202.nextSibling&&this.editor.height){_1fc=dijit.range.create(this.editor.window);_1fc.setStart(_202.nextSibling,0);_1fa.removeAllRanges();_1fa.addRange(_1fc);dojo.window.scrollIntoView(_202.nextSibling);}_1ff=false;}else{if(_200.blockNode===_200.blockContainer){_200.blockNode.appendChild(_202);}else{dojo.place(_202,_200.blockNode,"after");}_1ff=false;if(_200.blockNode.style){if(_202.style){if(_200.blockNode.style.cssText){_202.style.cssText=_200.blockNode.style.cssText;}}}var rs=_1fb.startContainer;if(rs&&rs.nodeType==3){var _203,_204;var txt=rs.nodeValue;var _205=doc.createTextNode(txt.substring(0,_1fb.startOffset));var _206=doc.createTextNode(txt.substring(_1fb.startOffset,txt.length));dojo.place(_205,rs,"before");dojo.place(_206,rs,"after");dojo.destroy(rs);var _207=_205.parentNode;while(_207!==_200.blockNode){var tg=_207.tagName;var _208=doc.createElement(tg);if(_207.style){if(_208.style){if(_207.style.cssText){_208.style.cssText=_207.style.cssText;}}}_203=_206;while(_203){_204=_203.nextSibling;_208.appendChild(_203);_203=_204;}dojo.place(_208,_207,"after");_205=_207;_206=_208;_207=_207.parentNode;}_203=_206;if(_203.nodeType==1||(_203.nodeType==3&&_203.nodeValue)){_202.innerHTML="";}while(_203){_204=_203.nextSibling;_202.appendChild(_203);_203=_204;}}_1fc=dijit.range.create(this.editor.window);_1fc.setStart(_202,0);_1fa.removeAllRanges();_1fa.addRange(_1fc);if(this.editor.height){dijit.scrollIntoView(_202);}if(dojo.isMoz){this._pressedEnterInBlock=_200.blockNode;}}}return _1ff;},removeTrailingBr:function(_209){var para=/P|DIV|LI/i.test(_209.tagName)?_209:dijit._editor.selection.getParentOfType(_209,["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;}},_fixNewLineBehaviorForIE:function(d){var doc=this.editor.document;if(doc.__INSERTED_EDITIOR_NEWLINE_CSS===undefined){var _20a=dojo.create("style",{type:"text/css"},doc.getElementsByTagName("head")[0]);_20a.styleSheet.cssText="p{margin:0;}";this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS=true;}return d;},regularPsToSingleLinePs:function(_20b,_20c){function _20d(el){function _20e(_20f){var newP=_20f[0].ownerDocument.createElement("p");_20f[0].parentNode.insertBefore(newP,_20f[0]);dojo.forEach(_20f,function(node){newP.appendChild(node);});};var _210=0;var _211=[];var _212;while(_210<el.childNodes.length){_212=el.childNodes[_210];if(_212.nodeType==3||(_212.nodeType==1&&_212.nodeName!="BR"&&dojo.style(_212,"display")!="block")){_211.push(_212);}else{var _213=_212.nextSibling;if(_211.length){_20e(_211);_210=(_210+1)-_211.length;if(_212.nodeName=="BR"){dojo.destroy(_212);}}_211=[];}_210++;}if(_211.length){_20e(_211);}};function _214(el){var _215=null;var _216=[];var _217=el.childNodes.length-1;for(var i=_217;i>=0;i--){_215=el.childNodes[i];if(_215.nodeName=="BR"){var newP=_215.ownerDocument.createElement("p");dojo.place(newP,el,"after");if(_216.length==0&&i!=_217){newP.innerHTML="&nbsp;";}dojo.forEach(_216,function(node){newP.appendChild(node);});dojo.destroy(_215);_216=[];}else{_216.unshift(_215);}}};var _218=[];var ps=_20b.getElementsByTagName("p");dojo.forEach(ps,function(p){_218.push(p);});dojo.forEach(_218,function(p){var _219=p.previousSibling;if((_219)&&(_219.nodeType==1)&&(_219.nodeName=="P"||dojo.style(_219,"display")!="block")){var newP=p.parentNode.insertBefore(this.document.createElement("p"),p);newP.innerHTML=_20c?"":"&nbsp;";}_214(p);},this.editor);_20d(_20b);return _20b;},singleLinePsToRegularPs:function(_21a){function _21b(node){var ps=node.getElementsByTagName("p");var _21c=[];for(var i=0;i<ps.length;i++){var p=ps[i];var _21d=false;for(var k=0;k<_21c.length;k++){if(_21c[k]===p.parentNode){_21d=true;break;}}if(!_21d){_21c.push(p.parentNode);}}return _21c;};function _21e(node){return (!node.childNodes.length||node.innerHTML=="&nbsp;");};var _21f=_21b(_21a);for(var i=0;i<_21f.length;i++){var _220=_21f[i];var _221=null;var node=_220.firstChild;var _222=null;while(node){if(node.nodeType!=1||node.tagName!="P"||(node.getAttributeNode("style")||{}).specified){_221=null;}else{if(_21e(node)){_222=node;_221=null;}else{if(_221==null){_221=node;}else{if((!_221.lastChild||_221.lastChild.nodeName!="BR")&&(node.firstChild)&&(node.firstChild.nodeName!="BR")){_221.appendChild(this.editor.document.createElement("br"));}while(node.firstChild){_221.appendChild(node.firstChild);}_222=node;}}}node=node.nextSibling;if(_222){dojo.destroy(_222);_222=null;}}}return _21a;}});}if(!dojo._hasResource["dijit.Editor"]){dojo._hasResource["dijit.Editor"]=true;dojo.provide("dijit.Editor");dojo.declare("dijit.Editor",dijit._editor.RichText,{plugins:null,extraPlugins:null,constructor:function(){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"];}this._plugins=[];this._editInterval=this.editActionInterval*1000;if(dojo.isIE){this.events.push("onBeforeDeactivate");this.events.push("onBeforeActivate");}},postCreate:function(){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.setValueDeferred=new dojo.Deferred();this.inherited(arguments);this.commands=dojo.i18n.getLocalization("dijit._editor","commands",this.lang);if(!this.toolbar){this.toolbar=new dijit.Toolbar({dir:this.dir,lang:this.lang});this.header.appendChild(this.toolbar.domNode);}dojo.forEach(this.plugins,this.addPlugin,this);this.setValueDeferred.callback(true);dojo.addClass(this.iframe.parentNode,"dijitEditorIFrameContainer");dojo.addClass(this.iframe,"dijitEditorIFrame");dojo.attr(this.iframe,"allowTransparency",true);if(dojo.isWebKit){dojo.style(this.domNode,"KhtmlUserSelect","none");}this.toolbar.startup();this.onNormalizedDisplayChanged();},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(_223,_224){var args=dojo.isString(_223)?{name:_223}:_223;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",_223);return;}_223=o.plugin;}if(arguments.length>1){this._plugins[_224]=_223;}else{this._plugins.push(_223);}_223.setEditor(this);if(dojo.isFunction(_223.setToolbar)){_223.setToolbar(this.toolbar);}},startup:function(){},resize:function(size){if(size){dijit.layout._LayoutWidget.prototype.resize.apply(this,arguments);}},layout:function(){var _225=(this._contentBox.h-(this.getHeaderHeight()+this.getFooterHeight()+dojo._getPadBorderExtents(this.iframe.parentNode).h+dojo._getMarginExtents(this.iframe.parentNode).h));this.editingArea.style.height=_225+"px";if(this.iframe){this.iframe.style.height="100%";}this._layoutMode=true;},_onIEMouseDown:function(e){var _226;var b=this.document.body;var _227=b.clientWidth;var _228=b.clientHeight;var _229=b.clientLeft;var _22a=b.offsetWidth;var _22b=b.offsetHeight;var _22c=b.offsetLeft;bodyDir=b.dir?b.dir.toLowerCase():"";if(bodyDir!="rtl"){if(_227<_22a&&e.x>_227&&e.x<_22a){_226=true;}}else{if(e.x<_229&&e.x>_22c){_226=true;}}if(!_226){if(_228<_22b&&e.y>_228&&e.y<_22b){_226=true;}}if(!_226){delete this._cursorToStart;delete this._savedSelection;if(e.target.tagName=="BODY"){setTimeout(dojo.hitch(this,"placeCursorAtEnd"),0);}this.inherited(arguments);}},onBeforeActivate:function(e){this._restoreSelection();},onBeforeDeactivate:function(e){if(this.customUndo){this.endEditing(true);}if(e.target.tagName!="BODY"){this._saveSelection();}},customUndo:dojo.isIE||dojo.isWebKit,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(dojo.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;try{r=this.inherited("execCommand",arguments);if(dojo.isWebKit&&cmd=="paste"&&!r){throw {code:1011};}}catch(e){if(e.code==1011&&/copy|cut|paste/.test(cmd)){var sub=dojo.string.substitute,_22d={cut:"X",copy:"C",paste:"V"};alert(sub(this.commands.systemShortcut,[this.commands[cmd],sub(this.commands[dojo.isMac?"appleKey":"ctrlKey"],[_22d[cmd]])]));}r=false;}if(this.customUndo){this._endEditing();}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("queryCommandEnabled",arguments);}},_moveToBookmark:function(b){var _22e=b.mark;var mark=b.mark;var col=b.isCollapsed;var r,_22f,_230,sel;if(mark){if(dojo.isIE){if(dojo.isArray(mark)){_22e=[];dojo.forEach(mark,function(n){_22e.push(dijit.range.getNode(n,this.editNode));},this);dojo.withGlobal(this.window,"moveToBookmark",dijit,[{mark:_22e,isCollapsed:col}]);}else{if(mark.startContainer&&mark.endContainer){sel=dijit.range.getSelection(this.window);if(sel&&sel.removeAllRanges){sel.removeAllRanges();r=dijit.range.create(this.window);_22f=dijit.range.getNode(mark.startContainer,this.editNode);_230=dijit.range.getNode(mark.endContainer,this.editNode);if(_22f&&_230){r.setStart(_22f,mark.startOffset);r.setEnd(_230,mark.endOffset);sel.addRange(r);}}}}}else{sel=dijit.range.getSelection(this.window);if(sel&&sel.removeAllRanges){sel.removeAllRanges();r=dijit.range.create(this.window);_22f=dijit.range.getNode(mark.startContainer,this.editNode);_230=dijit.range.getNode(mark.endContainer,this.editNode);if(_22f&&_230){r.setStart(_22f,mark.startOffset);r.setEnd(_230,mark.endOffset);sel.addRange(r);}}}}},_changeToStep:function(from,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(_231){if(this._editTimer){clearTimeout(this._editTimer);}if(this._inEditing){this._endEditing(_231);this._inEditing=false;}},_getBookmark:function(){var b=dojo.withGlobal(this.window,dijit.getBookmark);var tmp=[];if(b&&b.mark){var mark=b.mark;if(dojo.isIE){var sel=dijit.range.getSelection(this.window);if(!dojo.isArray(mark)){if(sel){var _232;if(sel.rangeCount){_232=sel.getRangeAt(0);}if(_232){b.mark=_232.cloneRange();}else{b.mark=dojo.withGlobal(this.window,dijit.getBookmark);}}}else{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){if(this._steps.length===0){this._steps.push({"text":dijit._editor.getChildrenHtml(this.editNode),"bookmark":this._getBookmark()});}},_endEditing:function(_233){var v=dijit._editor.getChildrenHtml(this.editNode);this._undoedSteps=[];this._steps.push({text:v,bookmark:this._getBookmark()});},onKeyDown:function(e){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){if(k==90||k==122){dojo.stopEvent(e);this.undo();return;}else{if(k==89||k==121){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:case 86:if(e.ctrlKey&&!e.altKey&&!e.metaKey){this.endEditing();if(e.keyCode==88){this.beginEditing("cut");setTimeout(dojo.hitch(this,this.endEditing),1);}else{this.beginEditing("paste");setTimeout(dojo.hitch(this,this.endEditing),1);}break;}default:if(!e.ctrlKey&&!e.altKey&&!e.metaKey&&(e.keyCode<dojo.keys.F1||e.keyCode>dojo.keys.F15)){this.beginEditing();break;}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;case ks.CTRL:case ks.SHIFT:case ks.TAB:break;}},_onBlur:function(){this.inherited("_onBlur",arguments);this.endEditing(true);},_saveSelection:function(){this._savedSelection=this._getBookmark();},_restoreSelection:function(){if(this._savedSelection){delete this._cursorToStart;if(dojo.withGlobal(this.window,"isCollapsed",dijit)){this._moveToBookmark(this._savedSelection);}delete this._savedSelection;}},onClick:function(){this.endEditing(true);this.inherited(arguments);},_setDisabledAttr:function(_234){if(!this.disabled&&_234){this._buttonEnabledPlugins=dojo.filter(this._plugins,function(p){if(p&&p.button&&!p.button.get("disabled")){p.button.set("disabled",true);return true;}return false;});}else{if(this.disabled&&!_234){dojo.forEach(this._buttonEnabledPlugins,function(p){p.button.attr("disabled",false);p.updateState&&p.updateState();});}}this.inherited(arguments);},_setStateClass:function(){this.inherited(arguments);if(this.document&&this.document.body){dojo.style(this.document.body,"color",dojo.style(this.iframe,"color"));}}});dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){if(o.plugin){return;}var args=o.args,p;var _235=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 _235({command:name});break;case "bold":case "italic":case "underline":case "strikethrough":case "subscript":case "superscript":p=new _235({buttonClass:dijit.form.ToggleButton,command:name});break;case "|":p=new _235({button:new dijit.ToolbarSeparator(),setEditor:function(_236){this.editor=_236;}});}o.plugin=p;});}if(!dojo._hasResource["dojo.regexp"]){dojo._hasResource["dojo.regexp"]=true;dojo.provide("dojo.regexp");dojo.regexp.escapeString=function(str,_237){return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_237&&_237.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_238){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("|"),_238);};dojo.regexp.group=function(_239,_23a){return "("+(_23a?"?:":"")+_239+")";};}if(!dojo._hasResource["dojo.data.util.sorter"]){dojo._hasResource["dojo.data.util.sorter"]=true;dojo.provide("dojo.data.util.sorter");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(_23b,_23c){var _23d=[];function _23e(attr,dir,comp,s){return function(_23f,_240){var a=s.getValue(_23f,attr);var b=s.getValue(_240,attr);return dir*comp(a,b);};};var _241;var map=_23c.comparatorMap;var bc=dojo.data.util.sorter.basicComparator;for(var i=0;i<_23b.length;i++){_241=_23b[i];var attr=_241.attribute;if(attr){var dir=(_241.descending)?-1:1;var comp=bc;if(map){if(typeof attr!=="string"&&("toString" in attr)){attr=attr.toString();}comp=map[attr]||bc;}_23d.push(_23e(attr,dir,comp,_23c));}}return function(rowA,rowB){var i=0;while(i<_23d.length){var ret=_23d[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.data.util.simpleFetch.fetch=function(_242){_242=_242||{};if(!_242.store){_242.store=this;}var self=this;var _243=function(_244,_245){if(_245.onError){var _246=_245.scope||dojo.global;_245.onError.call(_246,_244,_245);}};var _247=function(_248,_249){var _24a=_249.abort||null;var _24b=false;var _24c=_249.start?_249.start:0;var _24d=(_249.count&&(_249.count!==Infinity))?(_24c+_249.count):_248.length;_249.abort=function(){_24b=true;if(_24a){_24a.call(_249);}};var _24e=_249.scope||dojo.global;if(!_249.store){_249.store=self;}if(_249.onBegin){_249.onBegin.call(_24e,_248.length,_249);}if(_249.sort){_248.sort(dojo.data.util.sorter.createSortFunction(_249.sort,self));}if(_249.onItem){for(var i=_24c;(i<_248.length)&&(i<_24d);++i){var item=_248[i];if(!_24b){_249.onItem.call(_24e,item,_249);}}}if(_249.onComplete&&!_24b){var _24f=null;if(!_249.onItem){_24f=_248.slice(_24c,_24d);}_249.onComplete.call(_24e,_24f,_249);}};this._fetchItems(_242,_247,_243);return _242;};}if(!dojo._hasResource["dojo.data.util.filter"]){dojo._hasResource["dojo.data.util.filter"]=true;dojo.provide("dojo.data.util.filter");dojo.data.util.filter.patternToRegExp=function(_250,_251){var rxp="^";var c=null;for(var i=0;i<_250.length;i++){c=_250.charAt(i);switch(c){case "\\":rxp+=c;i++;rxp+=_250.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(_251){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}\" waiRole=\"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.toLowerCase()=="input"||((type=="hidden"||type=="file")&&this.templateString==dijit.form.TextBox.prototype.templateString)){this.templateString=this._singleNodeTemplate;}this.inherited(arguments);},_setPlaceHolderAttr:function(v){this.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(_252,_253,_254){var _255;if(_252!==undefined){_255=this.filter(_252);if(typeof _254!="string"){if(_255!==null&&((typeof _255!="number")||!isNaN(_255))){_254=this.filter(this.format(_255,this.constraints));}else{_254="";}}}if(_254!=null&&_254!=undefined&&((typeof _254)!="number"||!isNaN(_254))&&this.textbox.value!=_254){this.textbox.value=_254;}this._updatePlaceHolder();this.inherited(arguments,[_255,_253]);},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(_256){dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");this.set("displayedValue",_256);},_setDisplayedValueAttr:function(_257){if(_257===null||_257===undefined){_257="";}else{if(typeof _257!="string"){_257=String(_257);}}this.textbox.value=_257;this._setValueAttr(this.get("value"),undefined,_257);},format:function(_258,_259){return ((_258==null||_258==undefined)?"":(_258.toString?_258.toString():_258));},parse:function(_25a,_25b){return _25a;},_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 _25c=this;setTimeout(function(){_25c._handleOnChange(_25c.get("value"),false);},0);}this._refreshState();},postCreate:function(){if(dojo.isIE){var s=dojo.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _25d=this.domNode.getElementsByTagName("INPUT");if(_25d){for(var i=0;i<_25d.length;i++){_25d[i].style.fontFamily=ff;}}}}}this.textbox.setAttribute("value",this.textbox.value);this.inherited(arguments);if(dojo.isMoz||dojo.isOpera){this.connect(this.textbox,"oninput",this._onInput);}else{this.connect(this.textbox,"onkeydown",this._onInput);this.connect(this.textbox,"onkeyup",this._onInput);this.connect(this.textbox,"onpaste",this._onInput);this.connect(this.textbox,"oncut",this._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 _25e;if(dojo.isIE){var _25f=dojo.doc.selection.createRange();var _260=_25f.parentElement();_25e=_260==this.textbox&&_25f.text.length==0;}else{_25e=this.textbox.selectionStart==this.textbox.selectionEnd;}if(_25e){dijit.selectInputText(this.textbox);}});}this._updatePlaceHolder();this._refreshState();this.inherited(arguments);},reset:function(){this.textbox.value="";this.inherited(arguments);}});dijit.selectInputText=function(_261,_262,stop){var _263=dojo.global;var _264=dojo.doc;_261=dojo.byId(_261);if(isNaN(_262)){_262=0;}if(isNaN(stop)){stop=_261.value?_261.value.length:0;}dijit.focus(_261);if(_264["selection"]&&dojo.body()["createTextRange"]){if(_261.createTextRange){var _265=_261.createTextRange();with(_265){collapse(true);moveStart("character",-99999);moveStart("character",_262);moveEnd("character",stop-_262);select();}}}else{if(_263["getSelection"]){if(_261.setSelectionRange){_261.setSelectionRange(_262,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\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></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(_266,_267,_268,rtl){if(this.aroundNode&&this.aroundNode===_267){return;}if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_266;var pos=dijit.placeOnScreenAroundElement(this.domNode,_267,dijit.getPopupAroundAlignment((_268&&_268.length)?_268:dijit.Tooltip.defaultPosition,!rtl),dojo.hitch(this,"orient"));dojo.style(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_267;},orient:function(node,_269,_26a){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"}[_269+"-"+_26a];},_onShow:function(){if(dojo.isIE){this.domNode.style.filter="";}},hide:function(_26b){if(this._onDeck&&this._onDeck[1]==_26b){this._onDeck=null;}else{if(this.aroundNode===_26b){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(_26c,_26d,_26e,rtl){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.show(_26c,_26d,_26e,rtl);};dijit.hideTooltip=function(_26f){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.hide(_26f);};dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],constructor:function(){this._nodeConnectionsById={};},_setConnectIdAttr:function(_270){for(var _271 in this._nodeConnectionsById){this.removeTarget(_271);}dojo.forEach(dojo.isArrayLike(_270)?_270:[_270],this.addTarget,this);},_getConnectIdAttr:function(){var ary=[];for(var id in this._nodeConnectionsById){ary.push(id);}return ary;},addTarget:function(id){var node=dojo.byId(id);if(!node){return;}if(node.id in this._nodeConnectionsById){return;}this._nodeConnectionsById[node.id]=[this.connect(node,"onmouseenter","_onTargetMouseEnter"),this.connect(node,"onmouseleave","_onTargetMouseLeave"),this.connect(node,"onfocus","_onTargetFocus"),this.connect(node,"onblur","_onTargetBlur")];},removeTarget:function(node){var id=node.id||node;if(id in this._nodeConnectionsById){dojo.forEach(this._nodeConnectionsById[id],this.disconnect,this);delete this._nodeConnectionsById[id];}},postCreate:function(){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 _272=e.target;this._showTimer=setTimeout(dojo.hitch(this,function(){this.open(_272);}),this.showDelay);}},_onUnHover:function(e){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_273){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}dijit.showTooltip(this.label||this.domNode.innerHTML,_273,this.position,!this.isLeftToRight());this._connectNode=_273;this.onShow(_273,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(_274,_275){},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}\" waiRole=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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_$",constraints:{},regExp:".*",regExpGen:function(_276){return this.regExp;},state:"",tooltipPosition:[],_setValueAttr:function(){this.inherited(arguments);this.validate(this._focused);},validator:function(_277,_278){return (new RegExp("^(?:"+this.regExpGen(_278)+")"+(this.required?"":"?")+"$")).test(_277)&&(!this.required||!this._isEmpty(_277))&&(this._isEmpty(_277)||this.parse(_277,_278)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(_279){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_27a){return /^\s*$/.test(_27a);},getErrorMessage:function(_27b){return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;},getPromptMessage:function(_27c){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_27d){var _27e="";var _27f=this.disabled||this.isValid(_27d);if(_27f){this._maskValidSubsetError=true;}var _280=this._isEmpty(this.textbox.value);var _281=!_27f&&!_280&&_27d&&this._isValidSubset();this.state=((_27f||((!this._hasBeenBlurred||_27d)&&_280)||_281)&&this._maskValidSubsetError)?"":"Error";if(this.state=="Error"){this._maskValidSubsetError=_27d;}this._setStateClass();dijit.setWaiState(this.focusNode,"invalid",_27f?"false":"true");if(_27d){if(this.state=="Error"){_27e=this.getErrorMessage(true);}else{_27e=this.getPromptMessage(true);}this._maskValidSubsetError=true;}this.displayMessage(_27e);return _27f;},_message:"",displayMessage:function(_282){if(this._message==_282){return;}this._message=_282;dijit.hideTooltip(this.domNode);if(_282){dijit.showTooltip(_282,this.domNode,this.tooltipPosition,!this.isLeftToRight());}},_refreshState:function(){this.validate(this._focused);this.inherited(arguments);},constructor:function(){this.constraints={};},_setConstraintsAttr:function(_283){if(!_283.locale&&this.lang){_283.locale=this.lang;}this.constraints=_283;this._computePartialRE();},_computePartialRE:function(){var p=this.regExpGen(this.constraints);this.regExp=p;var _284="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_284+=re;break;case ")":_284+="|$)";break;default:_284+="(?:"+re+"|$)";break;}});}try{"".search(_284);}catch(e){_284=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_284+")$";},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(_285){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_286){this.required=_286;dijit.setWaiState(this.focusNode,"required",_286);this._refreshState();},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,_287){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+"'":"")+">",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",rangeCheck:function(_288,_289){return ("min" in _289?(this.compare(_288,_289.min)>=0):true)&&("max" in _289?(this.compare(_288,_289.max)<=0):true);},isInRange:function(_28a){return this.rangeCheck(this.get("value"),this.constraints);},_isDefinitelyOutOfRange:function(){var val=this.get("value");var _28b=false;var _28c=false;if("min" in this.constraints){var min=this.constraints.min;min=this.compare(val,((typeof min=="number")&&min>=0&&val!=0)?0:min);_28b=(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);_28c=(typeof max=="number")&&max>0;}return _28b||_28c;},_isValidSubset:function(){return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();},isValid:function(_28d){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_28d));},getErrorMessage:function(_28e){var v=this.get("value");if(v!==null&&v!==""&&v!==undefined&&(typeof v!="number"||!isNaN(v))&&!this.isInRange(_28e)){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(_28f){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(_290,_291){dijit.setWaiState(this.focusNode,"valuenow",_290);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",null,{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/ComboBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachPoint=\"comboNode\" waiRole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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\tdojoAttachEvent=\"onkeypress:_onKeyPress,compositionend\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t/></div\n></div>\n"),baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"downArrowNode":"dijitDownArrowButton"},_getCaretPos:function(_292){var pos=0;if(typeof (_292.selectionStart)=="number"){pos=_292.selectionStart;}else{if(dojo.isIE){var tr=dojo.doc.selection.createRange().duplicate();var ntr=_292.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(_293,_294){_294=parseInt(_294);dijit.selectInputText(_293,_294,_294);},_setDisabledAttr:function(_295){this.inherited(arguments);dijit.setWaiState(this.comboNode,"disabled",_295);},_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._onKeyPress({charOrCode:229});}),100);}this.inherited(arguments);},_onKeyPress:function(evt){var key=evt.charOrCode;if(evt.altKey||((evt.ctrlKey||evt.metaKey)&&(key!="x"&&key!="v"))||key==dojo.keys.SHIFT){return;}var _296=false;var _297="_startSearchFromInput";var pw=this._popupWidget;var dk=dojo.keys;var _298=null;this._prev_key_backspace=false;this._abortQuery();if(this._isShowingNow){pw.handleKey(key);_298=pw.getHighlightedOption();}switch(key){case dk.PAGE_DOWN:case dk.DOWN_ARROW:case dk.PAGE_UP:case dk.UP_ARROW:if(!this._isShowingNow){_296=true;_297="_startSearchAll";}else{this._announceOption(_298);}dojo.stopEvent(evt);break;case dk.ENTER:if(_298){if(_298==pw.nextButton){this._nextSearch(1);dojo.stopEvent(evt);break;}else{if(_298==pw.previousButton){this._nextSearch(-1);dojo.stopEvent(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}evt.preventDefault();case dk.TAB:var _299=this.get("displayedValue");if(pw&&(_299==pw._messages["previousMessage"]||_299==pw._messages["nextMessage"])){break;}if(_298){this._selectOption();}if(this._isShowingNow){this._lastQuery=null;this._hideResultList();}break;case " ":if(_298){dojo.stopEvent(evt);this._selectOption();this._hideResultList();}else{_296=true;}break;case dk.ESCAPE:if(this._isShowingNow){dojo.stopEvent(evt);this._hideResultList();}break;case dk.DELETE:case dk.BACKSPACE:this._prev_key_backspace=true;_296=true;break;default:_296=typeof key=="string"||key==229;}if(_296){this.item=undefined;this.searchTimer=setTimeout(dojo.hitch(this,_297),1);}},_autoCompleteText:function(text){var fn=this.focusNode;dijit.selectInputText(fn,fn.value.length);var _29a=this.ignoreCase?"toLowerCase":"substr";if(text[_29a](0).indexOf(this.focusNode.value[_29a](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(_29b,_29c){this._fetchHandle=null;if(this.disabled||this.readOnly||(_29c.query[this.searchAttr]!=this._lastQuery)){return;}this._popupWidget.clearResultList();if(!_29b.length&&!this._maxOptions){this._hideResultList();return;}_29c._maxOptions=this._maxOptions;var _29d=this._popupWidget.createOptions(_29b,_29c,dojo.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_29c.direction){if(1==_29c.direction){this._popupWidget.highlightFirstOption();}else{if(-1==_29c.direction){this._popupWidget.highlightLastOption();}}this._announceOption(this._popupWidget.getHighlightedOption());}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_29c.query[this.searchAttr])){this._announceOption(_29d[1]);}}},_showResultList:function(){this._hideResultList();this.displayMessage("");dojo.style(this._popupWidget.domNode,{width:"",height:""});var best=this.open();var _29e=dojo.marginBox(this._popupWidget.domNode);this._popupWidget.domNode.style.overflow=((best.h==_29e.h)&&(best.w==_29e.w))?"hidden":"auto";var _29f=best.w;if(best.h<this._popupWidget.domNode.scrollHeight){_29f+=16;}dojo.marginBox(this._popupWidget.domNode,{h:best.h,w:Math.max(_29f,this.domNode.offsetWidth)});if(_29f<this.domNode.offsetWidth){this._popupWidget.domNode.parentNode.style.left=dojo.position(this.domNode,true).x+"px";}dijit.setWaiState(this.comboNode,"expanded","true");},_hideResultList:function(){this._abortQuery();if(this._isShowingNow){dijit.popup.close(this._popupWidget);this._isShowingNow=false;dijit.setWaiState(this.comboNode,"expanded","false");dijit.removeWaiState(this.focusNode,"activedescendant");}},_setBlurValue:function(){var _2a0=this.get("displayedValue");var pw=this._popupWidget;if(pw&&(_2a0==pw._messages["previousMessage"]||_2a0==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_2a0);}else{if(this.value!=this._lastValueReported){dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);}this._refreshState();}}},_onBlur:function(){this._hideResultList();this.inherited(arguments);},_setItemAttr:function(item,_2a1,_2a2){if(!_2a2){_2a2=this.labelFunc(item,this.store);}this.value=this._getValueField()!=this.searchAttr?this.store.getIdentity(item):_2a2;this.item=item;dijit.form.ComboBox.superclass._setValueAttr.call(this,this.value,_2a1,_2a2);},_announceOption:function(node){if(!node){return;}var _2a3;if(node==this._popupWidget.nextButton||node==this._popupWidget.previousButton){_2a3=node.innerHTML;this.item=undefined;this.value="";}else{_2a3=this.labelFunc(node.item,this.store);this.set("item",node.item,false,_2a3);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(node,"id"));this._autoCompleteText(_2a3);},_selectOption:function(evt){if(evt){this._announceOption(evt.target);}this._hideResultList();this._setCaretPos(this.focusNode,this.focusNode.value.length);dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);},_onArrowMouseDown:function(evt){if(this.disabled||this.readOnly){return;}dojo.stopEvent(evt);this.focus();if(this._isShowingNow){this._hideResultList();}else{this._startSearchAll();}},_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._popupWidget){var _2a4=this.id+"_popup";this._popupWidget=new dijit.form._ComboBoxMenu({onChange:dojo.hitch(this,this._selectOption),id:_2a4,dir:this.dir});dijit.removeWaiState(this.focusNode,"activedescendant");dijit.setWaiState(this.textbox,"owns",_2a4);}var _2a5=dojo.clone(this.query);this._lastInput=key;this._lastQuery=_2a5[this.searchAttr]=this._getQueryString(key);this.searchTimer=setTimeout(dojo.hitch(this,function(_2a6,_2a7){this.searchTimer=null;var _2a8={queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_2a6,onBegin:dojo.hitch(this,"_setMaxOptions"),onComplete:dojo.hitch(this,"_openResultList"),onError:function(_2a9){_2a7._fetchHandle=null;console.error("dijit.form.ComboBox: "+_2a9);dojo.hitch(_2a7,"_hideResultList")();},start:0,count:this.pageSize};dojo.mixin(_2a8,_2a7.fetchProperties);this._fetchHandle=_2a7.store.fetch(_2a8);var _2aa=function(_2ab,_2ac){_2ab.start+=_2ab.count*_2ac;_2ab.direction=_2ac;this._fetchHandle=this.store.fetch(_2ab);};this._nextSearch=this._popupWidget.onPage=dojo.hitch(this,_2aa,this._fetchHandle);},_2a5,this),this.searchDelay);},_setMaxOptions:function(size,_2ad){this._maxOptions=size;},_getValueField:function(){return this.searchAttr;},compositionend:function(evt){this._onKeyPress({charOrCode:229});},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _2ae=this.srcNodeRef;this.store=new dijit.form._ComboBoxDataStore(_2ae);if(!("value" in this.params)){var item=this.store.fetchSelectedItem();if(item){var _2af=this._getValueField();this.value=_2af!=this.searchAttr?this.store.getValue(item,_2af):this.labelFunc(item,this.store);}}}this.inherited(arguments);},postCreate:function(){if(!this.hasDownArrow){this.downArrowNode.style.display="none";}var _2b0=dojo.query("label[for=\""+this.id+"\"]");if(_2b0.length){_2b0[0].id=(this.id+"_label");var cn=this.comboNode;dijit.setWaiState(cn,"labelledby",_2b0[0].id);}this.inherited(arguments);},uninitialize:function(){if(this._popupWidget&&!this._popupWidget._destroyed){this._hideResultList();this._popupWidget.destroy();}this.inherited(arguments);},_getMenuLabelFromItem:function(item){var _2b1=this.labelAttr?this.store.getValue(item,this.labelAttr):this.labelFunc(item,this.store);var _2b2=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_2b1=this.doHighlight(_2b1,this._escapeHtml(this._lastInput));_2b2="html";}return {html:_2b2=="html",label:_2b1};},doHighlight:function(_2b3,find){var _2b4="i"+(this.highlightMatch=="all"?"g":"");var _2b5=this._escapeHtml(_2b3);find=dojo.regexp.escapeString(find);var ret=_2b5.replace(new RegExp("(^|\\s)("+find+")",_2b4),"$1<span class=\"dijitComboBoxHighlightMatch\">$2</span>");return ret;},_escapeHtml:function(str){str=String(str).replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");return str;},open:function(){this._isShowingNow=true;return dijit.popup.open({popup:this._popupWidget,around:this.domNode,parent:this});},reset:function(){this.item=null;this.inherited(arguments);},labelFunc:function(item,_2b6){return _2b6.getValue(item,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' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRole='option'></li>"+"</ul>",_messages:null,baseClass:"dijitComboBoxMenu",postMixInProperties:function(){this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang);this.inherited(arguments);},_setValueAttr:function(_2b7){this.value=_2b7;this.onChange(_2b7);},onChange:function(_2b8){},onPage:function(_2b9){},postCreate:function(){this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];this.inherited(arguments);},onClose:function(){this._blurOptionNode();},_createOption:function(item,_2ba){var _2bb=_2ba(item);var _2bc=dojo.doc.createElement("li");dijit.setWaiRole(_2bc,"option");if(_2bb.html){_2bc.innerHTML=_2bb.label;}else{_2bc.appendChild(dojo.doc.createTextNode(_2bb.label));}if(_2bc.innerHTML==""){_2bc.innerHTML="&nbsp;";}_2bc.item=item;return _2bc;},createOptions:function(_2bd,_2be,_2bf){this.previousButton.style.display=(_2be.start==0)?"none":"";dojo.attr(this.previousButton,"id",this.id+"_prev");dojo.forEach(_2bd,function(item,i){var _2c0=this._createOption(item,_2bf);_2c0.className="dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl");dojo.attr(_2c0,"id",this.id+i);this.domNode.insertBefore(_2c0,this.nextButton);},this);var _2c1=false;if(_2be._maxOptions&&_2be._maxOptions!=-1){if((_2be.start+_2be.count)<_2be._maxOptions){_2c1=true;}else{if((_2be.start+_2be.count)>_2be._maxOptions&&_2be.count==_2bd.length){_2c1=true;}}}else{if(_2be.count==_2bd.length){_2c1=true;}}this.nextButton.style.display=_2c1?"":"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]);}},_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.onPage(-1);}else{if(evt.target==this.nextButton){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 _2c2=this.domNode.firstChild;var _2c3=_2c2.nextSibling;this._focusOptionNode(_2c3.style.display=="none"?_2c2:_2c3);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 _2c4=0;var _2c5=this.domNode.scrollTop;var _2c6=dojo.style(this.domNode,"height");if(!this.getHighlightedOption()){this._highlightNextOption();}while(_2c4<_2c6){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 _2c7=this.domNode.scrollTop;_2c4+=(_2c7-_2c5)*(up?-1:1);_2c5=_2c7;}},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(key){switch(key){case dojo.keys.DOWN_ARROW:this._highlightNextOption();break;case dojo.keys.PAGE_DOWN:this.pageDown();break;case dojo.keys.UP_ARROW:this._highlightPrevOption();break;case dojo.keys.PAGE_UP:this.pageUp();break;}}});dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{_setValueAttr:function(_2c8,_2c9,_2ca){this.item=null;if(!_2c8){_2c8="";}dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_2c8,_2c9,_2ca);}});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,_2cb,_2cc){return (_2cb=="value")?item.value:(item.innerText||item.textContent||"");},isItemLoaded:function(_2cd){return true;},getFeatures:function(){return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};},_fetchItems:function(args,_2ce,_2cf){if(!args.query){args.query={};}if(!args.query.name){args.query.name="";}if(!args.queryOptions){args.queryOptions={};}var _2d0=dojo.data.util.filter.patternToRegExp(args.query.name,args.queryOptions.ignoreCase),_2d1=dojo.query("> option",this.root).filter(function(_2d2){return (_2d2.innerText||_2d2.textContent||"").match(_2d0);});if(args.sort){_2d1.sort(dojo.data.util.sorter.createSortFunction(args.sort,this));}_2ce(_2d1,args);},close:function(_2d3){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],{_isvalid:true,required:true,_lastDisplayedValue:"",isValid:function(){return this._isvalid||(!this.required&&this.get("displayedValue")=="");},_refreshState:function(){if(!this.searchTimer){this.inherited(arguments);}},_callbackSetLabel:function(_2d4,_2d5,_2d6){if((_2d5&&_2d5.query[this.searchAttr]!=this._lastQuery)||(!_2d5&&_2d4.length&&this.store.getIdentity(_2d4[0])!=this._lastQuery)){return;}if(!_2d4.length){this.valueNode.value="";dijit.form.TextBox.superclass._setValueAttr.call(this,"",_2d6||(_2d6===undefined&&!this._focused));this._isvalid=false;this.validate(this._focused);this.item=null;}else{this.set("item",_2d4[0],_2d6);}},_openResultList:function(_2d7,_2d8){if(_2d8.query[this.searchAttr]!=this._lastQuery){return;}if(this.item===undefined){this._isvalid=_2d7.length!=0||this._maxOptions!=0;this.validate(true);}dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_2d9,_2da){if(!this._onChangeActive){_2da=null;}this._lastQuery=_2d9;if(_2d9===null||_2d9===""){this._setDisplayedValueAttr("",_2da);return;}var self=this;this.store.fetchItemByIdentity({identity:_2d9,onItem:function(item){self._callbackSetLabel(item?[item]:[],undefined,_2da);}});},_setItemAttr:function(item,_2db,_2dc){this._isvalid=true;this.inherited(arguments);this.valueNode.value=this.value;this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(text){return text.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_2dd,_2de){if(!this._created){_2de=false;}if(this.store){this._hideResultList();var _2df=dojo.clone(this.query);this._lastQuery=_2df[this.searchAttr]=this._getDisplayQueryString(_2dd);this.textbox.value=_2dd;this._lastDisplayedValue=_2dd;var _2e0=this;var _2e1={query:_2df,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_2e2,_2e3){_2e0._fetchHandle=null;dojo.hitch(_2e0,"_callbackSetLabel")(_2e2,_2e3,_2de);},onError:function(_2e4){_2e0._fetchHandle=null;console.error("dijit.form.FilteringSelect: "+_2e4);dojo.hitch(_2e0,"_callbackSetLabel")([],undefined,false);}};dojo.mixin(_2e1,this.fetchProperties);this._fetchHandle=this.store.fetch(_2e1);}},postMixInProperties:function(){this.inherited(arguments);this._isvalid=!this.required;},undo:function(){this.set("displayedValue",this._lastDisplayedValue);}});}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(_2e5){this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._jsonFileUrl=_2e5.url;this._ccUrl=_2e5.url;this.url=_2e5.url;this._jsonData=_2e5.data;this.data=null;this._datatypeMap=_2e5.typeMap||{};if(!this._datatypeMap["Date"]){this._datatypeMap["Date"]={type:Date,deserialize:function(_2e6){return dojo.date.stamp.fromISOString(_2e6);}};}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(_2e5.urlPreventCache!==undefined){this.urlPreventCache=_2e5.urlPreventCache?true:false;}if(_2e5.hierarchical!==undefined){this.hierarchical=_2e5.hierarchical?true:false;}if(_2e5.clearOnClose){this.clearOnClose=true;}if("failOk" in _2e5){this.failOk=_2e5.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(_2e7){if(typeof _2e7!=="string"){throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");}},getValue:function(item,_2e8,_2e9){var _2ea=this.getValues(item,_2e8);return (_2ea.length>0)?_2ea[0]:_2e9;},getValues:function(item,_2eb){this._assertIsItem(item);this._assertIsAttribute(_2eb);return (item[_2eb]||[]).slice(0);},getAttributes:function(item){this._assertIsItem(item);var _2ec=[];for(var key in item){if((key!==this._storeRefPropName)&&(key!==this._itemNumPropName)&&(key!==this._rootItemPropName)&&(key!==this._reverseRefMap)){_2ec.push(key);}}return _2ec;},hasAttribute:function(item,_2ed){this._assertIsItem(item);this._assertIsAttribute(_2ed);return (_2ed in item);},containsValue:function(item,_2ee,_2ef){var _2f0=undefined;if(typeof _2ef==="string"){_2f0=dojo.data.util.filter.patternToRegExp(_2ef,false);}return this._containsValue(item,_2ee,_2ef,_2f0);},_containsValue:function(item,_2f1,_2f2,_2f3){return dojo.some(this.getValues(item,_2f1),function(_2f4){if(_2f4!==null&&!dojo.isObject(_2f4)&&_2f3){if(_2f4.toString().match(_2f3)){return true;}}else{if(_2f2===_2f4){return true;}}});},isItem:function(_2f5){if(_2f5&&_2f5[this._storeRefPropName]===this){if(this._arrayOfAllItems[_2f5[this._itemNumPropName]]===_2f5){return true;}}return false;},isItemLoaded:function(_2f6){return this.isItem(_2f6);},loadItem:function(_2f7){this._assertIsItem(_2f7.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(_2f8,_2f9,_2fa){var self=this,_2fb=function(_2fc,_2fd){var _2fe=[],i,key;if(_2fc.query){var _2ff,_300=_2fc.queryOptions?_2fc.queryOptions.ignoreCase:false;var _301={};for(key in _2fc.query){_2ff=_2fc.query[key];if(typeof _2ff==="string"){_301[key]=dojo.data.util.filter.patternToRegExp(_2ff,_300);}else{if(_2ff instanceof RegExp){_301[key]=_2ff;}}}for(i=0;i<_2fd.length;++i){var _302=true;var _303=_2fd[i];if(_303===null){_302=false;}else{for(key in _2fc.query){_2ff=_2fc.query[key];if(!self._containsValue(_303,key,_2ff,_301[key])){_302=false;}}}if(_302){_2fe.push(_303);}}_2f9(_2fe,_2fc);}else{for(i=0;i<_2fd.length;++i){var item=_2fd[i];if(item!==null){_2fe.push(item);}}_2f9(_2fe,_2fc);}};if(this._loadFinished){_2fb(_2f8,this._getItemsArray(_2f8.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==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_2f8,filter:_2fb});}else{this._loadInProgress=true;var _304={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _305=dojo.xhrGet(_304);_305.addCallback(function(data){try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;_2fb(_2f8,self._getItemsArray(_2f8.queryOptions));self._handleQueuedFetches();}catch(e){self._loadFinished=true;self._loadInProgress=false;_2fa(e,_2f8);}});_305.addErrback(function(_306){self._loadInProgress=false;_2fa(_306,_2f8);});var _307=null;if(_2f8.abort){_307=_2f8.abort;}_2f8.abort=function(){var df=_305;if(df&&df.fired===-1){df.cancel();df=null;}if(_307){_307.call(_2f8);}};}}else{if(this._jsonData){try{this._loadFinished=true;this._getItemsFromLoadedData(this._jsonData);this._jsonData=null;_2fb(_2f8,this._getItemsArray(_2f8.queryOptions));}catch(e){_2fa(e,_2f8);}}else{_2fa(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_2f8);}}}},_handleQueuedFetches:function(){if(this._queuedFetches.length>0){for(var i=0;i<this._queuedFetches.length;i++){var _308=this._queuedFetches[i],_309=_308.args,_30a=_308.filter;if(_30a){_30a(_309,this._getItemsArray(_309.queryOptions));}else{this.fetchItemByIdentity(_309);}}this._queuedFetches=[];}},_getItemsArray:function(_30b){if(_30b&&_30b.deep){return this._arrayOfAllItems;}return this._arrayOfTopLevelItems;},close:function(_30c){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(_30d){var _30e=false,self=this;function _30f(_310){var _311=((_310!==null)&&(typeof _310==="object")&&(!dojo.isArray(_310)||_30e)&&(!dojo.isFunction(_310))&&(_310.constructor==Object||dojo.isArray(_310))&&(typeof _310._reference==="undefined")&&(typeof _310._type==="undefined")&&(typeof _310._value==="undefined")&&self.hierarchical);return _311;};function _312(_313){self._arrayOfAllItems.push(_313);for(var _314 in _313){var _315=_313[_314];if(_315){if(dojo.isArray(_315)){var _316=_315;for(var k=0;k<_316.length;++k){var _317=_316[k];if(_30f(_317)){_312(_317);}}}else{if(_30f(_315)){_312(_315);}}}}};this._labelAttr=_30d.label;var i,item;this._arrayOfAllItems=[];this._arrayOfTopLevelItems=_30d.items;for(i=0;i<this._arrayOfTopLevelItems.length;++i){item=this._arrayOfTopLevelItems[i];if(dojo.isArray(item)){_30e=true;}_312(item);item[this._rootItemPropName]=true;}var _318={},key;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){if(key!==this._rootItemPropName){var _319=item[key];if(_319!==null){if(!dojo.isArray(_319)){item[key]=[_319];}}else{item[key]=[null];}}_318[key]=key;}}while(_318[this._storeRefPropName]){this._storeRefPropName+="_";}while(_318[this._itemNumPropName]){this._itemNumPropName+="_";}while(_318[this._reverseRefMap]){this._reverseRefMap+="_";}var _31a;var _31b=_30d.identifier;if(_31b){this._itemsByIdentity={};this._features["dojo.data.api.Identity"]=_31b;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];_31a=item[_31b];var _31c=_31a[0];if(!this._itemsByIdentity[_31c]){this._itemsByIdentity[_31c]=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: ["+_31b+"]. Value collided: ["+_31c+"]");}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: ["+_31b+"]. Value collided: ["+_31c+"]");}}}}}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){_31a=item[key];for(var j=0;j<_31a.length;++j){_319=_31a[j];if(_319!==null&&typeof _319=="object"){if(("_type" in _319)&&("_value" in _319)){var type=_319._type;var _31d=this._datatypeMap[type];if(!_31d){throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+type+"'");}else{if(dojo.isFunction(_31d)){_31a[j]=new _31d(_319._value);}else{if(dojo.isFunction(_31d.deserialize)){_31a[j]=_31d.deserialize(_319._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(_319._reference){var _31e=_319._reference;if(!dojo.isObject(_31e)){_31a[j]=this._getItemByIdentity(_31e);}else{for(var k=0;k<this._arrayOfAllItems.length;++k){var _31f=this._arrayOfAllItems[k],_320=true;for(var _321 in _31e){if(_31f[_321]!=_31e[_321]){_320=false;}}if(_320){_31a[j]=_31f;}}}if(this.referenceIntegrity){var _322=_31a[j];if(this.isItem(_322)){this._addReferenceToMap(_322,item,key);}}}else{if(this.isItem(_319)){if(this.referenceIntegrity){this._addReferenceToMap(_319,item,key);}}}}}}}},_addReferenceToMap:function(_323,_324,_325){},getIdentity:function(item){var _326=this._features["dojo.data.api.Identity"];if(_326===Number){return item[this._itemNumPropName];}else{var _327=item[_326];if(_327){return _327[0];}}return null;},fetchItemByIdentity:function(_328){var item,_329;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:_328});}else{this._loadInProgress=true;var _32a={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _32b=dojo.xhrGet(_32a);_32b.addCallback(function(data){var _32c=_328.scope?_328.scope:dojo.global;try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;item=self._getItemByIdentity(_328.identity);if(_328.onItem){_328.onItem.call(_32c,item);}self._handleQueuedFetches();}catch(error){self._loadInProgress=false;if(_328.onError){_328.onError.call(_32c,error);}}});_32b.addErrback(function(_32d){self._loadInProgress=false;if(_328.onError){var _32e=_328.scope?_328.scope:dojo.global;_328.onError.call(_32e,_32d);}});}}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;item=self._getItemByIdentity(_328.identity);if(_328.onItem){_329=_328.scope?_328.scope:dojo.global;_328.onItem.call(_329,item);}}}}else{item=this._getItemByIdentity(_328.identity);if(_328.onItem){_329=_328.scope?_328.scope:dojo.global;_328.onItem.call(_329,item);}}},_getItemByIdentity:function(_32f){var item=null;if(this._itemsByIdentity){item=this._itemsByIdentity[_32f];}else{item=this._arrayOfAllItems[_32f];}if(item===undefined){item=null;}return item;},getIdentityAttributes:function(item){var _330=this._features["dojo.data.api.Identity"];if(_330===Number){return null;}else{return [_330];}},_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==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){var _331={url:this._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk,sync:true};var _332=dojo.xhrGet(_331);_332.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;}});_332.addErrback(function(_333){throw _333;});}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["dijit._editor.plugins.FontChoice"]){dojo._hasResource["dijit._editor.plugins.FontChoice"]=true;dojo.provide("dijit._editor.plugins.FontChoice");dojo.declare("dijit._editor.plugins._FontDropDown",[dijit._Widget,dijit._Templated],{label:"",widgetsInTemplate:true,plainText:false,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(){this.inherited(arguments);this.strings=dojo.i18n.getLocalization("dijit._editor","FontChoice");this.label=this.strings[this.command];this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));this.selectId=this.id+"_select";this.inherited(arguments);},postCreate:function(){var _334=dojo.map(this.values,function(_335){var name=this.strings[_335]||_335;return {label:this.getLabel(_335,name),name:name,value:_335};},this);this.select.store=new dojo.data.ItemFileReadStore({data:{identifier:"value",items:_334}});this.select.set("value","",false);this.disabled=this.select.get("disabled");},_setValueAttr:function(_336,_337){_337=_337!==false?true:false;this.select.set("value",dojo.indexOf(this.values,_336)<0?"":_336,_337);if(!_337){this.select._lastValueReported=null;}},_getValueAttr:function(){return this.select.get("value");},focus:function(){this.select.focus();},_setDisabledAttr:function(_338){this.disabled=_338;this.select.set("disabled",_338);}});dojo.declare("dijit._editor.plugins._FontNameDropDown",dijit._editor.plugins._FontDropDown,{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(_339,name){if(this.plainText){return name;}else{return "<div style='font-family: "+_339+"'>"+name+"</div>";}},_setValueAttr:function(_33a,_33b){_33b=_33b!==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"};_33a=map[_33a]||_33a;}this.inherited(arguments,[_33a,_33b]);}});dojo.declare("dijit._editor.plugins._FontSizeDropDown",dijit._editor.plugins._FontDropDown,{command:"fontSize",values:[1,2,3,4,5,6,7],getLabel:function(_33c,name){if(this.plainText){return name;}else{return "<font size="+_33c+"'>"+name+"</font>";}},_setValueAttr:function(_33d,_33e){_33e=_33e!==false?true:false;if(_33d.indexOf&&_33d.indexOf("px")!=-1){var _33f=parseInt(_33d,10);_33d={10:1,13:2,16:3,18:4,24:5,32:6,48:7}[_33f]||_33d;}this.inherited(arguments,[_33d,_33e]);}});dojo.declare("dijit._editor.plugins._FormatBlockDropDown",dijit._editor.plugins._FontDropDown,{command:"formatBlock",values:["noFormat","p","h1","h2","h3","pre"],postCreate:function(){this.inherited(arguments);this.set("value","noFormat",false);},getLabel:function(_340,name){if(this.plainText){return name;}else{return "<"+_340+">"+name+"</"+_340+">";}},_execCommand:function(_341,_342,_343){if(_343==="noFormat"){var _344;var end;var sel=dijit.range.getSelection(_341.window);if(sel&&sel.rangeCount>0){var _345=sel.getRangeAt(0);var node,tag;if(_345){_344=_345.startContainer;end=_345.endContainer;while(_344&&_344!==_341.editNode&&_344!==_341.document.body&&_344.nodeType!==1){_344=_344.parentNode;}while(end&&end!==_341.editNode&&end!==_341.document.body&&end.nodeType!==1){end=end.parentNode;}var _346=dojo.hitch(this,function(node,_347){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(_341.window,"inSelection",dijit._editor.selection,[c])){var tag=c.tagName?c.tagName.toLowerCase():"";if(dojo.indexOf(this.values,tag)!==-1){_347.push(c);}_346(c,_347);}}}}});var _348=dojo.hitch(this,function(_349){if(_349&&_349.length){_341.beginEditing();while(_349.length){this._removeFormat(_341,_349.pop());}_341.endEditing();}});var _34a=[];if(_344==end){var _34b;node=_344;while(node&&node!==_341.editNode&&node!==_341.document.body){if(node.nodeType==1){tag=node.tagName?node.tagName.toLowerCase():"";if(dojo.indexOf(this.values,tag)!==-1){_34b=node;break;}}node=node.parentNode;}_346(_344,_34a);if(_34b){_34a=[_34b].concat(_34a);}_348(_34a);}else{node=_344;while(dojo.withGlobal(_341.window,"inSelection",dijit._editor.selection,[node])){if(node.nodeType==1){tag=node.tagName?node.tagName.toLowerCase():"";if(dojo.indexOf(this.values,tag)!==-1){_34a.push(node);}_346(node,_34a);}node=node.nextSibling;}_348(_34a);}_341.onDisplayChanged();}}}else{_341.execCommand(_342,_343);}},_removeFormat:function(_34c,node){if(_34c.customUndo){while(node.firstChild){dojo.place(node.firstChild,node,"before");}node.parentNode.removeChild(node);}else{dojo.withGlobal(_34c.window,"selectElementChildren",dijit._editor.selection,[node]);var html=dojo.withGlobal(_34c.window,"getSelectedHtml",dijit._editor.selection,[null]);dojo.withGlobal(_34c.window,"selectElement",dijit._editor.selection,[node]);_34c.execCommand("inserthtml",html||"");}}});dojo.declare("dijit._editor.plugins.FontChoice",dijit._editor._Plugin,{useDefaultCommand:false,_initButton:function(){var _34d={fontName:dijit._editor.plugins._FontNameDropDown,fontSize:dijit._editor.plugins._FontSizeDropDown,formatBlock:dijit._editor.plugins._FormatBlockDropDown}[this.command],_34e=this.params;if(this.params.custom){_34e.values=this.params.custom;}var _34f=this.editor;this.button=new _34d(dojo.delegate({dir:_34f.dir,lang:_34f.lang},_34e));this.connect(this.button.select,"onChange",function(_350){this.editor.focus();if(this.command=="fontName"&&_350.indexOf(" ")!=-1){_350="'"+_350+"'";}if(this.button._execCommand){this.button._execCommand(this.editor,this.command,_350);}else{this.editor.execCommand(this.command,_350);}this.editor.customUndo=this.editor.customUndo||dojo.isWebKit;});},updateState:function(){var _351=this.editor;var _352=this.command;if(!_351||!_351.isLoaded||!_352.length){return;}if(this.button){var _353;try{_353=_351.queryCommandValue(_352)||"";}catch(e){_353="";}var _354=dojo.isString(_353)&&_353.match(/'([^']*)'/);if(_354){_353=_354[1];}if(_352==="formatBlock"){if(!_353||_353=="p"){_353=null;var elem;var sel=dijit.range.getSelection(this.editor.window);if(sel&&sel.rangeCount>0){var _355=sel.getRangeAt(0);if(_355){elem=_355.endContainer;}}while(elem&&elem!==_351.editNode&&elem!==_351.document){var tg=elem.tagName?elem.tagName.toLowerCase():"";if(tg&&dojo.indexOf(this.button.values,tg)>-1){_353=tg;break;}elem=elem.parentNode;}if(!_353){_353="noFormat";}}else{if(dojo.indexOf(this.button.values,_353)<0){_353="noFormat";}}}if(_353!==this.button.get("value")){this.button.set("value",_353,false);}}}});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});}});}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(_356){var _357=_356,opts=this.options||[],l=opts.length;if(_357===undefined){return opts;}if(dojo.isArray(_357)){return dojo.map(_357,"return this.getOptions(item);",this);}if(dojo.isObject(_356)){if(!dojo.some(this.options,function(o,idx){if(o===_357||(o.value&&o.value===_357.value)){_357=idx;return true;}return false;})){_357=-1;}}if(typeof _357=="string"){for(var i=0;i<l;i++){if(opts[i].value===_357){_357=i;break;}}}if(typeof _357=="number"&&_357>=0&&_357<l){return this.options[_357];}return null;},addOption:function(_358){if(!dojo.isArray(_358)){_358=[_358];}dojo.forEach(_358,function(i){if(i&&dojo.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_359){if(!dojo.isArray(_359)){_359=[_359];}var _35a=this.getOptions(_359);dojo.forEach(_35a,function(i){if(i){this.options=dojo.filter(this.options,function(node,idx){return (node.value!==i.value);});this._removeOptionItem(i);}},this);this._loadChildren();},updateOption:function(_35b){if(!dojo.isArray(_35b)){_35b=[_35b];}dojo.forEach(_35b,function(i){var _35c=this.getOptions(i),k;if(_35c){for(k in i){_35c[k]=i[k];}}},this);this._loadChildren();},setStore:function(_35d,_35e,_35f){var _360=this.store;_35f=_35f||{};if(_360!==_35d){dojo.forEach(this._notifyConnections||[],dojo.disconnect);delete this._notifyConnections;if(_35d&&_35d.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[dojo.connect(_35d,"onNew",this,"_onNewItem"),dojo.connect(_35d,"onDelete",this,"_onDeleteItem"),dojo.connect(_35d,"onSet",this,"_onSetItem")];}this.store=_35d;}this._onChangeActive=false;if(this.options&&this.options.length){this.removeOption(this.options);}if(_35d){var cb=function(_361){if(this.sortByLabel&&!_35f.sort&&_361.length){_361.sort(dojo.data.util.sorter.createSortFunction([{attribute:_35d.getLabelAttributes(_361[0])[0]}],_35d));}if(_35f.onFetch){_361=_35f.onFetch(_361);}dojo.forEach(_361,function(i){this._addOptionForItem(i);},this);this._loadingStore=false;this.set("value",(("_pendingValue" in this)?this._pendingValue:_35e));delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_361);}this._fetchedWith=opts;this._lastValueReported=this.multiple?[]:null;this._onChangeActive=true;this.onSetStore();this._handleOnChange(this.value);};var opts=dojo.mixin({onComplete:cb,scope:this},_35f);this._loadingStore=true;_35d.fetch(opts);}else{delete this._fetchedWith;}return _360;},_setValueAttr:function(_362,_363){if(this._loadingStore){this._pendingValue=_362;return;}var opts=this.getOptions()||[];if(!dojo.isArray(_362)){_362=[_362];}dojo.forEach(_362,function(i,idx){if(!dojo.isObject(i)){i=i+"";}if(typeof i==="string"){_362[idx]=dojo.filter(opts,function(node){return node.value===i;})[0]||{value:"",label:""};}},this);_362=dojo.filter(_362,function(i){return i&&i.value;});if(!this.multiple&&(!_362[0]||!_362[0].value)&&opts.length){_362[0]=opts[0];}dojo.forEach(opts,function(i){i.selected=dojo.some(_362,function(v){return v.value===i.value;});});var val=dojo.map(_362,function(i){return i.value;}),disp=dojo.map(_362,function(i){return i.label;});this.value=this.multiple?val:val[0];this._setDisplay(this.multiple?disp:disp[0]);this._updateSelection();this._handleOnChange(this.value,_363);},_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];},_getValueDeprecated:false,getValue:function(){return this._lastValue;},undo:function(){this._setValueAttr(this._lastValueReported,false);},_loadChildren:function(){if(this._loadingStore){return;}dojo.forEach(this._getChildren(),function(_364){_364.destroyRecursive();});dojo.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this.value=this._getValueFromOpts();var val=this.value;if(!dojo.isArray(val)){val=[val];}if(val&&val[0]){dojo.forEach(this._getChildren(),function(_365){var _366=dojo.some(val,function(v){return _365.option&&(v===_365.option.value);});dojo.toggleClass(_365.domNode,this.baseClass+"SelectedOption",_366);dijit.setWaiState(_365.domNode,"selected",_366);},this);}this._handleOnChange(this.value);},_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,_367){if(!_367||!_367.parent){this._addOptionForItem(item);}},_onDeleteItem:function(item){var _368=this.store;this.removeOption(_368.getIdentity(item));},_onSetItem:function(item){this.updateOption(this._getOptionObjForItem(item));},_getOptionObjForItem:function(item){var _369=this.store,_36a=_369.getLabel(item),_36b=(_36a?_369.getIdentity(item):null);return {value:_36b,label:_36a,item:item};},_addOptionForItem:function(item){var _36c=this.store;if(!_36c.isItemLoaded(item)){_36c.loadItem({item:item,onComplete:function(i){this._addOptionForItem(item);},scope:this});return;}var _36d=this._getOptionObjForItem(item);this.addOption(_36d);},constructor:function(_36e){this._oValue=(_36e||{}).value||null;},_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("value"),label:String(node.innerHTML),selected:node.getAttribute("selected")||false,disabled:node.getAttribute("disabled")||false};},this):[];}if(!this.value){this.value=this._getValueFromOpts();}else{if(this.multiple&&typeof this.value=="string"){this.value=this.value.split(",");}}},postCreate:function(){dojo.setSelectable(this.focusNode,false);this.inherited(arguments);this.connect(this,"onChange","_updateSelection");this.connect(this,"startup","_loadChildren");this._setValueAttr(this.value,null);},startup:function(){this.inherited(arguments);var _36f=this.store,_370={};dojo.forEach(["query","queryOptions","onFetch"],function(i){if(this[i]){_370[i]=this[i];}delete this[i];},this);if(_36f&&_36f.getFeatures()["dojo.data.api.Identity"]){this.store=null;this.setStore(_36f,this._oValue,_370);}},destroy:function(){dojo.forEach(this._notifyConnections||[],dojo.disconnect);this.inherited(arguments);},_addOptionItem:function(_371){},_removeOptionItem:function(_372){},_setDisplay:function(_373){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions(this.get("value"));},_pseudoLoadChildren:function(_374){},onSetStore:function(){}});}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\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"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(_375){if(_375&&!("label" in this.params)){this.set("label",_375.innerHTML);}},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);var _376=this.id+"_text";dojo.attr(this.containerNode,"id",_376);if(this.accelKeyNode){dojo.attr(this.accelKeyNode,"id",this.id+"_accel");_376+=" "+this.id+"_accel";}dijit.setWaiState(this.domNode,"labelledby",_376);},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);this._hovering=false;this._setStateClass();},_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(_377){dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_377);},setLabel:function(_378){dojo.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_378);},setDisabled:function(_379){dojo.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_379);},_setDisabledAttr:function(_37a){this.disabled=_37a;dijit.setWaiState(this.focusNode,"disabled",_37a?"true":"false");},_setAccelKeyAttr:function(_37b){this.accelKey=_37b;this.accelKeyNode.style.display=_37b?"":"none";this.accelKeyNode.innerHTML=_37b;dojo.attr(this.containerNode,"colSpan",_37b?"1":"2");}});}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 _37c=dojo.query("*",this.srcNodeRef);dijit.PopupMenuItem.superclass._fillContent.call(this,_37c[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\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"presentation\">&nbsp;</td>\n</tr>\n"),checked:false,_setCheckedAttr:function(_37d){dojo.toggleClass(this.domNode,"dijitCheckedMenuItemChecked",_37d);dijit.setWaiState(this.domNode,"checked",_37d);this.checked=_37d;},onChange:function(_37e){},_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"),postCreate:function(){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(_37f){_37f.startup();});this.startupKeyNavChildren();this.inherited(arguments);},onExecute:function(){},onCancel:function(_380){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}else{var _381=this._getTopMenu();if(_381&&_381._isMenuBar){_381.focusNext();}}},_onPopupHover:function(evt){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _382=this.currentPopup.parentMenu;if(_382.focusedChild){_382.focusedChild._setSelected(false);}_382.focusedChild=this.currentPopup.from_item;_382.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 _383=item.popup;if(_383){this._stopPendingCloseTimer(_383);_383._pendingClose_timer=setTimeout(function(){_383._pendingClose_timer=null;if(_383.parentMenu){_383.parentMenu.currentPopup=null;}dijit.popup.close(_383);},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(_384){if(_384._pendingClose_timer){clearTimeout(_384._pendingClose_timer);_384._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 _385=this.focusedChild;if(!_385){return;}var _386=_385.popup;if(_386.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);dijit.popup.close(this.currentPopup);}_386.parentMenu=this;_386.from_item=_385;var self=this;dijit.popup.open({parent:this,popup:_386,around:_385.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(_385);self._cleanUp();_385._setSelected(true);self.focusedChild=_385;},onExecute:dojo.hitch(this,"_cleanUp")});this.currentPopup=_386;_386.connect(_386.domNode,"onmouseenter",dojo.hitch(self,"_onPopupHover"));if(_386.focus){_386._focus_timer=setTimeout(dojo.hitch(_386,function(){this._focus_timer=null;this.focus();}),0);}},_markActive:function(){this.isActive=true;dojo.addClass(this.domNode,"dijitMenuActive");dojo.removeClass(this.domNode,"dijitMenuPassive");},onOpen:function(e){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;dojo.removeClass(this.domNode,"dijitMenuActive");dojo.addClass(this.domNode,"dijitMenuPassive");},onClose:function(){this._stopFocusTimer();this._markInactive();this.isShowingNow=false;this.parentMenu=null;},_closeChild:function(){this._stopPopupTimer();if(this.focusedChild){this.focusedChild._setSelected(false);this.focusedChild._onUnhover();this.focusedChild=null;}if(this.currentPopup){dijit.popup.close(this.currentPopup);this.currentPopup=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\" waiRole=\"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(_387){var win=dojo.window.get(this._iframeContentDocument(_387))||this._iframeContentDocument(_387)["__parent__"]||(_387.name&&dojo.doc.frames[_387.name])||null;return win;},_iframeContentDocument:function(_388){var doc=_388.contentDocument||(_388.contentWindow&&_388.contentWindow.document)||(_388.name&&dojo.doc.frames[_388.name]&&dojo.doc.frames[_388.name].document)||null;return doc;},bindDomNode:function(node){node=dojo.byId(node);var cn;if(node.tagName.toLowerCase()=="iframe"){var _389=node,win=this._iframeContentWindow(_389);cn=dojo.withGlobal(win,dojo.body);}else{cn=(node==dojo.body()?dojo.doc.documentElement:node);}var _38a={node:node,iframe:_389};dojo.attr(node,"_dijitMenu"+this.id,this._bindings.push(_38a));var _38b=dojo.hitch(this,function(cn){return [dojo.connect(cn,this.leftClickToOpen?"onclick":"oncontextmenu",this,function(evt){dojo.stopEvent(evt);this._scheduleOpen(evt.target,_389,{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,_389);}})];});_38a.connects=cn?_38b(cn):[];if(_389){_38a.onloadHandler=dojo.hitch(this,function(){var win=this._iframeContentWindow(_389);cn=dojo.withGlobal(win,dojo.body);_38a.connects=_38b(cn);});if(_389.addEventListener){_389.addEventListener("load",_38a.onloadHandler,false);}else{_389.attachEvent("onload",_38a.onloadHandler);}}},unBindDomNode:function(_38c){var node;try{node=dojo.byId(_38c);}catch(e){return;}var _38d="_dijitMenu"+this.id;if(node&&dojo.hasAttr(node,_38d)){var bid=dojo.attr(node,_38d)-1,b=this._bindings[bid];dojo.forEach(b.connects,dojo.disconnect);var _38e=b.iframe;if(_38e){if(_38e.removeEventListener){_38e.removeEventListener("load",b.onloadHandler,false);}else{_38e.detachEvent("onload",b.onloadHandler);}}dojo.removeAttr(node,_38d);delete this._bindings[bid];}},_scheduleOpen:function(_38f,_390,_391){if(!this._openTimer){this._openTimer=setTimeout(dojo.hitch(this,function(){delete this._openTimer;this._openMyself({target:_38f,iframe:_390,coords:_391});}),1);}},_openMyself:function(args){var _392=args.target,_393=args.iframe,_394=args.coords;if(_394){if(_393){var od=_392.ownerDocument,ifc=dojo.position(_393,true),win=this._iframeContentWindow(_393),_395=dojo.withGlobal(win,"_docScroll",dojo);var cs=dojo.getComputedStyle(_393),tp=dojo._toPixelValue,left=(dojo.isIE&&dojo.isQuirks?0:tp(_393,cs.paddingLeft))+(dojo.isIE&&dojo.isQuirks?tp(_393,cs.borderLeftWidth):0),top=(dojo.isIE&&dojo.isQuirks?0:tp(_393,cs.paddingTop))+(dojo.isIE&&dojo.isQuirks?tp(_393,cs.borderTopWidth):0);_394.x+=ifc.x+left-_395.x;_394.y+=ifc.y+top-_395.y;}}else{_394=dojo.position(_392,true);_394.x+=10;_394.y+=10;}var self=this;var _396=dijit.getFocus(this);function _397(){if(self.refocus){dijit.focus(_396);}dijit.popup.close(self);};dijit.popup.open({popup:this,x:_394.x,y:_394.y,onExecute:_397,onCancel:_397,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);},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\twaiRole=\"combobox\" waiState=\"haspopup-true\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" waiRole=\"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}\" waiState=\"hidden-true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"titleNode\" waiRole=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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:"",tooltipPosition:[],emptyLabel:"",_isLoaded:false,_childrenLoaded:false,_fillContent:function(){this.inherited(arguments);if(this.options.length&&!this.value&&this.srcNodeRef){var si=this.srcNodeRef.selectedIndex;this.value=this.options[si!=-1?si:0].value;}this.dropDown=new dijit.form._SelectMenu({id:this.id+"_menu"});dojo.addClass(this.dropDown.domNode,this.baseClass+"Menu");},_getMenuItemForOption:function(_398){if(!_398.value){return new dijit.MenuSeparator();}else{var _399=dojo.hitch(this,"_setValueAttr",_398);var item=new dijit.MenuItem({option:_398,label:_398.label,onClick:_399,disabled:_398.disabled||false});dijit.setWaiRole(item.focusNode,"listitem");return item;}},_addOptionItem:function(_39a){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_39a));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_39b){if(_39b===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{dojo.forEach(this._getChildren(),function(_39c){_39c.destroyRecursive();});var item=new dijit.MenuItem({label:"&nbsp;"});this.dropDown.addChild(item);}}else{this._updateSelection();}var len=this.options.length;this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value);}},_setValueAttr:function(_39d){this.inherited(arguments);dojo.attr(this.valueNode,"value",this.get("value"));},_setDisplay:function(_39e){this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+(_39e||this.emptyLabel||"&nbsp;")+"</span>";dijit.setWaiState(this.focusNode,"valuetext",(_39e||this.emptyLabel||"&nbsp;"));},validate:function(_39f){var _3a0=this.isValid(_39f);this.state=_3a0?"":"Error";this._setStateClass();dijit.setWaiState(this.focusNode,"invalid",_3a0?"false":"true");var _3a1=_3a0?"":this._missingMsg;if(this._message!==_3a1){this._message=_3a1;dijit.hideTooltip(this.domNode);if(_3a1){dijit.showTooltip(_3a1,this.domNode,this.tooltipPosition,!this.isLeftToRight());}}return _3a0;},isValid:function(_3a2){return (!this.required||!(/^\s*$/.test(this.value)));},reset:function(){this.inherited(arguments);dijit.hideTooltip(this.domNode);this.state="";this._setStateClass();delete this._message;},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=dojo.i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);if(this.tableNode.style.width){dojo.addClass(this.domNode,this.baseClass+"FixedWidth");}},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_3a3){this._loadChildren(true);this._isLoaded=true;_3a3();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},uninitialize:function(_3a4){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_3a4);delete this.dropDown;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit._editor.plugins.LinkDialog"]){dojo._hasResource["dijit._editor.plugins.LinkDialog"]=true;dojo.provide("dijit._editor.plugins.LinkDialog");dojo.declare("dijit._editor.plugins.LinkDialog",dijit._editor._Plugin,{buttonClass:dijit.form.DropDownButton,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/]+(?:\\?[^?#\\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:new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),_userAtRxp:new RegExp("^([!#-'*+\\-\\/-9=?A-Z^-~]+[.])*[!#-'*+\\-\\/-9=?A-Z^-~]+@","i"),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(){var _3a5=this;this.tag=this.command=="insertImage"?"img":"a";var _3a6=dojo.mixin(dojo.i18n.getLocalization("dijit","common",this.lang),dojo.i18n.getLocalization("dijit._editor","LinkDialog",this.lang));var _3a7=(this.dropDown=new dijit.TooltipDialog({title:_3a6[this.command+"Title"],execute:dojo.hitch(this,"setValue"),onOpen:function(){_3a5._onOpenDialog();dijit.TooltipDialog.prototype.onOpen.apply(this,arguments);},onCancel:function(){setTimeout(dojo.hitch(_3a5,"_onCloseDialog"),0);}}));_3a6.urlRegExp=this.urlRegExp;_3a6.id=dijit.getUniqueId(this.editor.id);this._uniqueId=_3a6.id;this._setContent(_3a7.title+"<div style='border-bottom: 1px black solid;padding-bottom:2pt;margin-bottom:4pt'></div>"+dojo.string.substitute(this.linkDialogTemplate,_3a6));_3a7.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");}this._urlRegExp=new RegExp("^"+this.urlRegExp+"$","i");this._emailRegExp=new RegExp("^"+this.emailRegExp+"$","i");this._urlInput.isValid=dojo.hitch(this,function(){var _3a8=this._urlInput.get("value");return this._urlRegExp.test(_3a8)||this._emailRegExp.test(_3a8);});this._connectTagEvents();this.inherited(arguments);},_checkAndFixInput:function(){var self=this;var url=this._urlInput.get("value");var _3a9=function(url){var _3aa=false;var _3ab=false;if(url&&url.length>1){url=dojo.trim(url);if(url.indexOf("mailto:")!==0){if(url.indexOf("/")>0){if(url.indexOf("://")===-1){if(url.charAt(0)!=="/"&&url.indexOf("./")!==0){if(self._hostRxp.test(url)){_3aa=true;}}}}else{if(self._userAtRxp.test(url)){_3ab=true;}}}}if(_3aa){self._urlInput.set("value","http://"+url);}if(_3ab){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(){_3a9(url);},250);},_connectTagEvents:function(){this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){this.connect(this.editor.editNode,"ondblclick",this._onDblClick);}));},_isValid:function(){return this._urlInput.isValid()&&this._textInput.isValid();},_setContent:function(_3ac){this.dropDown.set("content",_3ac);},_checkValues:function(args){if(args&&args.urlInput){args.urlInput=args.urlInput.replace(/"/g,"&quot;");}return args;},setValue:function(args){this._onCloseDialog();if(dojo.isIE){var sel=dijit.range.getSelection(this.editor.window);var _3ad=sel.getRangeAt(0);var a=_3ad.endContainer;if(a.nodeType===3){a=a.parentNode;}if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){a=dojo.withGlobal(this.editor.window,"getSelectedElement",dijit._editor.selection,[this.tag]);}if(a&&(a.nodeName&&a.nodeName.toLowerCase()===this.tag)){if(this.editor.queryCommandEnabled("unlink")){dojo.withGlobal(this.editor.window,"selectElementChildren",dijit._editor.selection,[a]);this.editor.execCommand("unlink");}}}args=this._checkValues(args);this.editor.execCommand("inserthtml",dojo.string.substitute(this.htmlTemplate,args));},_onCloseDialog:function(){this.editor.focus();},_getCurrentValues:function(a){var url,text,_3ae;if(a&&a.tagName.toLowerCase()===this.tag){url=a.getAttribute("_djrealurl")||a.getAttribute("href");_3ae=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:_3ae||""};},_onOpenDialog:function(){var a;if(dojo.isIE){var sel=dijit.range.getSelection(this.editor.window);var _3af=sel.getRangeAt(0);a=_3af.endContainer;if(a.nodeType===3){a=a.parentNode;}if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){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){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(){this.button.set("disabled",false);this.button.openDropDown();}),10);}}}});dojo.declare("dijit._editor.plugins.ImgLinkDialog",[dijit._editor.plugins.LinkDialog],{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:"<img src=\"${urlInput}\" _djrealurl=\"${urlInput}\" alt=\"${textInput}\" />",tag:"img",_getCurrentValues:function(img){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||""};},_isValid:function(){return this._urlInput.isValid();},_connectTagEvents:function(){this.inherited(arguments);this.editor.onLoadDeferred.addCallback(dojo.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){dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[t]);}}},_checkValues:function(args){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){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(){this.button.set("disabled",false);this.button.openDropDown();}),10);}}}});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;}});}if(!dojo._hasResource["dijit.MenuBar"]){dojo._hasResource["dijit.MenuBar"]=true;dojo.provide("dijit.MenuBar");dojo.declare("dijit.MenuBar",dijit._MenuBase,{templateString:dojo.cache("dijit","templates/MenuBar.html","<div class=\"dijitMenuBar dijitMenuPassive\" dojoAttachPoint=\"containerNode\" waiRole=\"menubar\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress: _onKeyPress\"></div>\n"),baseClass:"dijitMenuBar",_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]);this._orient=this.isLeftToRight()?{BL:"TL"}:{BR:"TR"};},focusChild:function(item){var _3b0=this.focusedChild,_3b1=_3b0&&_3b0.popup&&_3b0.popup.isShowingNow;this.inherited(arguments);if(_3b1&&item.popup&&!item.disabled){this._openPopup();}},_onKeyPress:function(evt){if(evt.ctrlKey||evt.altKey){return;}switch(evt.charOrCode){case dojo.keys.DOWN_ARROW:this._moveToPopup(evt);dojo.stopEvent(evt);}},onItemClick:function(item,evt){if(item.popup&&item.popup.isShowingNow){item.popup.onCancel();}else{this.inherited(arguments);}}});}if(!dojo._hasResource["dijit.MenuBarItem"]){dojo._hasResource["dijit.MenuBarItem"]=true;dojo.provide("dijit.MenuBarItem");dojo.declare("dijit._MenuBarItemMixin",null,{templateString:dojo.cache("dijit","templates/MenuBarItem.html","<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span dojoAttachPoint=\"containerNode\"></span>\n</div>\n"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"containerNode",type:"innerHTML"}})});dojo.declare("dijit.MenuBarItem",[dijit.MenuItem,dijit._MenuBarItemMixin],{});}if(!dojo._hasResource["dijit.PopupMenuBarItem"]){dojo._hasResource["dijit.PopupMenuBarItem"]=true;dojo.provide("dijit.PopupMenuBarItem");dojo.declare("dijit.PopupMenuBarItem",[dijit.PopupMenuItem,dijit._MenuBarItemMixin],{});}if(!dojo._hasResource["dojo.number"]){dojo._hasResource["dojo.number"]=true;dojo.provide("dojo.number");dojo.number.format=function(_3b2,_3b3){_3b3=dojo.mixin({},_3b3||{});var _3b4=dojo.i18n.normalizeLocale(_3b3.locale),_3b5=dojo.i18n.getLocalization("dojo.cldr","number",_3b4);_3b3.customs=_3b5;var _3b6=_3b3.pattern||_3b5[(_3b3.type||"decimal")+"Format"];if(isNaN(_3b2)||Math.abs(_3b2)==Infinity){return null;}return dojo.number._applyPattern(_3b2,_3b6,_3b3);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_3b7,_3b8,_3b9){_3b9=_3b9||{};var _3ba=_3b9.customs.group,_3bb=_3b9.customs.decimal,_3bc=_3b8.split(";"),_3bd=_3bc[0];_3b8=_3bc[(_3b7<0)?1:0]||("-"+_3bd);if(_3b8.indexOf("%")!=-1){_3b7*=100;}else{if(_3b8.indexOf("‰")!=-1){_3b7*=1000;}else{if(_3b8.indexOf("¤")!=-1){_3ba=_3b9.customs.currencyGroup||_3ba;_3bb=_3b9.customs.currencyDecimal||_3bb;_3b8=_3b8.replace(/\u00a4{1,3}/,function(_3be){var prop=["symbol","currency","displayName"][_3be.length-1];return _3b9[prop]||_3b9.currency||"";});}else{if(_3b8.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _3bf=dojo.number._numberPatternRE;var _3c0=_3bd.match(_3bf);if(!_3c0){throw new Error("unable to find a number expression in pattern: "+_3b8);}if(_3b9.fractional===false){_3b9.places=0;}return _3b8.replace(_3bf,dojo.number._formatAbsolute(_3b7,_3c0[0],{decimal:_3bb,group:_3ba,places:_3b9.places,round:_3b9.round}));};dojo.number.round=function(_3c1,_3c2,_3c3){var _3c4=10/(_3c3||10);return (_3c4*+_3c1).toFixed(_3c2)/_3c4;};if((0.9).toFixed()==0){(function(){var _3c5=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 _3c5(v,p,m)+(v>0?d:-d);};})();}dojo.number._formatAbsolute=function(_3c6,_3c7,_3c8){_3c8=_3c8||{};if(_3c8.places===true){_3c8.places=0;}if(_3c8.places===Infinity){_3c8.places=6;}var _3c9=_3c7.split("."),_3ca=typeof _3c8.places=="string"&&_3c8.places.indexOf(","),_3cb=_3c8.places;if(_3ca){_3cb=_3c8.places.substring(_3ca+1);}else{if(!(_3cb>=0)){_3cb=(_3c9[1]||[]).length;}}if(!(_3c8.round<0)){_3c6=dojo.number.round(_3c6,_3cb,_3c8.round);}var _3cc=String(Math.abs(_3c6)).split("."),_3cd=_3cc[1]||"";if(_3c9[1]||_3c8.places){if(_3ca){_3c8.places=_3c8.places.substring(0,_3ca);}var pad=_3c8.places!==undefined?_3c8.places:(_3c9[1]&&_3c9[1].lastIndexOf("0")+1);if(pad>_3cd.length){_3cc[1]=dojo.string.pad(_3cd,pad,"0",true);}if(_3cb<_3cd.length){_3cc[1]=_3cd.substr(0,_3cb);}}else{if(_3cc[1]){_3cc.pop();}}var _3ce=_3c9[0].replace(",","");pad=_3ce.indexOf("0");if(pad!=-1){pad=_3ce.length-pad;if(pad>_3cc[0].length){_3cc[0]=dojo.string.pad(_3cc[0],pad);}if(_3ce.indexOf("#")==-1){_3cc[0]=_3cc[0].substr(_3cc[0].length-pad);}}var _3cf=_3c9[0].lastIndexOf(","),_3d0,_3d1;if(_3cf!=-1){_3d0=_3c9[0].length-_3cf-1;var _3d2=_3c9[0].substr(0,_3cf);_3cf=_3d2.lastIndexOf(",");if(_3cf!=-1){_3d1=_3d2.length-_3cf-1;}}var _3d3=[];for(var _3d4=_3cc[0];_3d4;){var off=_3d4.length-_3d0;_3d3.push((off>0)?_3d4.substr(off):_3d4);_3d4=(off>0)?_3d4.slice(0,off):"";if(_3d1){_3d0=_3d1;delete _3d1;}}_3cc[0]=_3d3.reverse().join(_3c8.group||",");return _3cc.join(_3c8.decimal||".");};dojo.number.regexp=function(_3d5){return dojo.number._parseInfo(_3d5).regexp;};dojo.number._parseInfo=function(_3d6){_3d6=_3d6||{};var _3d7=dojo.i18n.normalizeLocale(_3d6.locale),_3d8=dojo.i18n.getLocalization("dojo.cldr","number",_3d7),_3d9=_3d6.pattern||_3d8[(_3d6.type||"decimal")+"Format"],_3da=_3d8.group,_3db=_3d8.decimal,_3dc=1;if(_3d9.indexOf("%")!=-1){_3dc/=100;}else{if(_3d9.indexOf("‰")!=-1){_3dc/=1000;}else{var _3dd=_3d9.indexOf("¤")!=-1;if(_3dd){_3da=_3d8.currencyGroup||_3da;_3db=_3d8.currencyDecimal||_3db;}}}var _3de=_3d9.split(";");if(_3de.length==1){_3de.push("-"+_3de[0]);}var re=dojo.regexp.buildGroupRE(_3de,function(_3df){_3df="(?:"+dojo.regexp.escapeString(_3df,".")+")";return _3df.replace(dojo.number._numberPatternRE,function(_3e0){var _3e1={signed:false,separator:_3d6.strict?_3da:[_3da,""],fractional:_3d6.fractional,decimal:_3db,exponent:false},_3e2=_3e0.split("."),_3e3=_3d6.places;if(_3e2.length==1&&_3dc!=1){_3e2[1]="###";}if(_3e2.length==1||_3e3===0){_3e1.fractional=false;}else{if(_3e3===undefined){_3e3=_3d6.pattern?_3e2[1].lastIndexOf("0")+1:Infinity;}if(_3e3&&_3d6.fractional==undefined){_3e1.fractional=true;}if(!_3d6.places&&(_3e3<_3e2[1].length)){_3e3+=","+_3e2[1].length;}_3e1.places=_3e3;}var _3e4=_3e2[0].split(",");if(_3e4.length>1){_3e1.groupSize=_3e4.pop().length;if(_3e4.length>1){_3e1.groupSize2=_3e4.pop().length;}}return "("+dojo.number._realNumberRegexp(_3e1)+")";});},true);if(_3dd){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_3e5,_3e6,_3e7,_3e8){var prop=["symbol","currency","displayName"][_3e7.length-1],_3e9=dojo.regexp.escapeString(_3d6[prop]||_3d6.currency||"");_3e6=_3e6?"[\\s\\xa0]":"";_3e8=_3e8?"[\\s\\xa0]":"";if(!_3d6.strict){if(_3e6){_3e6+="*";}if(_3e8){_3e8+="*";}return "(?:"+_3e6+_3e9+_3e8+")?";}return _3e6+_3e9+_3e8;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_3da,decimal:_3db,factor:_3dc};};dojo.number.parse=function(_3ea,_3eb){var info=dojo.number._parseInfo(_3eb),_3ec=(new RegExp("^"+info.regexp+"$")).exec(_3ea);if(!_3ec){return NaN;}var _3ed=_3ec[1];if(!_3ec[1]){if(!_3ec[2]){return NaN;}_3ed=_3ec[2];info.factor*=-1;}_3ed=_3ed.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return _3ed*info.factor;};dojo.number._realNumberRegexp=function(_3ee){_3ee=_3ee||{};if(!("places" in _3ee)){_3ee.places=Infinity;}if(typeof _3ee.decimal!="string"){_3ee.decimal=".";}if(!("fractional" in _3ee)||/^0/.test(_3ee.places)){_3ee.fractional=[true,false];}if(!("exponent" in _3ee)){_3ee.exponent=[true,false];}if(!("eSigned" in _3ee)){_3ee.eSigned=[true,false];}var _3ef=dojo.number._integerRegexp(_3ee),_3f0=dojo.regexp.buildGroupRE(_3ee.fractional,function(q){var re="";if(q&&(_3ee.places!==0)){re="\\"+_3ee.decimal;if(_3ee.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_3ee.places+"}";}}return re;},true);var _3f1=dojo.regexp.buildGroupRE(_3ee.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_3ee.eSigned})+")";}return "";});var _3f2=_3ef+_3f0;if(_3f0){_3f2="(?:(?:"+_3f2+")|(?:"+_3f0+"))";}return _3f2+_3f1;};dojo.number._integerRegexp=function(_3f3){_3f3=_3f3||{};if(!("signed" in _3f3)){_3f3.signed=[true,false];}if(!("separator" in _3f3)){_3f3.separator="";}else{if(!("groupSize" in _3f3)){_3f3.groupSize=3;}}var _3f4=dojo.regexp.buildGroupRE(_3f3.signed,function(q){return q?"[-+]":"";},true);var _3f5=dojo.regexp.buildGroupRE(_3f3.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=dojo.regexp.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_3f3.groupSize,grp2=_3f3.groupSize2;if(grp2){var _3f6="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_3f6+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_3f6;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _3f4+_3f5;};}if(!dojo._hasResource["dijit.ProgressBar"]){dojo._hasResource["dijit.ProgressBar"]=true;dojo.provide("dijit.ProgressBar");dojo.declare("dijit.ProgressBar",[dijit._Widget,dijit._Templated],{progress:"0",maximum:100,places:0,indeterminate:false,name:"",templateString:dojo.cache("dijit","templates/ProgressBar.html","<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"),_indeterminateHighContrastImagePath:dojo.moduleUrl("dijit","themes/a11y/indeterminate_progress.gif"),postCreate:function(){this.inherited(arguments);this.indeterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath.toString());this.update();},update:function(_3f7){dojo.mixin(this,_3f7||{});var tip=this.internalProgress;var _3f8=1,_3f9;if(this.indeterminate){_3f9="addClass";dijit.removeWaiState(tip,"valuenow");dijit.removeWaiState(tip,"valuemin");dijit.removeWaiState(tip,"valuemax");}else{_3f9="removeClass";if(String(this.progress).indexOf("%")!=-1){_3f8=Math.min(parseFloat(this.progress)/100,1);this.progress=_3f8*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_3f8=this.progress/this.maximum;}var text=this.report(_3f8);this.label.firstChild.nodeValue=text;dijit.setWaiState(tip,"describedby",this.label.id);dijit.setWaiState(tip,"valuenow",this.progress);dijit.setWaiState(tip,"valuemin",0);dijit.setWaiState(tip,"valuemax",this.maximum);}dojo[_3f9](this.domNode,"dijitProgressBarIndeterminate");tip.style.width=(_3f8*100)+"%";this.onChange();},_setValueAttr:function(v){if(v==Infinity){this.update({indeterminate:true});}else{this.update({indeterminate:false,progress:v});}},_getValueAttr:function(){return this.progress;},report:function(_3fa){return dojo.number.format(_3fa,{type:"percent",places:this.places,locale:this.lang});},onChange:function(){}});}if(!dojo._hasResource["dijit.TitlePane"]){dojo._hasResource["dijit.TitlePane"]=true;dojo.provide("dijit.TitlePane");dojo.declare("dijit.TitlePane",[dijit.layout.ContentPane,dijit._Templated,dijit._CssStateMixin],{title:"",open:true,toggleable:true,tabIndex:"0",duration:dijit.defaultDuration,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\" waiRole=\"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\" waiRole=\"presentation\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\" waiRole=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\" 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"},id:""}),postCreate:function(){if(!this.open){this.hideNode.style.display=this.wipeNode.style.display="none";}if(this.toggleable){this._trackMouseState(this.titleBarNode,"dijitTitlePaneTitle");}this._setCss();dojo.setSelectable(this.titleNode,false);var _3fb=this.hideNode,_3fc=this.wipeNode;this._wipeIn=dojo.fx.wipeIn({node:this.wipeNode,duration:this.duration,beforeBegin:function(){_3fb.style.display="";}});this._wipeOut=dojo.fx.wipeOut({node:this.wipeNode,duration:this.duration,onEnd:function(){_3fb.style.display="none";}});this.inherited(arguments);},_setOpenAttr:function(open){if(this.open!==open){this.toggle();}dijit.setWaiState(this.containerNode,"hidden",this.open?"false":"true");dijit.setWaiState(this.focusNode,"pressed",this.open?"true":"false");},_setToggleableAttr:function(_3fd){this.toggleable=_3fd;dijit.setWaiRole(this.focusNode,_3fd?"button":"heading");if(_3fd){dijit.setWaiState(this.focusNode,"controls",this.id+"_pane");dojo.attr(this.focusNode,"tabIndex",this.tabIndex);}else{dojo.removeAttr(this.focusNode,"tabIndex");}this._setCss();},_setContentAttr:function(_3fe){if(!this.open||!this._wipeOut||this._wipeOut.status()=="playing"){this.inherited(arguments);}else{if(this._wipeIn&&this._wipeIn.status()=="playing"){this._wipeIn.stop();}dojo.marginBox(this.wipeNode,{h:dojo.marginBox(this.wipeNode).h});this.inherited(arguments);if(this._wipeIn){this._wipeIn.play();}else{this.hideNode.style.display="";}}},toggle:function(){dojo.forEach([this._wipeIn,this._wipeOut],function(_3ff){if(_3ff&&_3ff.status()=="playing"){_3ff.stop();}});var anim=this[this.open?"_wipeOut":"_wipeIn"];if(anim){anim.play();}else{this.hideNode.style.display=this.open?"":"none";}this.open=!this.open;if(this.open){this._onShow();}else{this.onHide();}this._setCss();},_setCss:function(){var node=this.titleBarNode||this.focusNode;if(this._titleBarClass){dojo.removeClass(node,this._titleBarClass);}this._titleBarClass="dijit"+(this.toggleable?"":"Fixed")+(this.open?"Open":"Closed");dojo.addClass(node,this._titleBarClass);this.arrowNodeInner.innerHTML=this.open?"-":"+";},_onTitleKey:function(e){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(){if(this.toggleable){this.toggle();}},setTitle:function(_400){dojo.deprecated("dijit.TitlePane.setTitle() is deprecated. Use set('title', ...) instead.","","2.0");this.set("title",_400);}});}if(!dojo._hasResource["dojo.DeferredList"]){dojo._hasResource["dojo.DeferredList"]=true;dojo.provide("dojo.DeferredList");dojo.DeferredList=function(list,_401,_402,_403,_404){var _405=[];dojo.Deferred.call(this);var self=this;if(list.length===0&&!_401){this.resolve([0,[]]);}var _406=0;dojo.forEach(list,function(item,i){item.then(function(_407){if(_401){self.resolve([i,_407]);}else{_408(true,_407);}},function(_409){if(_402){self.reject(_409);}else{_408(false,_409);}if(_403){return null;}throw _409;});function _408(_40a,_40b){_405[i]=[_40a,_40b];_406++;if(_406===list.length){self.resolve(_405);}};});};dojo.DeferredList.prototype=new dojo.Deferred();dojo.DeferredList.prototype.gatherResults=function(_40c){var d=new dojo.DeferredList(_40c,false,true,false);d.addCallback(function(_40d){var ret=[];dojo.forEach(_40d,function(_40e){ret.push(_40e[1]);});return ret;});return d;};}if(!dojo._hasResource["dojo.cookie"]){dojo._hasResource["dojo.cookie"]=true;dojo.provide("dojo.cookie");dojo.cookie=function(name,_40f,_410){var c=document.cookie;if(arguments.length==1){var _411=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(name)+"=([^;]*)"));return _411?decodeURIComponent(_411[1]):undefined;}else{_410=_410||{};var exp=_410.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_410.expires=d;}if(exp&&exp.toUTCString){_410.expires=exp.toUTCString();}_40f=encodeURIComponent(_40f);var _412=name+"="+_40f,_413;for(_413 in _410){_412+="; "+_413;var _414=_410[_413];if(_414!==true){_412+="="+_414;}}document.cookie=_412;}};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.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 _415=this.store;if(!_415.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_415.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([dojo.connect(_415,"onNew",this,"onNewItem"),dojo.connect(_415,"onDelete",this,"onDeleteItem"),dojo.connect(_415,"onSet",this,"onSetItem")]);}},destroy:function(){dojo.forEach(this.connects,dojo.disconnect);},getRoot:function(_416,_417){if(this.root){_416(this.root);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_418){if(_418.length!=1){throw new Error(this.declaredClass+": query "+dojo.toJson(this.query)+" returned "+_418.length+" items, but must return exactly one item");}this.root=_418[0];_416(this.root);}),onError:_417});}},mayHaveChildren:function(item){return dojo.some(this.childrenAttrs,function(attr){return this.store.hasAttribute(item,attr);},this);},getChildren:function(_419,_41a,_41b){var _41c=this.store;if(!_41c.isItemLoaded(_419)){var _41d=dojo.hitch(this,arguments.callee);_41c.loadItem({item:_419,onItem:function(_41e){_41d(_41e,_41a,_41b);},onError:_41b});return;}var _41f=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_41c.getValues(_419,this.childrenAttrs[i]);_41f=_41f.concat(vals);}var _420=0;if(!this.deferItemLoadingUntilExpand){dojo.forEach(_41f,function(item){if(!_41c.isItemLoaded(item)){_420++;}});}if(_420==0){_41a(_41f);}else{dojo.forEach(_41f,function(item,idx){if(!_41c.isItemLoaded(item)){_41c.loadItem({item:item,onItem:function(item){_41f[idx]=item;if(--_420==0){_41a(_41f);}},onError:_41b});}});}},isItem:function(_421){return this.store.isItem(_421);},fetchItemByIdentity:function(_422){this.store.fetchItemByIdentity(_422);},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,_423,_424){var _425={parent:_423,attribute:this.childrenAttrs[0],insertIndex:_424};if(this.newItemIdAttr&&args[this.newItemIdAttr]){this.fetchItemByIdentity({identity:args[this.newItemIdAttr],scope:this,onItem:function(item){if(item){this.pasteItem(item,null,_423,true,_424);}else{this.store.newItem(args,_425);}}});}else{this.store.newItem(args,_425);}},pasteItem:function(_426,_427,_428,_429,_42a){var _42b=this.store,_42c=this.childrenAttrs[0];if(_427){dojo.forEach(this.childrenAttrs,function(attr){if(_42b.containsValue(_427,attr,_426)){if(!_429){var _42d=dojo.filter(_42b.getValues(_427,attr),function(x){return x!=_426;});_42b.setValues(_427,attr,_42d);}_42c=attr;}});}if(_428){if(typeof _42a=="number"){var _42e=_42b.getValues(_428,_42c).slice();_42e.splice(_42a,0,_426);_42b.setValues(_428,_42c,_42e);}else{_42b.setValues(_428,_42c,_42b.getValues(_428,_42c).concat(_426));}}},onChange:function(item){},onChildrenChange:function(_42f,_430){},onDelete:function(_431,_432){},onNewItem:function(item,_433){if(!_433){return;}this.getChildren(_433.item,dojo.hitch(this,function(_434){this.onChildrenChange(_433.item,_434);}));},onDeleteItem:function(item){this.onDelete(item);},onSetItem:function(item,_435,_436,_437){if(dojo.indexOf(this.childrenAttrs,_435)!=-1){this.getChildren(item,dojo.hitch(this,function(_438){this.onChildrenChange(item,_438);}));}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(_439){this.root={store:this,root:true,id:_439.rootId,label:_439.rootLabel,children:_439.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_43a,_43b,_43c){if(_43a===this.root){if(this.root.children){_43b(this.root.children);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_43d){this.root.children=_43d;_43b(_43d);}),onError:_43c});}}else{this.inherited(arguments);}},isItem:function(_43e){return (_43e===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_43f){if(_43f.identity==this.root.id){var _440=_43f.scope?_43f.scope:dojo.global;if(_43f.onItem){_43f.onItem.call(_440,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,_441,_442){if(_441===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(args){},pasteItem:function(_443,_444,_445,_446,_447){if(_444===this.root){if(!_446){this.onLeaveRoot(_443);}}dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_443,_444===this.root?null:_444,_445===this.root?null:_445,_446,_447);if(_445===this.root){this.onAddToRoot(_443);}},onAddToRoot:function(item){},onLeaveRoot:function(item){},_requeryTop:function(){var _448=this.root.children||[];this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_449){this.root.children=_449;if(_448.length!=_449.length||dojo.some(_448,function(item,idx){return _449[idx]!=item;})){this.onChildrenChange(this.root,_449);}})});},onNewItem:function(item,_44a){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(item){if(dojo.indexOf(this.root.children,item)!=-1){this._requeryTop();}this.inherited(arguments);}});}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\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t/><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" waiRole=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" waiRole=\"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"}}),postCreate:function(){this.inherited(arguments);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);}},_setIndentAttr:function(_44b){this.indent=_44b;var _44c=(Math.max(_44b,0)*this.tree._nodePixelIndent)+"px";dojo.style(this.domNode,"backgroundPosition",_44c+" 0px");dojo.style(this.rowNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_44c);dojo.forEach(this.getChildren(),function(_44d){_44d.set("indent",_44b+1);});},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_44e=tree.model;if(tree._v10Compat&&item===_44e.root){item=null;}this._applyClassAndStyle(item,"icon","Icon");this._applyClassAndStyle(item,"label","Label");this._applyClassAndStyle(item,"row","Row");},_applyClassAndStyle:function(item,_44f,_450){var _451="_"+_44f+"Class";var _452=_44f+"Node";if(this[_451]){dojo.removeClass(this[_452],this[_451]);}this[_451]=this.tree["get"+_450+"Class"](item,this.isExpanded);if(this[_451]){dojo.addClass(this[_452],this[_451]);}dojo.style(this[_452],this.tree["get"+_450+"Style"](item,this.isExpanded)||{});},_updateLayout:function(){var _453=this.getParent();if(!_453||_453.rowNode.style.display=="none"){dojo.addClass(this.domNode,"dijitTreeIsRoot");}else{dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_454){var _455=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_456=["*","-","+","*"],idx=_454?0:(this.isExpandable?(this.isExpanded?1:2):3);dojo.removeClass(this.expandoNode,_455);dojo.addClass(this.expandoNode,_455[idx]);this.expandoNodeText.innerHTML=_456[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}this._wipeOut&&this._wipeOut.stop();this.isExpanded=true;dijit.setWaiState(this.labelNode,"expanded","true");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,_457=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new dojo.Deferred(function(){_457.stop();}));_457.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(_458){var tree=this.tree,_459=tree.model,defs=[];dojo.forEach(this.getChildren(),function(_45a){dijit._Container.prototype.removeChild.call(this,_45a);},this);this.state="LOADED";if(_458&&_458.length>0){this.isExpandable=true;dojo.forEach(_458,function(item){var id=_459.getIdentity(item),_45b=tree._itemNodesMap[id],node;if(_45b){for(var i=0;i<_45b.length;i++){if(_45b[i]&&!_45b[i].getParent()){node=_45b[i];node.set("indent",this.indent+1);break;}}}if(!node){node=this.tree._createTreeNode({item:item,tree:tree,isExpandable:_459.mayHaveChildren(item),label:tree.getLabel(item),tooltip:tree.getTooltip(item),dir:tree.dir,lang:tree.lang,indent:this.indent+1});if(_45b){_45b.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(_45c,idx){_45c._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);},removeChild:function(node){this.inherited(arguments);var _45d=this.getChildren();if(_45d.length==0){this.isExpandable=false;this.collapse();}dojo.forEach(_45d,function(_45e){_45e._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(evt){this.tree._onNodeFocus(this);},setSelected:function(_45f){dijit.setWaiState(this.labelNode,"selected",_45f);dojo.toggleClass(this.rowNode,"dijitTreeRowSelected",_45f);},setFocusable:function(_460){this.labelNode.setAttribute("tabIndex",_460?"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"],path:[],selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:dojo.cache("dijit","templates/Tree.html","<div class=\"dijitTree dijitTreeContainer\" waiRole=\"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:null,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(_461,_462){dojo.publish(this.id,[dojo.mixin({tree:this,event:_461},_462||{})]);},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 _463={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_463[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_463);}},_store2model:function(){this._v10Compat=true;dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _464={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_464.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_464.getChildren=dojo.hitch(this,function(item,_465,_466){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_465,_466);});}this.model=new dijit.tree.ForestStoreModel(_464);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";}this.domNode.appendChild(rn.domNode);var _467=this.model.getIdentity(item);if(this._itemNodesMap[_467]){this._itemNodesMap[_467].push(rn);}else{this._itemNodesMap[_467]=[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 _468=dojo.isString(item)?item:this.model.getIdentity(item);return [].concat(this._itemNodesMap[_468]);},_setSelectedItemAttr:function(item){var _469=this.get("selectedItem");var _46a=(!item||dojo.isString(item))?item:this.model.getIdentity(item);if(_46a==_469?this.model.getIdentity(_469):null){return;}var _46b=this._itemNodesMap[_46a];this._selectNode((_46b&&_46b[0])||null);},_getSelectedItemAttr:function(){return this.selectedNode&&this.selectedNode.item;},_setPathAttr:function(path){var d=new dojo.Deferred();this._selectNode(null);if(!path||!path.length){d.resolve(true);return d;}this._loadDeferred.addCallback(dojo.hitch(this,function(){if(!this.rootNode){d.reject(new Error("!this.rootNode"));return;}if(path[0]!==this.rootNode.item&&(dojo.isString(path[0])&&path[0]!=this.model.getIdentity(this.rootNode.item))){d.reject(new Error(this.id+":path[0] doesn't match this.rootNode.item. Maybe you are using the wrong tree."));return;}path.shift();var node=this.rootNode;function _46c(){var item=path.shift(),_46d=dojo.isString(item)?item:this.model.getIdentity(item);dojo.some(this._itemNodesMap[_46d],function(n){if(n.getParent()==node){node=n;return true;}return false;});if(path.length){this._expandNode(node).addCallback(dojo.hitch(this,_46c));}else{this._selectNode(node);d.resolve(true);}};this._expandNode(node).addCallback(dojo.hitch(this,_46c));}));return d;},_getPathAttr:function(){if(!this.selectedNode){return;}var res=[];var _46e=this.selectedNode;while(_46e&&_46e!==this.rootNode){res.unshift(_46e.item);_46e=_46e.getParent();}res.unshift(this.rootNode.item);return res;},mayHaveChildren:function(item){},getItemChildren:function(_46f,_470){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_471){return (!item||this.model.mayHaveChildren(item))?(_471?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(item,_472){},getRowClass:function(item,_473){},getIconStyle:function(item,_474){},getLabelStyle:function(item,_475){},getRowStyle:function(item,_476){},getTooltip:function(item){return "";},_onKeyPress:function(e){if(e.altKey){return;}var dk=dojo.keys;var _477=dijit.getEnclosingWidget(e.target);if(!_477){return;}var key=e.charOrCode;if(typeof key=="string"){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_477,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[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:_477,item:_477.item,evt:e});dojo.stopEvent(e);}}},_onEnterKey:function(_478,evt){this._publish("execute",{item:_478.item,node:_478.node});this._selectNode(_478.node);this.onClick(_478.item,_478.node,evt);},_onDownArrow:function(_479){var node=this._getNextNode(_479.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_47a){var node=_47a.node;var _47b=node.getPreviousSibling();if(_47b){node=_47b;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _47c=node.getChildren();node=_47c[_47c.length-1];}}else{var _47d=node.getParent();if(!(!this.showRoot&&_47d===this.rootNode)){node=_47d;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_47e){var node=_47e.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(_47f){var node=_47f.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{var _480=node.getParent();if(_480&&_480.isTreeNode&&!(!this.showRoot&&_480===this.rootNode)){this.focusNode(_480);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(_481){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(_482){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_482.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_482.key,startNode:_482.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);}}},_onClick:function(_483,e){var _484=e.target,_485=(_484==_483.expandoNode||_484==_483.expandoNodeText);if((this.openOnClick&&_483.isExpandable)||_485){if(_483.isExpandable){this._onExpandoClick({node:_483});}}else{this._publish("execute",{item:_483.item,node:_483,evt:e});this.onClick(_483.item,_483,e);this.focusNode(_483);}if(!_485){this._selectNode(_483);}dojo.stopEvent(e);},_onDblClick:function(_486,e){var _487=e.target,_488=(_487==_486.expandoNode||_487==_486.expandoNodeText);if((this.openOnDblClick&&_486.isExpandable)||_488){if(_486.isExpandable){this._onExpandoClick({node:_486});}}else{this._publish("execute",{item:_486.item,node:_486,evt:e});this.onDblClick(_486.item,_486,e);this.focusNode(_486);}if(!_488){this._selectNode(_486);}dojo.stopEvent(e);},_onExpandoClick:function(_489){var node=_489.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 _48a=node.getNextSibling();if(_48a){return _48a;}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,_48b){if(node._expandNodeDeferred&&!_48b){return node._expandNodeDeferred;}var _48c=this.model,item=node.item,_48d=this;switch(node.state){case "UNCHECKED":node.markProcessing();var def=(node._expandNodeDeferred=new dojo.Deferred());_48c.getChildren(item,function(_48e){node.unmarkProcessing();var scid=node.setChildItems(_48e);var ed=_48d._expandNode(node,true);scid.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_48d,": 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);},_selectNode:function(node){if(this.selectedNode&&!this.selectedNode._destroyed){this.selectedNode.setSelected(false);}if(node){node.setSelected(true);}this.selectedNode=node;},_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 _48f=this.model,_490=_48f.getIdentity(item),_491=this._itemNodesMap[_490];if(_491){var _492=this.getLabel(item),_493=this.getTooltip(item);dojo.forEach(_491,function(node){node.set({item:item,label:_492,tooltip:_493});node._updateItemClasses(item);});}},_onItemChildrenChange:function(_494,_495){var _496=this.model,_497=_496.getIdentity(_494),_498=this._itemNodesMap[_497];if(_498){dojo.forEach(_498,function(_499){_499.setChildItems(_495);});}},_onItemDelete:function(item){var _49a=this.model,_49b=_49a.getIdentity(item),_49c=this._itemNodesMap[_49b];if(_49c){dojo.forEach(_49c,function(node){var _49d=node.getParent();if(_49d){_49d.removeChild(node);}node.destroyRecursive();});delete this._itemNodesMap[_49b];}},_initState:function(){if(this.persist){var _49e=dojo.cookie(this.cookieName);this._openedItemIds={};if(_49e){dojo.forEach(_49e.split(","),function(item){this._openedItemIds[item]=true;},this);}}},_state:function(item,_49f){if(!this.persist){return false;}var id=this.model.getIdentity(item);if(arguments.length===1){return this._openedItemIds[id];}if(_49f){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(_4a0){if(_4a0){dojo.marginBox(this.domNode,_4a0);dojo.style(this.domNode,"overflow","auto");}this._nodePixelIndent=dojo.marginBox(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["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:{},onChange:function(_4a1){},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 _4a2={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _4a2){this.connect(this.displayNode,name,_4a2[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(_4a3){dojo.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_4a3);},_setDisabledAttr:function(_4a4){this.disabled=_4a4;dijit.setWaiState(this.domNode,"disabled",_4a4);if(_4a4){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}dojo.toggleClass(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_4a4);},_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 _4a5=dojo.create("span",null,this.domNode,"before");var ewc=dojo.getObject(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")},_4a5);}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.destroy();delete this.wrapperWidget;}this.inherited(arguments);},_showText:function(_4a6){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(_4a6){dijit.focus(this.displayNode);}},save:function(_4a7){if(this.disabled||!this.editing){return;}this.editing=false;var ww=this.wrapperWidget;var _4a8=ww.getValue();this.set("value",_4a8);setTimeout(dojo.hitch(this,"onChange",_4a8),0);this._showText(_4a7);},setValue:function(val){dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(val){this.value=val=dojo.trim(val);if(!this.renderAsHtml){val=val.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");}this.displayNode.innerHTML=val||this.noValueIndicator;},getValue:function(){dojo.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},cancel:function(_4a9){if(this.disabled||!this.editing){return;}this.editing=false;setTimeout(dojo.hitch(this,"onCancel"),0);this._showText(_4a9);}});dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit","templates/InlineEditBox.html","<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\"\n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" label=\"${buttonSave}\"></button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\" label=\"${buttonCancel}\"></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);},postCreate:function(){var cls=dojo.getObject(this.editor);var _4aa=this.sourceStyle,_4ab="line-height:"+_4aa.lineHeight+";",_4ac=dojo.getComputedStyle(this.domNode);dojo.forEach(["Weight","Family","Size","Style"],function(prop){var _4ad=_4aa["font"+prop],_4ae=_4ac["font"+prop];if(_4ae!=_4ad){_4ab+="font-"+prop+":"+_4aa["font"+prop]+";";}},this);dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_4aa[prop];},this);var _4af=this.inlineEditBox.width;if(_4af=="100%"){_4ab+="width:100%;";this.domNode.style.display="block";}else{_4ab+="width:"+(_4af+(Number(_4af)==_4af?"px":""))+";";}var _4b0=dojo.delegate(this.inlineEditBox.editorParams,{style:_4ab,dir:this.dir,lang:this.lang});_4b0["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;var ew=(this.editWidget=new cls(_4b0,this.editorPlaceholder));if(this.inlineEditBox.autoSave){dojo.destroy(this.buttonContainer);this.connect(ew,"onChange","_onChange");this.connect(ew,"onKeyPress","_onKeyPress");}else{if("intermediateChanges" in cls.prototype){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["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],{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(_4b1){},onExecute:function(){},_setEncTypeAttr:function(_4b2){this.encType=_4b2;dojo.attr(this.domNode,"encType",_4b2);if(dojo.isIE){this.domNode.encoding=_4b2;}},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.DropDownButton"]){dojo._hasResource["dijit.form.DropDownButton"]=true;dojo.provide("dijit.form.DropDownButton");}if(!dojo._hasResource["dijit.form.ComboButton"]){dojo._hasResource["dijit.form.ComboButton"]=true;dojo.provide("dijit.form.ComboButton");}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\" waiRole=\"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(_4b3){this.readOnly=_4b3;dojo.attr(this.focusNode,"readOnly",_4b3);dijit.setWaiState(this.focusNode,"readonly",_4b3);},_setValueAttr:function(_4b4,_4b5){if(typeof _4b4=="string"){this.value=_4b4;dojo.attr(this.focusNode,"value",_4b4);_4b4=true;}if(this._created){this.set("checked",_4b4,_4b5);}},_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(_4b6){},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);this.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){return false;}return this.inherited(arguments);}});dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_setCheckedAttr:function(_4b7){this.inherited(arguments);if(!this._created){return;}if(_4b7){var _4b8=this;dojo.query("INPUT[type=radio]",this.focusNode.form||dojo.doc).forEach(function(_4b9){if(_4b9.name==_4b8.name&&_4b9!=_4b8.focusNode&&_4b9.form==_4b8.focusNode.form){var _4ba=dijit.getEnclosingWidget(_4b9);if(_4ba&&_4ba.checked){_4ba.set("checked",false);}}});}},_clicked:function(e){if(!this.checked){this.set("checked",true);}}});}if(!dojo._hasResource["dijit.form.RadioButton"]){dojo._hasResource["dijit.form.RadioButton"]=true;dojo.provide("dijit.form.RadioButton");}if(!dojo._hasResource["dojo.cldr.monetary"]){dojo._hasResource["dojo.cldr.monetary"]=true;dojo.provide("dojo.cldr.monetary");dojo.cldr.monetary.getData=function(code){var _4bb={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 _4bc={CHF:5};var _4bd=_4bb[code],_4be=_4bc[code];if(typeof _4bd=="undefined"){_4bd=2;}if(typeof _4be=="undefined"){_4be=0;}return {places:_4bd,round:_4be};};}if(!dojo._hasResource["dojo.currency"]){dojo._hasResource["dojo.currency"]=true;dojo.provide("dojo.currency");dojo.currency._mixInDefaults=function(_4bf){_4bf=_4bf||{};_4bf.type="currency";var _4c0=dojo.i18n.getLocalization("dojo.cldr","currency",_4bf.locale)||{};var iso=_4bf.currency;var data=dojo.cldr.monetary.getData(iso);dojo.forEach(["displayName","symbol","group","decimal"],function(prop){data[prop]=_4c0[iso+"_"+prop];});data.fractional=[true,false];return dojo.mixin(data,_4bf);};dojo.currency.format=function(_4c1,_4c2){return dojo.number.format(_4c1,dojo.currency._mixInDefaults(_4c2));};dojo.currency.regexp=function(_4c3){return dojo.number.regexp(dojo.currency._mixInDefaults(_4c3));};dojo.currency.parse=function(_4c4,_4c5){return dojo.number.parse(_4c4,dojo.currency._mixInDefaults(_4c5));};}if(!dojo._hasResource["dijit.form.NumberTextBox"]){dojo._hasResource["dijit.form.NumberTextBox"]=true;dojo.provide("dijit.form.NumberTextBox");dojo.declare("dijit.form.NumberTextBoxMixin",null,{regExpGen:dojo.number.regexp,value:NaN,editOptions:{pattern:"#.######"},_formatter:dojo.number.format,_setConstraintsAttr:function(_4c6){var _4c7=typeof _4c6.places=="number"?_4c6.places:0;if(_4c7){_4c7++;}if(typeof _4c6.max!="number"){_4c6.max=9*Math.pow(10,15-_4c7);}if(typeof _4c6.min!="number"){_4c6.min=-9*Math.pow(10,15-_4c7);}this.inherited(arguments,[_4c6]);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 _4c8=this.format(val,this.constraints);if(_4c8!==undefined){this.textbox.value=_4c8;}}this.inherited(arguments);},format:function(_4c9,_4ca){var _4cb=String(_4c9);if(typeof _4c9!="number"){return _4cb;}if(isNaN(_4c9)){return "";}if(!("rangeCheck" in this&&this.rangeCheck(_4c9,_4ca))&&_4ca.exponent!==false&&/\de[-+]?\d/i.test(_4cb)){return _4cb;}if(this.editOptions&&this._focused){_4ca=dojo.mixin({},_4ca,this.editOptions);}return this._formatter(_4c9,_4ca);},parse:dojo.number.parse,_getDisplayedValueAttr:function(){var v=this.inherited(arguments);return isNaN(v)?this.textbox.value:v;},filter:function(_4cc){return (_4cc===null||_4cc===""||_4cc===undefined)?NaN:this.inherited(arguments);},serialize:function(_4cd,_4ce){return (typeof _4cd!="number"||isNaN(_4cd))?"":this.inherited(arguments);},_setValueAttr:function(_4cf,_4d0,_4d1){if(_4cf!==undefined&&_4d1===undefined){_4d1=String(_4cf);if(typeof _4cf=="number"){if(isNaN(_4cf)){_4d1="";}else{if(("rangeCheck" in this&&this.rangeCheck(_4cf,this.constraints))||this.constraints.exponent===false||!/\de[-+]?\d/i.test(_4d1)){_4d1=undefined;}}}else{if(!_4cf){_4d1="";_4cf=NaN;}else{_4cf=undefined;}}}this.inherited(arguments,[_4cf,_4d0,_4d1]);},_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("^"+dojo.number._realNumberRegexp(dojo.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(_4d2){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;}}}});dojo.declare("dijit.form.NumberTextBox",[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],{});}if(!dojo._hasResource["dijit.form.CurrencyTextBox"]){dojo._hasResource["dijit.form.CurrencyTextBox"]=true;dojo.provide("dijit.form.CurrencyTextBox");dojo.declare("dijit.form.CurrencyTextBox",dijit.form.NumberTextBox,{currency:"",baseClass:"dijitTextBox dijitCurrencyTextBox",regExpGen:function(_4d3){return "("+(this._focused?this.inherited(arguments,[dojo.mixin({},_4d3,this.editOptions)])+"|":"")+dojo.currency.regexp(_4d3)+")";},_formatter:dojo.currency.format,parse:function(_4d4,_4d5){var v=dojo.currency.parse(_4d4,_4d5);if(isNaN(v)&&/\d+/.test(_4d4)){return this.inherited(arguments,[_4d4,dojo.mixin({},_4d5,this.editOptions)]);}return v;},_setConstraintsAttr:function(_4d6){if(!_4d6.currency&&this.currency){_4d6.currency=this.currency;}this.inherited(arguments,[dojo.currency._mixInDefaults(dojo.mixin(_4d6,{exponent:false}))]);}});}if(!dojo._hasResource["dojo.cldr.supplemental"]){dojo._hasResource["dojo.cldr.supplemental"]=true;dojo.provide("dojo.cldr.supplemental");dojo.cldr.supplemental.getFirstDayOfWeek=function(_4d7){var _4d8={mv:5,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,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,ie:0,il:0,"in":0,is: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,sy:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,vi:0,zw:0};var _4d9=dojo.cldr.supplemental._region(_4d7);var dow=_4d8[_4d9];return (dow===undefined)?1:dow;};dojo.cldr.supplemental._region=function(_4da){_4da=dojo.i18n.normalizeLocale(_4da);var tags=_4da.split("-");var _4db=tags[1];if(!_4db){_4db={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(_4db.length==4){_4db=tags[2];}}return _4db;};dojo.cldr.supplemental.getWeekend=function(_4dc){var _4dd={"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 _4de={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 _4df=dojo.cldr.supplemental._region(_4dc);var _4e0=_4dd[_4df];var end=_4de[_4df];if(_4e0===undefined){_4e0=6;}if(end===undefined){end=0;}return {start:_4e0,end:end};};}if(!dojo._hasResource["dojo.date"]){dojo._hasResource["dojo.date"]=true;dojo.provide("dojo.date");dojo.date.getDaysInMonth=function(_4e1){var _4e2=_4e1.getMonth();var days=[31,28,31,30,31,30,31,31,30,31,30,31];if(_4e2==1&&dojo.date.isLeapYear(_4e1)){return 29;}return days[_4e2];};dojo.date.isLeapYear=function(_4e3){var year=_4e3.getFullYear();return !(year%400)||(!(year%4)&&!!(year%100));};dojo.date.getTimezoneName=function(_4e4){var str=_4e4.toString();var tz="";var _4e5;var pos=str.indexOf("(");if(pos>-1){tz=str.substring(++pos,str.indexOf(")"));}else{var pat=/([A-Z\/]+) \d{4}$/;if((_4e5=str.match(pat))){tz=_4e5[1];}else{str=_4e4.toLocaleString();pat=/ ([A-Z\/]+)$/;if((_4e5=str.match(pat))){tz=_4e5[1];}}}return (tz=="AM"||tz=="PM")?"":tz;};dojo.date.compare=function(_4e6,_4e7,_4e8){_4e6=new Date(+_4e6);_4e7=new Date(+(_4e7||new Date()));if(_4e8=="date"){_4e6.setHours(0,0,0,0);_4e7.setHours(0,0,0,0);}else{if(_4e8=="time"){_4e6.setFullYear(0,0,0);_4e7.setFullYear(0,0,0);}}if(_4e6>_4e7){return 1;}if(_4e6<_4e7){return -1;}return 0;};dojo.date.add=function(date,_4e9,_4ea){var sum=new Date(+date);var _4eb=false;var _4ec="Date";switch(_4e9){case "day":break;case "weekday":var days,_4ed;var mod=_4ea%5;if(!mod){days=(_4ea>0)?5:-5;_4ed=(_4ea>0)?((_4ea-5)/5):((_4ea+5)/5);}else{days=mod;_4ed=parseInt(_4ea/5);}var strt=date.getDay();var adj=0;if(strt==6&&_4ea>0){adj=1;}else{if(strt==0&&_4ea<0){adj=-1;}}var trgt=strt+days;if(trgt==0||trgt==6){adj=(_4ea>0)?2:-2;}_4ea=(7*_4ed)+days+adj;break;case "year":_4ec="FullYear";_4eb=true;break;case "week":_4ea*=7;break;case "quarter":_4ea*=3;case "month":_4eb=true;_4ec="Month";break;default:_4ec="UTC"+_4e9.charAt(0).toUpperCase()+_4e9.substring(1)+"s";}if(_4ec){sum["set"+_4ec](sum["get"+_4ec]()+_4ea);}if(_4eb&&(sum.getDate()<date.getDate())){sum.setDate(0);}return sum;};dojo.date.difference=function(_4ee,_4ef,_4f0){_4ef=_4ef||new Date();_4f0=_4f0||"day";var _4f1=_4ef.getFullYear()-_4ee.getFullYear();var _4f2=1;switch(_4f0){case "quarter":var m1=_4ee.getMonth();var m2=_4ef.getMonth();var q1=Math.floor(m1/3)+1;var q2=Math.floor(m2/3)+1;q2+=(_4f1*4);_4f2=q2-q1;break;case "weekday":var days=Math.round(dojo.date.difference(_4ee,_4ef,"day"));var _4f3=parseInt(dojo.date.difference(_4ee,_4ef,"week"));var mod=days%7;if(mod==0){days=_4f3*5;}else{var adj=0;var aDay=_4ee.getDay();var bDay=_4ef.getDay();_4f3=parseInt(days/7);mod=days%7;var _4f4=new Date(_4ee);_4f4.setDate(_4f4.getDate()+(_4f3*7));var _4f5=_4f4.getDay();if(days>0){switch(true){case aDay==6:adj=-1;break;case aDay==0:adj=0;break;case bDay==6:adj=-1;break;case bDay==0:adj=-2;break;case (_4f5+mod)>5:adj=-2;}}else{if(days<0){switch(true){case aDay==6:adj=0;break;case aDay==0:adj=1;break;case bDay==6:adj=2;break;case bDay==0:adj=1;break;case (_4f5+mod)<0:adj=2;}}}days+=adj;days-=(_4f3*2);}_4f2=days;break;case "year":_4f2=_4f1;break;case "month":_4f2=(_4ef.getMonth()-_4ee.getMonth())+(_4f1*12);break;case "week":_4f2=parseInt(dojo.date.difference(_4ee,_4ef,"day")/7);break;case "day":_4f2/=24;case "hour":_4f2/=60;case "minute":_4f2/=60;case "second":_4f2/=1000;case "millisecond":_4f2*=_4ef.getTime()-_4ee.getTime();}return Math.round(_4f2);};}if(!dojo._hasResource["dojo.date.locale"]){dojo._hasResource["dojo.date.locale"]=true;dojo.provide("dojo.date.locale");(function(){function _4f6(_4f7,_4f8,_4f9,_4fa){return _4fa.replace(/([a-z])\1*/ig,function(_4fb){var s,pad,c=_4fb.charAt(0),l=_4fb.length,_4fc=["abbr","wide","narrow"];switch(c){case "G":s=_4f8[(l<4)?"eraAbbr":"eraNames"][_4f7.getFullYear()<0?0:1];break;case "y":s=_4f7.getFullYear();switch(l){case 1:break;case 2:if(!_4f9.fullYear){s=String(s);s=s.substr(s.length-2);break;}default:pad=true;}break;case "Q":case "q":s=Math.ceil((_4f7.getMonth()+1)/3);pad=true;break;case "M":var m=_4f7.getMonth();if(l<3){s=m+1;pad=true;}else{var _4fd=["months","format",_4fc[l-3]].join("-");s=_4f8[_4fd][m];}break;case "w":var _4fe=0;s=dojo.date.locale._getWeekOfYear(_4f7,_4fe);pad=true;break;case "d":s=_4f7.getDate();pad=true;break;case "D":s=dojo.date.locale._getDayOfYear(_4f7);pad=true;break;case "E":var d=_4f7.getDay();if(l<3){s=d+1;pad=true;}else{var _4ff=["days","format",_4fc[l-3]].join("-");s=_4f8[_4ff][d];}break;case "a":var _500=(_4f7.getHours()<12)?"am":"pm";s=_4f8["dayPeriods-format-wide-"+_500];break;case "h":case "H":case "K":case "k":var h=_4f7.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;}pad=true;break;case "m":s=_4f7.getMinutes();pad=true;break;case "s":s=_4f7.getSeconds();pad=true;break;case "S":s=Math.round(_4f7.getMilliseconds()*Math.pow(10,l-3));pad=true;break;case "v":case "z":s=dojo.date.locale._getZone(_4f7,true,_4f9);if(s){break;}l=4;case "Z":var _501=dojo.date.locale._getZone(_4f7,false,_4f9);var tz=[(_501<=0?"+":"-"),dojo.string.pad(Math.floor(Math.abs(_501)/60),2),dojo.string.pad(Math.abs(_501)%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: "+_4fa);}if(pad){s=dojo.string.pad(s,l);}return s;});};dojo.date.locale._getZone=function(_502,_503,_504){if(_503){return dojo.date.getTimezoneName(_502);}else{return _502.getTimezoneOffset();}};dojo.date.locale.format=function(_505,_506){_506=_506||{};var _507=dojo.i18n.normalizeLocale(_506.locale),_508=_506.formatLength||"short",_509=dojo.date.locale._getGregorianBundle(_507),str=[],_50a=dojo.hitch(this,_4f6,_505,_509,_506);if(_506.selector=="year"){return _50b(_509["dateFormatItem-yyyy"]||"yyyy",_50a);}var _50c;if(_506.selector!="date"){_50c=_506.timePattern||_509["timeFormat-"+_508];if(_50c){str.push(_50b(_50c,_50a));}}if(_506.selector!="time"){_50c=_506.datePattern||_509["dateFormat-"+_508];if(_50c){str.push(_50b(_50c,_50a));}}return str.length==1?str[0]:_509["dateTimeFormat-"+_508].replace(/\{(\d+)\}/g,function(_50d,key){return str[key];});};dojo.date.locale.regexp=function(_50e){return dojo.date.locale._parseInfo(_50e).regexp;};dojo.date.locale._parseInfo=function(_50f){_50f=_50f||{};var _510=dojo.i18n.normalizeLocale(_50f.locale),_511=dojo.date.locale._getGregorianBundle(_510),_512=_50f.formatLength||"short",_513=_50f.datePattern||_511["dateFormat-"+_512],_514=_50f.timePattern||_511["timeFormat-"+_512],_515;if(_50f.selector=="date"){_515=_513;}else{if(_50f.selector=="time"){_515=_514;}else{_515=_511["dateTimeFormat-"+_512].replace(/\{(\d+)\}/g,function(_516,key){return [_514,_513][key];});}}var _517=[],re=_50b(_515,dojo.hitch(this,_518,_517,_511,_50f));return {regexp:re,tokens:_517,bundle:_511};};dojo.date.locale.parse=function(_519,_51a){var info=dojo.date.locale._parseInfo(_51a),_51b=info.tokens,_51c=info.bundle,re=new RegExp("^"+info.regexp+"$",info.strict?"":"i"),_51d=re.exec(_519);if(!_51d){return null;}var _51e=["abbr","wide","narrow"],_51f=[1970,0,1,0,0,0,0],amPm="",_520=dojo.every(_51d,function(v,i){if(!i){return true;}var _521=_51b[i-1];var l=_521.length;switch(_521.charAt(0)){case "y":if(l!=2&&_51a.strict){_51f[0]=v;}else{if(v<100){v=Number(v);var year=""+new Date().getFullYear(),_522=year.substring(0,2)*100,_523=Math.min(Number(year.substring(2,4))+20,99),num=(v<_523)?_522+v:_522-100+v;_51f[0]=num;}else{if(_51a.strict){return false;}_51f[0]=v;}}break;case "M":if(l>2){var _524=_51c["months-format-"+_51e[l-3]].concat();if(!_51a.strict){v=v.replace(".","").toLowerCase();_524=dojo.map(_524,function(s){return s.replace(".","").toLowerCase();});}v=dojo.indexOf(_524,v);if(v==-1){return false;}}else{v--;}_51f[1]=v;break;case "E":case "e":var days=_51c["days-format-"+_51e[l-3]].concat();if(!_51a.strict){v=v.toLowerCase();days=dojo.map(days,function(d){return d.toLowerCase();});}v=dojo.indexOf(days,v);if(v==-1){return false;}break;case "D":_51f[1]=0;case "d":_51f[2]=v;break;case "a":var am=_51a.am||_51c["dayPeriods-format-wide-am"],pm=_51a.pm||_51c["dayPeriods-format-wide-pm"];if(!_51a.strict){var _525=/\./g;v=v.replace(_525,"").toLowerCase();am=am.replace(_525,"").toLowerCase();pm=pm.replace(_525,"").toLowerCase();}if(_51a.strict&&v!=am&&v!=pm){return false;}amPm=(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;}_51f[3]=v;break;case "m":_51f[4]=v;break;case "s":_51f[5]=v;break;case "S":_51f[6]=v;}return true;});var _526=+_51f[3];if(amPm==="p"&&_526<12){_51f[3]=_526+12;}else{if(amPm==="a"&&_526==12){_51f[3]=0;}}var _527=new Date(_51f[0],_51f[1],_51f[2],_51f[3],_51f[4],_51f[5],_51f[6]);if(_51a.strict){_527.setFullYear(_51f[0]);}var _528=_51b.join(""),_529=_528.indexOf("d")!=-1,_52a=_528.indexOf("M")!=-1;if(!_520||(_52a&&_527.getMonth()>_51f[1])||(_529&&_527.getDate()>_51f[2])){return null;}if((_52a&&_527.getMonth()<_51f[1])||(_529&&_527.getDate()<_51f[2])){_527=dojo.date.add(_527,"hour",1);}return _527;};function _50b(_52b,_52c,_52d,_52e){var _52f=function(x){return x;};_52c=_52c||_52f;_52d=_52d||_52f;_52e=_52e||_52f;var _530=_52b.match(/(''|[^'])+/g),_531=_52b.charAt(0)=="'";dojo.forEach(_530,function(_532,i){if(!_532){_530[i]="";}else{_530[i]=(_531?_52d:_52c)(_532.replace(/''/g,"'"));_531=!_531;}});return _52e(_530.join(""));};function _518(_533,_534,_535,_536){_536=dojo.regexp.escapeString(_536);if(!_535.strict){_536=_536.replace(" a"," ?a");}return _536.replace(/([a-z])\1*/ig,function(_537){var s,c=_537.charAt(0),l=_537.length,p2="",p3="";if(_535.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+?":p2+"[1-9]|1[0-2]";break;case "D":s=p2+"[1-9]|"+p3+"[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]";break;case "d":s="3[01]|[12]\\d|"+p2+"[1-9]";break;case "w":s=p2+"[1-9]|[1-4][0-9]|5[0-3]";break;case "E":s="\\S+";break;case "h":s=p2+"[1-9]|1[0-2]";break;case "k":s=p2+"\\d|1[01]";break;case "H":s=p2+"\\d|1\\d|2[0-3]";break;case "K":s=p2+"[1-9]|1\\d|2[0-4]";break;case "m":case "s":s="[0-5]\\d";break;case "S":s="\\d{"+l+"}";break;case "a":var am=_535.am||_534["dayPeriods-format-wide-am"],pm=_535.pm||_534["dayPeriods-format-wide-pm"];if(_535.strict){s=am+"|"+pm;}else{s=am+"|"+pm;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(_533){_533.push(_537);}return "("+s+")";}).replace(/[\xa0 ]/g,"[\\s\\xa0]");};})();(function(){var _538=[];dojo.date.locale.addCustomFormats=function(_539,_53a){_538.push({pkg:_539,name:_53a});};dojo.date.locale._getGregorianBundle=function(_53b){var _53c={};dojo.forEach(_538,function(desc){var _53d=dojo.i18n.getLocalization(desc.pkg,desc.name,_53b);_53c=dojo.mixin(_53c,_53d);},this);return _53c;};})();dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");dojo.date.locale.getNames=function(item,type,_53e,_53f){var _540,_541=dojo.date.locale._getGregorianBundle(_53f),_542=[item,_53e,type];if(_53e=="standAlone"){var key=_542.join("-");_540=_541[key];if(_540[0]==1){_540=undefined;}}_542[1]="format";return (_540||_541[_542.join("-")]).concat();};dojo.date.locale.isWeekend=function(_543,_544){var _545=dojo.cldr.supplemental.getWeekend(_544),day=(_543||new Date()).getDay();if(_545.end<_545.start){_545.end+=7;if(day<_545.start){day+=7;}}return day>=_545.start&&day<=_545.end;};dojo.date.locale._getDayOfYear=function(_546){return dojo.date.difference(new Date(_546.getFullYear(),0,1,_546.getHours()),_546)+1;};dojo.date.locale._getWeekOfYear=function(_547,_548){if(arguments.length==1){_548=0;}var _549=new Date(_547.getFullYear(),0,1).getDay(),adj=(_549-_548+7)%7,week=Math.floor((dojo.date.locale._getDayOfYear(_547)+adj-1)/7);if(_549==_548){week++;}return week;};}if(!dojo._hasResource["dijit.Calendar"]){dojo._hasResource["dijit.Calendar"]=true;dojo.provide("dijit.Calendar");dojo.declare("dijit.Calendar",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{templateString:dojo.cache("dijit","templates/Calendar.html","<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" dojoAttachEvent=\"onkeypress: _onKeyPress\">\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\" waiRole=\"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 class=\"dijitVisible\">\n\t\t\t\t\t<div class=\"dijitPopup dijitMenu dijitMenuPassive dijitHidden\" dojoAttachPoint=\"monthDropDown\" dojoAttachEvent=\"onmouseup: _onMonthSelect, onmouseover: _onMenuHover, onmouseout: _onMenuHover\">\n\t\t\t\t\t\t<div class=\"dijitCalendarMonthLabelTemplate dijitCalendarMonthLabel\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel dijitInline dijitVisible\" dojoAttachEvent=\"onmousedown: _onMonthToggle\"></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\" waiRole=\"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\"></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"),value:new Date(),datePackage:"dojo.date",dayWidth:"narrow",tabIndex:"0",baseClass:"dijitCalendar",cssStateNodes:{"decrementMonth":"dijitCalendarArrow","incrementMonth":"dijitCalendarArrow","previousYearLabelNode":"dijitCalendarPreviousYear","nextYearLabelNode":"dijitCalendarNextYear"},attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{tabIndex:"domNode"}),setValue:function(_54a){dojo.deprecated("dijit.Calendar:setValue() is deprecated. Use set('value', ...) instead.","","2.0");this.set("value",_54a);},_getValueAttr:function(){var _54b=new this.dateClassObj(this.value);_54b.setHours(0,0,0,0);if(_54b.getDate()<this.value.getDate()){_54b=this.dateFuncObj.add(_54b,"hour",1);}return _54b;},_setValueAttr:function(_54c){if(!this.value||this.dateFuncObj.compare(_54c,this.value)){_54c=new this.dateClassObj(_54c);_54c.setHours(1);this.displayMonth=new this.dateClassObj(_54c);if(!this.isDisabledDate(_54c,this.lang)){this.value=_54c;this.onChange(this.get("value"));}dojo.attr(this.domNode,"aria-label",this.dateLocaleModule.format(_54c,{selector:"date",formatLength:"full"}));this._populateGrid();}},_setText:function(node,text){while(node.firstChild){node.removeChild(node.firstChild);}node.appendChild(dojo.doc.createTextNode(text));},_populateGrid:function(){var _54d=this.displayMonth;_54d.setDate(1);var _54e=_54d.getDay(),_54f=this.dateFuncObj.getDaysInMonth(_54d),_550=this.dateFuncObj.getDaysInMonth(this.dateFuncObj.add(_54d,"month",-1)),_551=new this.dateClassObj(),_552=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);if(_552>_54e){_552-=7;}dojo.query(".dijitCalendarDateTemplate",this.domNode).forEach(function(_553,i){i+=_552;var date=new this.dateClassObj(_54d),_554,_555="dijitCalendar",adj=0;if(i<_54e){_554=_550-_54e+i+1;adj=-1;_555+="Previous";}else{if(i>=(_54e+_54f)){_554=i-_54e-_54f+1;adj=1;_555+="Next";}else{_554=i-_54e+1;_555+="Current";}}if(adj){date=this.dateFuncObj.add(date,"month",adj);}date.setDate(_554);if(!this.dateFuncObj.compare(date,_551,"date")){_555="dijitCalendarCurrentDate "+_555;}if(this._isSelectedDate(date,this.lang)){_555="dijitCalendarSelectedDate "+_555;}if(this.isDisabledDate(date,this.lang)){_555="dijitCalendarDisabledDate "+_555;}var _556=this.getClassForDate(date,this.lang);if(_556){_555=_556+" "+_555;}_553.className=_555+"Month dijitCalendarDateTemplate";_553.dijitDateValue=date.valueOf();var _557=dojo.query(".dijitCalendarDateLabel",_553)[0],text=date.getDateLocalized?date.getDateLocalized(this.lang):date.getDate();this._setText(_557,text);},this);var _558=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang,_54d);this._setText(this.monthLabelNode,_558[_54d.getMonth()]);dojo.query(".dijitCalendarMonthLabelTemplate",this.domNode).forEach(function(node,i){dojo.toggleClass(node,"dijitHidden",!(i in _558));this._setText(node,_558[i]);},this);var y=_54d.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);var _559=this;var _55a=function(_55b,_55c,adj){_559._connects.push(dijit.typematic.addMouseListener(_559[_55b],_559,function(_55d){if(_55d>=0){_559._adjustDisplay(_55c,adj);}},0.8,500));};_55a("incrementMonth","month",1);_55a("decrementMonth","month",-1);_55a("nextYearLabelNode","year",1);_55a("previousYearLabelNode","year",-1);},goToToday:function(){this.set("value",new this.dateClassObj());},constructor:function(args){var _55e=(args.datePackage&&(args.datePackage!="dojo.date"))?args.datePackage+".Date":"Date";this.dateClassObj=dojo.getObject(_55e,false);this.datePackage=args.datePackage||this.datePackage;this.dateFuncObj=dojo.getObject(this.datePackage,false);this.dateLocaleModule=dojo.getObject(this.datePackage+".locale",false);},postMixInProperties:function(){if(isNaN(this.value)){delete this.value;}this.inherited(arguments);},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);var _55f=dojo.hitch(this,function(_560,n){var _561=dojo.query(_560,this.domNode)[0];for(var i=0;i<n;i++){_561.parentNode.appendChild(_561.cloneNode(true));}});_55f(".dijitCalendarDayLabelTemplate",6);_55f(".dijitCalendarDateTemplate",6);_55f(".dijitCalendarWeekTemplate",5);var _562=this.dateLocaleModule.getNames("days",this.dayWidth,"standAlone",this.lang);var _563=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_564,i){this._setText(_564,_562[(i+_563)%7]);},this);var _565=new this.dateClassObj(this.value);var _566=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang,_565);_55f(".dijitCalendarMonthLabelTemplate",_566.length-1);dojo.query(".dijitCalendarMonthLabelTemplate",this.domNode).forEach(function(node,i){dojo.attr(node,"month",i);if(i in _566){this._setText(node,_566[i]);}dojo.place(node.cloneNode(true),this.monthLabelSpacer);},this);this.value=null;this.set("value",_565);},_onMenuHover:function(e){dojo.stopEvent(e);dojo.toggleClass(e.target,"dijitMenuItemHover");},_adjustDisplay:function(part,_567){this.displayMonth=this.dateFuncObj.add(this.displayMonth,part,_567);this._populateGrid();},_onMonthToggle:function(evt){dojo.stopEvent(evt);if(evt.type=="mousedown"){var _568=dojo.position(this.monthLabelNode);var dim={width:_568.w+"px",top:-this.displayMonth.getMonth()*_568.h+"px"};if((dojo.isIE&&dojo.isQuirks)||dojo.isIE<7){dim.left=-_568.w/2+"px";}dojo.style(this.monthDropDown,dim);this._popupHandler=this.connect(document,"onmouseup","_onMonthToggle");}else{this.disconnect(this._popupHandler);delete this._popupHandler;}dojo.toggleClass(this.monthDropDown,"dijitHidden");dojo.toggleClass(this.monthLabelNode,"dijitVisible");},_onMonthSelect:function(evt){this._onMonthToggle(evt);this.displayMonth.setMonth(dojo.attr(evt.target,"month"));this._populateGrid();},_onDayClick:function(evt){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);this.onValueSelected(this.get("value"));}},_onDayMouseOver:function(evt){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(evt){if(!this._currentNode){return;}if(evt.relatedTarget&&evt.relatedTarget.parentNode==this._currentNode){return;}dojo.removeClass(this._currentNode,"dijitCalendarHoveredDate");if(dojo.hasClass(this._currentNode,"dijitCalendarActiveDate")){dojo.removeClass(this._currentNode,"dijitCalendarActiveDate");}this._currentNode=null;},_onDayMouseDown:function(evt){var node=evt.target.parentNode;if(node&&node.dijitDateValue){dojo.addClass(node,"dijitCalendarActiveDate");this._currentNode=node;}},_onDayMouseUp:function(evt){var node=evt.target.parentNode;if(node&&node.dijitDateValue){dojo.removeClass(node,"dijitCalendarActiveDate");}},_onKeyPress:function(evt){var dk=dojo.keys,_569=-1,_56a,_56b=this.value;switch(evt.keyCode){case dk.RIGHT_ARROW:_569=1;case dk.LEFT_ARROW:_56a="day";if(!this.isLeftToRight()){_569*=-1;}break;case dk.DOWN_ARROW:_569=1;case dk.UP_ARROW:_56a="week";break;case dk.PAGE_DOWN:_569=1;case dk.PAGE_UP:_56a=evt.ctrlKey?"year":"month";break;case dk.END:_56b=this.dateFuncObj.add(_56b,"month",1);_56a="day";case dk.HOME:_56b=new Date(_56b).setDate(1);break;case dk.ENTER:this.onValueSelected(this.get("value"));break;case dk.ESCAPE:default:return;}dojo.stopEvent(evt);if(_56a){_56b=this.dateFuncObj.add(_56b,_56a,_569);}this.set("value",_56b);},onValueSelected:function(date){},onChange:function(date){},_isSelectedDate:function(_56c,_56d){return !this.dateFuncObj.compare(_56c,this.value,"date");},isDisabledDate:function(_56e,_56f){},getClassForDate:function(_570,_571){}});}if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){dojo._hasResource["dijit.form._DateTimeTextBox"]=true;dojo.provide("dijit.form._DateTimeTextBox");new Date("X");dojo.declare("dijit.form._DateTimeTextBox",dijit.form.RangeBoundTextBox,{regExpGen:dojo.date.locale.regexp,datePackage:"dojo.date",compare:dojo.date.compare,format:function(_572,_573){if(!_572){return "";}return this.dateLocaleModule.format(_572,_573);},parse:function(_574,_575){return this.dateLocaleModule.parse(_574,_575)||(this._isEmpty(_574)?null:undefined);},serialize:function(val,_576){if(val.toGregorian){val=val.toGregorian();}return dojo.date.stamp.toISOString(val,_576);},value:new Date(""),_blankValue:null,popupClass:"",_selector:"",constructor:function(args){var _577=args.datePackage?args.datePackage+".Date":"Date";this.dateClassObj=dojo.getObject(_577,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;},_setConstraintsAttr:function(_578){_578.selector=this._selector;_578.fullYear=true;var _579=dojo.date.stamp.fromISOString;if(typeof _578.min=="string"){_578.min=_579(_578.min);}if(typeof _578.max=="string"){_578.max=_579(_578.max);}this.inherited(arguments,[_578]);},_onFocus:function(evt){this._open();this.inherited(arguments);},_setValueAttr:function(_57a,_57b,_57c){if(_57a!==undefined){if(!_57a||_57a.toString()==dijit.form._DateTimeTextBox.prototype.value.toString()){_57a=null;}if(_57a instanceof Date&&!(this.dateClassObj instanceof Date)){_57a=new this.dateClassObj(_57a);}}this.inherited(arguments,[_57a,_57b,_57c]);if(this._picker){if(!_57a){_57a=new this.dateClassObj();}this._picker.set("value",_57a);}},_open:function(){if(this.disabled||this.readOnly||!this.popupClass){return;}var _57d=this;if(!this._picker){var _57e=dojo.getObject(this.popupClass,false);this._picker=new _57e({onValueSelected:function(_57f){if(_57d._tabbingAway){delete _57d._tabbingAway;}else{_57d.focus();}setTimeout(dojo.hitch(_57d,"_close"),1);dijit.form._DateTimeTextBox.superclass._setValueAttr.call(_57d,_57f,true);},id:this.id+"_popup",dir:_57d.dir,lang:_57d.lang,value:this.get("value")||new this.dateClassObj(),constraints:_57d.constraints,datePackage:_57d.datePackage,isDisabledDate:function(date){var _580=dojo.date.compare;var _581=_57d.constraints;return _581&&((_581.min&&_580(_581.min,date,_57d._selector)>0)||(_581.max&&_580(_581.max,date,_57d._selector)<0));}});}if(!this._opened){dijit.popup.open({parent:this,popup:this._picker,orient:{"BL":"TL","TL":"BL"},around:this.domNode,onCancel:dojo.hitch(this,this._close),onClose:function(){_57d._opened=false;}});this._opened=true;}dojo.marginBox(this._picker.domNode,{w:this.domNode.offsetWidth});},_close:function(){if(this._opened){dijit.popup.close(this._picker);this._opened=false;}},_onBlur:function(){this._close();if(this._picker){this._picker.destroy();delete this._picker;}this.inherited(arguments);},_getDisplayedValueAttr:function(){return this.textbox.value;},_setDisplayedValueAttr:function(_582,_583){this._setValueAttr(this.parse(_582,this.constraints),_583,_582);},destroy:function(){if(this._picker){this._picker.destroy();delete this._picker;}this.inherited(arguments);},postCreate:function(){this.inherited(arguments);this.connect(this.focusNode,"onkeypress",this._onKeyPress);this.connect(this.focusNode,"onclick",this._open);},_onKeyPress:function(e){var p=this._picker,dk=dojo.keys;if(p&&this._opened&&p.handleKey){if(p.handleKey(e)===false){return;}}if(this._opened&&e.charOrCode==dk.ESCAPE&&!(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey)){this._close();dojo.stopEvent(e);}else{if(!this._opened&&e.charOrCode==dk.DOWN_ARROW){this._open();dojo.stopEvent(e);}else{if(e.charOrCode===dk.TAB){this._tabbingAway=true;}else{if(this._opened&&(e.keyChar||e.charOrCode===dk.BACKSPACE||e.charOrCode==dk.DELETE)){setTimeout(dojo.hitch(this,function(){if(this._picker&&this._opened){dijit.placeOnScreenAroundElement(p.domNode.parentNode,this.domNode,{"BL":"TL","TL":"BL"},p.orient?dojo.hitch(p,"orient"):null);}}),1);}}}}}});}if(!dojo._hasResource["dijit.form.DateTextBox"]){dojo._hasResource["dijit.form.DateTextBox"]=true;dojo.provide("dijit.form.DateTextBox");dojo.declare("dijit.form.DateTextBox",dijit.form._DateTimeTextBox,{baseClass:"dijitTextBox dijitDateTextBox",popupClass:"dijit.Calendar",_selector:"date",value:new Date("")});}if(!dojo._hasResource["dijit.form._Spinner"]){dojo._hasResource["dijit.form._Spinner"]=true;dojo.provide("dijit.form._Spinner");dojo.declare("dijit.form._Spinner",dijit.form.RangeBoundTextBox,{defaultTimeout:500,minimumTimeout:10,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:dojo.cache("dijit.form","templates/Spinner.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\" waiRole=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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 waiRole=\"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 waiRole=\"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=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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\twaiRole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"),baseClass:"dijitTextBox dijitSpinner",cssStateNodes:{"upArrowNode":"dijitUpArrowButton","downArrowNode":"dijitDownArrowButton"},adjust:function(val,_584){return val;},_arrowPressed:function(_585,_586,_587){if(this.disabled||this.readOnly){return;}this._setValueAttr(this.adjust(this.get("value"),_586*_587),false);dijit.selectInputText(this.textbox,this.textbox.value.length);},_arrowReleased:function(node){this._wheelTimer=null;if(this.disabled||this.readOnly){return;}},_typematicCallback:function(_588,node,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(_588==-1){this._arrowReleased(node);}else{this._arrowPressed(node,(node==this.upArrowNode)?1:-1,inc);}},_wheelTimer:null,_mouseWheeled:function(evt){dojo.stopEvent(evt);var _589=evt.detail?(evt.detail*-1):(evt.wheelDelta/120);if(_589!==0){var node=this[(_589>0?"upArrowNode":"downArrowNode")];this._arrowPressed(node,_589,this.smallDelta);if(!this._wheelTimer){clearTimeout(this._wheelTimer);}this._wheelTimer=setTimeout(dojo.hitch(this,"_arrowReleased",node),50);}},postCreate:function(){this.inherited(arguments);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));}});}if(!dojo._hasResource["dijit.form.NumberSpinner"]){dojo._hasResource["dijit.form.NumberSpinner"]=true;dojo.provide("dijit.form.NumberSpinner");dojo.declare("dijit.form.NumberSpinner",[dijit.form._Spinner,dijit.form.NumberTextBoxMixin],{adjust:function(val,_58a){var tc=this.constraints,v=isNaN(val),_58b=!isNaN(tc.max),_58c=!isNaN(tc.min);if(v&&_58a!=0){val=(_58a>0)?_58c?tc.min:_58b?tc.max:0:_58b?this.constraints.max:_58c?tc.min:0;}var _58d=val+_58a;if(v||isNaN(_58d)){return val;}if(_58b&&(_58d>tc.max)){_58d=tc.max;}if(_58c&&(_58d<tc.min)){_58d=tc.min;}return _58d;},_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"){var _58e=this.constraints[(e.charOrCode==dojo.keys.HOME?"min":"max")];if(typeof _58e=="number"){this._setValueAttr(_58e,false);}dojo.stopEvent(e);}}});}if(!dojo._hasResource["dijit.form.MultiSelect"]){dojo._hasResource["dijit.form.MultiSelect"]=true;dojo.provide("dijit.form.MultiSelect");dojo.declare("dijit.form.MultiSelect",dijit.form._FormValueWidget,{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(){this._hasBeenBlurred=false;this._setValueAttr(this._resetValue,true);},addSelected:function(_58f){_58f.getSelected().forEach(function(n){this.containerNode.appendChild(n);this.domNode.scrollTop=this.domNode.offsetHeight;var _590=_58f.domNode.scrollTop;_58f.domNode.scrollTop=0;_58f.domNode.scrollTop=_590;},this);},getSelected:function(){return dojo.query("option",this.containerNode).filter(function(n){return n.selected;});},_getValueAttr:function(){return this.getSelected().map(function(n){return n.value;});},multiple:true,_setValueAttr:function(_591){dojo.query("option",this.containerNode).forEach(function(n){n.selected=(dojo.indexOf(_591,n.value)!=-1);});},invertSelection:function(_592){dojo.query("option",this.containerNode).forEach(function(n){n.selected=!n.selected;});this._handleOnChange(this.get("value"),_592==true);},_onChange:function(e){this._handleOnChange(this.get("value"),true);},resize:function(size){if(size){dojo.marginBox(this.domNode,size);}},postCreate:function(){this._onChange();}});}if(!dojo._hasResource["dijit.form.HorizontalSlider"]){dojo._hasResource["dijit.form.HorizontalSlider"]=true;dojo.provide("dijit.form.HorizontalSlider");dojo.declare("dijit.form.HorizontalSlider",[dijit.form._FormValueWidget,dijit._Container],{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\" tabIndex=\"-1\" 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\" waiRole=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"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\" waiRole=\"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 waiRole=\"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\" tabIndex=\"-1\" 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"),value:0,showButtons:true,minimum:0,maximum:100,discreteValues:Infinity,pageIncrement:2,clickSelect:true,slideDuration:dijit.defaultDuration,widgetsInTemplate:true,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{id:""}),baseClass:"dijitSlider",cssStateNodes:{incrementButton:"dijitSliderIncrementButton",decrementButton:"dijitSliderDecrementButton",focusNode:"dijitSliderThumb"},_mousePixelCoord:"pageX",_pixelCount:"w",_startingPixelCoord:"x",_startingPixelCount:"l",_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 dojo.keys.HOME:this._setValueAttr(this.minimum,false);break;case dojo.keys.END:this._setValueAttr(this.maximum,false);break;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){dijit.focus(this.sliderHandle);}dojo.stopEvent(e);},_isReversed:function(){return !this.isLeftToRight();},_onBarClick:function(e){if(this.disabled||this.readOnly||!this.clickSelect){return;}dijit.focus(this.sliderHandle);dojo.stopEvent(e);var _593=dojo.position(this.sliderBarContainer,true);var _594=e[this._mousePixelCoord]-_593[this._startingPixelCoord];this._setPixelValue(this._isReversed()?(_593[this._pixelCount]-_594):_594,_593[this._pixelCount],true);this._movable.onMouseDown(e);},_setPixelValue:function(_595,_596,_597){if(this.disabled||this.readOnly){return;}_595=_595<0?0:_596<_595?_596:_595;var _598=this.discreteValues;if(_598<=1||_598==Infinity){_598=_596;}_598--;var _599=_596/_598;var _59a=Math.round(_595/_599);this._setValueAttr((this.maximum-this.minimum)*_59a/_598+this.minimum,_597);},_setValueAttr:function(_59b,_59c){this.valueNode.value=this.value=_59b;dijit.setWaiState(this.focusNode,"valuenow",_59b);this.inherited(arguments);var _59d=(_59b-this.minimum)/(this.maximum-this.minimum);var _59e=(this._descending===false)?this.remainingBar:this.progressBar;var _59f=(this._descending===false)?this.progressBar:this.remainingBar;if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}if(_59c&&this.slideDuration>0&&_59e.style[this._progressPixelSize]){var _5a0=this;var _5a1={};var _5a2=parseFloat(_59e.style[this._progressPixelSize]);var _5a3=this.slideDuration*(_59d-_5a2/100);if(_5a3==0){return;}if(_5a3<0){_5a3=0-_5a3;}_5a1[this._progressPixelSize]={start:_5a2,end:_59d*100,units:"%"};this._inProgressAnim=dojo.animateProperty({node:_59e,duration:_5a3,onAnimate:function(v){_59f.style[_5a0._progressPixelSize]=(100-parseFloat(v[_5a0._progressPixelSize]))+"%";},onEnd:function(){delete _5a0._inProgressAnim;},properties:_5a1});this._inProgressAnim.play();}else{_59e.style[this._progressPixelSize]=(_59d*100)+"%";_59f.style[this._progressPixelSize]=((1-_59d)*100)+"%";}},_bumpValue:function(_5a4,_5a5){if(this.disabled||this.readOnly){return;}var s=dojo.getComputedStyle(this.sliderBarContainer);var c=dojo._getContentBox(this.sliderBarContainer,s);var _5a6=this.discreteValues;if(_5a6<=1||_5a6==Infinity){_5a6=c[this._pixelCount];}_5a6--;var _5a7=(this.value-this.minimum)*_5a6/(this.maximum-this.minimum)+_5a4;if(_5a7<0){_5a7=0;}if(_5a7>_5a6){_5a7=_5a6;}_5a7=_5a7*(this.maximum-this.minimum)/_5a6+this.minimum;this._setValueAttr(_5a7,_5a5);},_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==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);},increment:function(e){this._bumpValue(e.charOrCode==dojo.keys.PAGE_UP?this.pageIncrement:1);},_mouseWheeled:function(evt){dojo.stopEvent(evt);var _5a8=!dojo.isMozilla;var _5a9=evt[(_5a8?"wheelDelta":"detail")]*(_5a8?1:-1);this._bumpValue(_5a9<0?-1:1,true);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_5aa){if(this[_5aa.container]!=this.containerNode){this[_5aa.container].appendChild(_5aa.domNode);}},this);this.inherited(arguments);},_typematicCallback:function(_5ab,_5ac,e){if(_5ab==-1){this._setValueAttr(this.value,true);}else{this[(_5ac==(this._descending?this.incrementButton:this.decrementButton))?"decrement":"increment"](e);}},postCreate:function(){if(this.showButtons){this.incrementButton.style.display="";this.decrementButton.style.display="";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");var _5ad=dojo.declare(dijit.form._SliderMover,{widget:this});this._movable=new dojo.dnd.Moveable(this.sliderHandle,{mover:_5ad});var _5ae=dojo.query("label[for=\""+this.id+"\"]");if(_5ae.length){_5ae[0].id=(this.id+"_label");dijit.setWaiState(this.focusNode,"labelledby",_5ae[0].id);}dijit.setWaiState(this.focusNode,"valuemin",this.minimum);dijit.setWaiState(this.focusNode,"valuemax",this.maximum);this.inherited(arguments);this._layoutHackIE7();},destroy:function(){this._movable.destroy();if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}this._supportingWidgets=dijit.findWidgets(this.domNode);this.inherited(arguments);}});dojo.declare("dijit.form._SliderMover",dojo.dnd.Mover,{onMouseMove:function(e){var _5af=this.widget;var _5b0=_5af._abspos;if(!_5b0){_5b0=_5af._abspos=dojo.position(_5af.sliderBarContainer,true);_5af._setPixelValue_=dojo.hitch(_5af,"_setPixelValue");_5af._isReversed_=_5af._isReversed();}var _5b1=e[_5af._mousePixelCoord]-_5b0[_5af._startingPixelCoord];_5af._setPixelValue_(_5af._isReversed_?(_5b0[_5af._pixelCount]-_5b1):_5b1,_5b0[_5af._pixelCount],false);},destroy:function(e){dojo.dnd.Mover.prototype.destroy.apply(this,arguments);var _5b2=this.widget;_5b2._abspos=null;_5b2._setValueAttr(_5b2.value,true);}});}if(!dojo._hasResource["dijit.form.VerticalSlider"]){dojo._hasResource["dijit.form.VerticalSlider"]=true;dojo.provide("dijit.form.VerticalSlider");dojo.declare("dijit.form.VerticalSlider",dijit.form.HorizontalSlider,{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\" tabIndex=\"-1\" 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\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" waiRole=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"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\" waiRole=\"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\" tabIndex=\"-1\" 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:true,_isReversed:function(){return this._descending;}});}if(!dojo._hasResource["dijit.form.HorizontalRule"]){dojo._hasResource["dijit.form.HorizontalRule"]=true;dojo.provide("dijit.form.HorizontalRule");dojo.declare("dijit.form.HorizontalRule",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH\"></div>",count:3,container:"containerNode",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:true,postCreate:function(){var _5b3;if(this.count==1){_5b3=this._genHTML(50,0);}else{var i;var _5b4=100/(this.count-1);if(!this._isHorizontal||this.isLeftToRight()){_5b3=this._genHTML(0,0);for(i=1;i<this.count-1;i++){_5b3+=this._genHTML(_5b4*i,i);}_5b3+=this._genHTML(100,this.count-1);}else{_5b3=this._genHTML(100,0);for(i=1;i<this.count-1;i++){_5b3+=this._genHTML(100-_5b4*i,i);}_5b3+=this._genHTML(0,this.count-1);}}this.domNode.innerHTML=_5b3;}});}if(!dojo._hasResource["dijit.form.VerticalRule"]){dojo._hasResource["dijit.form.VerticalRule"]=true;dojo.provide("dijit.form.VerticalRule");dojo.declare("dijit.form.VerticalRule",dijit.form.HorizontalRule,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkV\" style=\"top:",_isHorizontal:false});}if(!dojo._hasResource["dijit.form.HorizontalRuleLabels"]){dojo._hasResource["dijit.form.HorizontalRuleLabels"]=true;dojo.provide("dijit.form.HorizontalRuleLabels");dojo.declare("dijit.form.HorizontalRuleLabels",dijit.form.HorizontalRule,{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(pos){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(){var _5b5=this.labels;if(!_5b5.length){_5b5=dojo.query("> li",this.srcNodeRef).map(function(node){return String(node.innerHTML);});}this.srcNodeRef.innerHTML="";if(!_5b5.length&&this.count>1){var _5b6=this.minimum;var inc=(this.maximum-_5b6)/(this.count-1);for(var i=0;i<this.count;i++){_5b5.push((i<this.numericMargin||i>=(this.count-this.numericMargin))?"":dojo.number.format(_5b6,this.constraints));_5b6+=inc;}}return _5b5;},postMixInProperties:function(){this.inherited(arguments);this.labels=this.getLabels();this.count=this.labels.length;}});}if(!dojo._hasResource["dijit.form.VerticalRuleLabels"]){dojo._hasResource["dijit.form.VerticalRuleLabels"]=true;dojo.provide("dijit.form.VerticalRuleLabels");dojo.declare("dijit.form.VerticalRuleLabels",dijit.form.HorizontalRuleLabels,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerV\" style=\"top:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelV\">",_calcPosition:function(pos){return 100-pos;},_isHorizontal:false});}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);},filter:function(_5b7){if(_5b7){_5b7=_5b7.replace(/\r/g,"");}return this.inherited(arguments);},postCreate:function(){this.inherited(arguments);if(dojo.isIE&&this.cols){dojo.addClass(this.textbox,"dijitTextAreaCols");}},_previousValue:"",_onInput:function(e){if(this.maxLength){var _5b8=parseInt(this.maxLength);var _5b9=this.textbox.value.replace(/\r/g,"");var _5ba=_5b9.length-_5b8;if(_5ba>0){if(e){dojo.stopEvent(e);}var _5bb=this.textbox;if(_5bb.selectionStart){var pos=_5bb.selectionStart;var cr=0;if(dojo.isOpera){cr=(this.textbox.value.substring(0,pos).match(/\r/g)||[]).length;}this.textbox.value=_5b9.substring(0,pos-_5ba-cr)+_5b9.substring(pos-cr);_5bb.setSelectionRange(pos-_5ba,pos-_5ba);}else{if(dojo.doc.selection){_5bb.focus();var _5bc=dojo.doc.selection.createRange();_5bc.moveStart("character",-_5ba);_5bc.text="";_5bc.select();}}}this._previousValue=this.textbox.value;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.Textarea"]){dojo._hasResource["dijit.form.Textarea"]=true;dojo.provide("dijit.form.Textarea");dojo.declare("dijit.form.Textarea",dijit.form.SimpleTextarea,{cols:"",_previousNewlines:0,_strictMode:(dojo.doc.compatMode!="BackCompat"),_getHeight:function(_5bd){var newH=_5bd.scrollHeight;if(dojo.isIE){newH+=_5bd.offsetHeight-_5bd.clientHeight-((dojo.isIE<8&&this._strictMode)?dojo._getPadBorderExtents(_5bd).h:0);}else{if(dojo.isMoz){newH+=_5bd.offsetHeight-_5bd.clientHeight;}else{if(dojo.isWebKit&&!(dojo.isSafari<4)){newH+=dojo._getBorderExtents(_5bd).h;}else{newH+=dojo._getPadBorderExtents(_5bd).h;}}}return newH;},_estimateHeight:function(_5be){_5be.style.maxHeight="";_5be.style.height="auto";_5be.rows=(_5be.value.match(/\n/g)||[]).length+1;},_needsHelpShrinking:dojo.isMoz||dojo.isWebKit,_onInput:function(){this.inherited(arguments);if(this._busyResizing){return;}this._busyResizing=true;var _5bf=this.textbox;if(_5bf.scrollHeight&&_5bf.offsetHeight&&_5bf.clientHeight){var newH=this._getHeight(_5bf)+"px";if(_5bf.style.height!=newH){_5bf.style.maxHeight=_5bf.style.height=newH;}if(this._needsHelpShrinking){if(this._setTimeoutHandle){clearTimeout(this._setTimeoutHandle);}this._setTimeoutHandle=setTimeout(dojo.hitch(this,"_shrink"),0);}}else{this._estimateHeight(_5bf);}this._busyResizing=false;},_busyResizing:false,_shrink:function(){this._setTimeoutHandle=null;if(this._needsHelpShrinking&&!this._busyResizing){this._busyResizing=true;var _5c0=this.textbox;var _5c1=false;if(_5c0.value==""){_5c0.value=" ";_5c1=true;}var _5c2=_5c0.scrollHeight;if(!_5c2){this._estimateHeight(_5c0);}else{var _5c3=_5c0.style.paddingBottom;var _5c4=dojo._getPadExtents(_5c0);_5c4=_5c4.h-_5c4.t;_5c0.style.paddingBottom=_5c4+1+"px";var newH=this._getHeight(_5c0)-1+"px";if(_5c0.style.maxHeight!=newH){_5c0.style.paddingBottom=_5c4+_5c2+"px";_5c0.scrollTop=0;_5c0.style.maxHeight=this._getHeight(_5c0)-_5c2+"px";}_5c0.style.paddingBottom=_5c3;}if(_5c1){_5c0.value="";}this._busyResizing=false;}},resize:function(){this._onInput();},_setValueAttr:function(){this.inherited(arguments);this.resize();},postCreate:function(){this.inherited(arguments);dojo.style(this.textbox,{overflowY:"hidden",overflowX:"auto",boxSizing:"border-box",MsBoxSizing:"border-box",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box"});this.connect(this.textbox,"onscroll",this._onInput);this.connect(this.textbox,"onresize",this._onInput);this.connect(this.textbox,"onfocus",this._onInput);this._setTimeoutHandle=setTimeout(dojo.hitch(this,"resize"),0);},uninitialize:function(){if(this._setTimeoutHandle){clearTimeout(this._setTimeoutHandle);}this.inherited(arguments);}});}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 wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",containerId:"",buttonWidget:"dijit.layout._StackButton",postCreate:function(){dijit.setWaiRole(this.domNode,"tablist");this.pane2button={};this.pane2handles={};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,_5c5){var cls=dojo.getObject(this.buttonWidget);var _5c6=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(_5c6.focusNode,"selected","false");this.pane2handles[page.id]=[this.connect(page,"set",function(name,_5c7){var _5c8={title:"label",showTitle:"showLabel",iconClass:"iconClass",closable:"closeButton",tooltip:"title"}[name];if(_5c8){_5c6.set(_5c8,_5c7);}}),this.connect(_5c6,"onClick",dojo.hitch(this,"onButtonClick",page)),this.connect(_5c6,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",page))];this.addChild(_5c6,_5c5);this.pane2button[page.id]=_5c6;page.controlButton=_5c6;if(!this._currentChild){_5c6.focusNode.setAttribute("tabIndex","0");dijit.setWaiState(_5c6.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.pane2handles[page.id],this.disconnect,this);delete this.pane2handles[page.id];var _5c9=this.pane2button[page.id];if(_5c9){this.removeChild(_5c9);delete this.pane2button[page.id];_5c9.destroy();}delete page.controlButton;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _5ca=this.pane2button[this._currentChild.id];_5ca.set("checked",false);dijit.setWaiState(_5ca.focusNode,"selected","false");_5ca.focusNode.setAttribute("tabIndex","-1");}var _5cb=this.pane2button[page.id];_5cb.set("checked",true);dijit.setWaiState(_5cb.focusNode,"selected","true");this._currentChild=page;_5cb.focusNode.setAttribute("tabIndex","0");var _5cc=dijit.byId(this.containerId);dijit.setWaiState(_5cc.containerNode,"labelledby",_5cb.id);},onButtonClick:function(page){var _5cd=dijit.byId(this.containerId);_5cd.selectChild(page);},onCloseButtonClick:function(page){var _5ce=dijit.byId(this.containerId);_5ce.closeChild(page);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){dijit.focus(b.focusNode||b.domNode);}}},adjacent:function(_5cf){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_5cf=!_5cf;}var _5d0=this.getChildren();var _5d1=dojo.indexOf(_5d0,this.pane2button[this._currentChild.id]);var _5d2=_5cf?1:_5d0.length-1;return _5d0[(_5d1+_5d2)%_5d0.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _5d3=null;if(e.ctrlKey||!e._djpage){var k=dojo.keys;switch(e.charOrCode){case k.LEFT_ARROW:case k.UP_ARROW:if(!e._djpage){_5d3=false;}break;case k.PAGE_UP:if(e.ctrlKey){_5d3=false;}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(!e._djpage){_5d3=true;}break;case k.PAGE_DOWN:if(e.ctrlKey){_5d3=true;}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(_5d3!==null){this.adjacent(_5d3).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",postCreate:function(evt){dijit.setWaiRole((this.focusNode||this.domNode),"tab");this.inherited(arguments);},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",postCreate:function(){this.inherited(arguments);dojo.addClass(this.domNode,"dijitLayoutContainer");dijit.setWaiRole(this.containerNode,"tabpanel");this.connect(this.domNode,"onkeypress",this._onKeyPress);},startup:function(){if(this._started){return;}var _5d4=this.getChildren();dojo.forEach(_5d4,this._setupChild,this);if(this.persist){this.selectedChildWidget=dijit.byId(dojo.cookie(this.id+"_selectedChild"));}else{dojo.some(_5d4,function(_5d5){if(_5d5.selected){this.selectedChildWidget=_5d5;}return _5d5.selected;},this);}var _5d6=this.selectedChildWidget;if(!_5d6&&_5d4[0]){_5d6=this.selectedChildWidget=_5d4[0];_5d6.selected=true;}dojo.publish(this.id+"-startup",[{children:_5d4,selected:_5d6}]);this.inherited(arguments);},resize:function(){var _5d7=this.selectedChildWidget;if(_5d7&&!this._hasBeenShown){this._hasBeenShown=true;this._showChild(_5d7);}this.inherited(arguments);},_setupChild:function(_5d8){this.inherited(arguments);dojo.removeClass(_5d8.domNode,"dijitVisible");dojo.addClass(_5d8.domNode,"dijitHidden");_5d8.domNode.title="";},addChild:function(_5d9,_5da){this.inherited(arguments);if(this._started){dojo.publish(this.id+"-addChild",[_5d9,_5da]);this.layout();if(!this.selectedChildWidget){this.selectChild(_5d9);}}},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 _5db=this.getChildren();if(_5db.length){this.selectChild(_5db[0]);}}}if(this._started){this.layout();}},selectChild:function(page,_5dc){page=dijit.byId(page);if(this.selectedChildWidget!=page){this._transition(page,this.selectedChildWidget,_5dc);this.selectedChildWidget=page;dojo.publish(this.id+"-selectChild",[page]);if(this.persist){dojo.cookie(this.id+"_selectedChild",this.selectedChildWidget.id);}}},_transition:function(_5dd,_5de){if(_5de){this._hideChild(_5de);}this._showChild(_5dd);if(_5dd.resize){if(this.doLayout){_5dd.resize(this._containerContentBox||this._contentBox);}else{_5dd.resize();}}},_adjacent:function(_5df){var _5e0=this.getChildren();var _5e1=dojo.indexOf(_5e0,this.selectedChildWidget);_5e1+=_5df?1:_5e0.length-1;return _5e0[_5e1%_5e0.length];},forward:function(){this.selectChild(this._adjacent(true),true);},back:function(){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 _5e2=this.getChildren();page.isFirstChild=(page==_5e2[0]);page.isLastChild=(page==_5e2[_5e2.length-1]);page.selected=true;dojo.removeClass(page.domNode,"dijitHidden");dojo.addClass(page.domNode,"dijitVisible");page._onShow();},_hideChild:function(page){page.selected=false;dojo.removeClass(page.domNode,"dijitVisible");dojo.addClass(page.domNode,"dijitHidden");page.onHide();},closeChild:function(page){var _5e3=page.onClose(this,page);if(_5e3){this.removeChild(page);page.destroyRecursive();}},destroyDescendants:function(_5e4){dojo.forEach(this.getChildren(),function(_5e5){this.removeChild(_5e5);_5e5.destroyRecursive(_5e4);},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",_verticalSpace:0,baseClass:"dijitAccordionContainer",postCreate:function(){this.domNode.style.overflow="hidden";this.inherited(arguments);dijit.setWaiRole(this.domNode,"tablist");},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.selectedChildWidget){var _5e6=this.selectedChildWidget.containerNode.style;_5e6.display="";_5e6.overflow="auto";this.selectedChildWidget._wrapperWidget.set("selected",true);}},_getTargetHeight:function(node){var cs=dojo.getComputedStyle(node);return Math.max(this._verticalSpace-dojo._getPadBorderExtents(node,cs).h-dojo._getMarginExtents(node,cs).h,0);},layout:function(){var _5e7=this.selectedChildWidget;if(!_5e7){return;}var _5e8=_5e7._wrapperWidget.domNode,_5e9=dojo._getMarginExtents(_5e8),_5ea=dojo._getPadBorderExtents(_5e8),_5eb=this._contentBox;var _5ec=0;dojo.forEach(this.getChildren(),function(_5ed){if(_5ed!=_5e7){_5ec+=dojo.marginBox(_5ed._wrapperWidget.domNode).h;}});this._verticalSpace=_5eb.h-_5ec-_5e9.h-_5ea.h-_5e7._buttonWidget.getTitleHeight();this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_5e9.w-_5ea.w};if(_5e7){_5e7.resize(this._containerContentBox);}},_setupChild:function(_5ee){_5ee._wrapperWidget=new dijit.layout._AccordionInnerContainer({contentWidget:_5ee,buttonWidget:this.buttonWidget,id:_5ee.id+"_wrapper",dir:_5ee.dir,lang:_5ee.lang,parent:this});this.inherited(arguments);},addChild:function(_5ef,_5f0){if(this._started){dojo.place(_5ef.domNode,this.containerNode,_5f0);if(!_5ef._started){_5ef.startup();}this._setupChild(_5ef);dojo.publish(this.id+"-addChild",[_5ef,_5f0]);this.layout();if(!this.selectedChildWidget){this.selectChild(_5ef);}}else{this.inherited(arguments);}},removeChild:function(_5f1){_5f1._wrapperWidget.destroy();delete _5f1._wrapperWidget;dojo.removeClass(_5f1.domNode,"dijitHidden");this.inherited(arguments);},getChildren:function(){return dojo.map(this.inherited(arguments),function(_5f2){return _5f2.declaredClass=="dijit.layout._AccordionInnerContainer"?_5f2.contentWidget:_5f2;},this);},destroy:function(){dojo.forEach(this.getChildren(),function(_5f3){_5f3._wrapperWidget.destroy();});this.inherited(arguments);},_transition:function(_5f4,_5f5,_5f6){if(this._inTransition){return;}var _5f7=[];var _5f8=this._verticalSpace;if(_5f4){_5f4._wrapperWidget.set("selected",true);this._showChild(_5f4);if(this.doLayout&&_5f4.resize){_5f4.resize(this._containerContentBox);}var _5f9=_5f4.domNode;dojo.addClass(_5f9,"dijitVisible");dojo.removeClass(_5f9,"dijitHidden");if(_5f6){var _5fa=_5f9.style.overflow;_5f9.style.overflow="hidden";_5f7.push(dojo.animateProperty({node:_5f9,duration:this.duration,properties:{height:{start:1,end:this._getTargetHeight(_5f9)}},onEnd:function(){_5f9.style.overflow=_5fa;if(dojo.isIE){setTimeout(function(){dojo.removeClass(_5f9.parentNode,"dijitAccordionInnerContainerFocused");setTimeout(function(){dojo.addClass(_5f9.parentNode,"dijitAccordionInnerContainerFocused");},0);},0);}}}));}}if(_5f5){_5f5._wrapperWidget.set("selected",false);var _5fb=_5f5.domNode;if(_5f6){var _5fc=_5fb.style.overflow;_5fb.style.overflow="hidden";_5f7.push(dojo.animateProperty({node:_5fb,duration:this.duration,properties:{height:{start:this._getTargetHeight(_5fb),end:1}},onEnd:function(){dojo.addClass(_5fb,"dijitHidden");dojo.removeClass(_5fb,"dijitVisible");_5fb.style.overflow=_5fc;if(_5f5.onHide){_5f5.onHide();}}}));}else{dojo.addClass(_5fb,"dijitHidden");dojo.removeClass(_5fb,"dijitVisible");if(_5f5.onHide){_5f5.onHide();}}}if(_5f6){this._inTransition=true;var _5fd=dojo.fx.combine(_5f7);_5fd.onEnd=dojo.hitch(this,function(){delete this._inTransition;});_5fd.play();}},_onKeyPress:function(e,_5fe){if(this._inTransition||this.disabled||e.altKey||!(_5fe||e.ctrlKey)){if(this._inTransition){dojo.stopEvent(e);}return;}var k=dojo.keys,c=e.charOrCode;if((_5fe&&(c==k.LEFT_ARROW||c==k.UP_ARROW))||(e.ctrlKey&&c==k.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();dojo.stopEvent(e);}else{if((_5fe&&(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 _5ff=this.contentWidget,cls=dojo.getObject(this.buttonWidget);this.button=_5ff._buttonWidget=(new cls({contentWidget:_5ff,label:_5ff.title,title:_5ff.tooltip,dir:_5ff.dir,lang:_5ff.lang,iconClass:_5ff.iconClass,id:_5ff.id+"_button",parent:this.parent})).placeAt(this.domNode);dojo.place(this.contentWidget.domNode,this.domNode);},postCreate:function(){this.inherited(arguments);this.connect(this.contentWidget,"set",function(name,_600){var _601={title:"label",tooltip:"title",iconClass:"iconClass"}[name];if(_601){this.button.set(_601,_600);}},this);},_setSelectedAttr:function(_602){this.selected=_602;this.button.set("selected",_602);if(_602){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}},startup:function(){this.contentWidget.startup();},destroy:function(){this.button.destroyRecursive();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' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowTextUp' waiRole=\"presentation\">+</span\n\t\t><span class='arrowTextDown' waiRole=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" waiRole=\"presentation\"/>\n\t\t<span waiRole=\"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;},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);var _603=dojo.attr(this.domNode,"id").replace(" ","_");dojo.attr(this.titleTextNode,"id",_603+"_title");dijit.setWaiState(this.focusNode,"labelledby",dojo.attr(this.titleTextNode,"id"));},getTitleHeight:function(){return dojo.marginBox(this.domNode).h;},_onTitleClick:function(){var _604=this.getParent();if(!_604._inTransition){_604.selectChild(this.contentWidget,true);dijit.focus(this.focusNode);}},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedAttr:function(_605){this.selected=_605;dijit.setWaiState(this.focusNode,"expanded",_605);dijit.setWaiState(this.focusNode,"selected",_605);this.focusNode.setAttribute("tabIndex",_605?"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);},postCreate:function(){this.inherited(arguments);this._splitters={};this._splitterThickness={};},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_606){var _607=_606.region;if(_607){this.inherited(arguments);dojo.addClass(_606.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_607=="leading"){_607=ltr?"left":"right";}if(_607=="trailing"){_607=ltr?"right":"left";}this["_"+_607]=_606.domNode;this["_"+_607+"Widget"]=_606;if((_606.splitter||this.gutters)&&!this._splitters[_607]){var _608=dojo.getObject(_606.splitter?this._splitterClass:"dijit.layout._Gutter");var _609=new _608({id:_606.id+"_splitter",container:this,child:_606,region:_607,live:this.liveSplitters});_609.isSplitter=true;this._splitters[_607]=_609.domNode;dojo.place(this._splitters[_607],_606.domNode,"after");_609.startup();}_606.region=_607;}},_computeSplitterThickness:function(_60a){this._splitterThickness[_60a]=this._splitterThickness[_60a]||dojo.marginBox(this._splitters[_60a])[(/top|bottom/.test(_60a)?"h":"w")];},layout:function(){for(var _60b in this._splitters){this._computeSplitterThickness(_60b);}this._layoutChildren();},addChild:function(_60c,_60d){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_60e){var _60f=_60e.region;var _610=this._splitters[_60f];if(_610){dijit.byNode(_610).destroy();delete this._splitters[_60f];delete this._splitterThickness[_60f];}this.inherited(arguments);delete this["_"+_60f];delete this["_"+_60f+"Widget"];if(this._started){this._layoutChildren();}dojo.removeClass(_60e.domNode,this.baseClass+"Pane");},getChildren:function(){return dojo.filter(this.inherited(arguments),function(_611){return !_611.isSplitter;});},getSplitter:function(_612){var _613=this._splitters[_612];return _613?dijit.byNode(_613):null;},resize:function(_614,_615){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(_616,_617){if(!this._borderBox||!this._borderBox.h){return;}var _618=(this.design=="sidebar");var _619=0,_61a=0,_61b=0,_61c=0;var _61d={},_61e={},_61f={},_620={},_621=(this._center&&this._center.style)||{};var _622=/left|right/.test(_616);var _623=!_616||(!_622&&!_618);var _624=!_616||(_622&&_618);if(this._top){_61d=(_616=="top"||_624)&&this._top.style;_619=_616=="top"?_617:dojo.marginBox(this._top).h;}if(this._left){_61e=(_616=="left"||_623)&&this._left.style;_61b=_616=="left"?_617:dojo.marginBox(this._left).w;}if(this._right){_61f=(_616=="right"||_623)&&this._right.style;_61c=_616=="right"?_617:dojo.marginBox(this._right).w;}if(this._bottom){_620=(_616=="bottom"||_624)&&this._bottom.style;_61a=_616=="bottom"?_617:dojo.marginBox(this._bottom).h;}var _625=this._splitters;var _626=_625.top,_627=_625.bottom,_628=_625.left,_629=_625.right;var _62a=this._splitterThickness;var _62b=_62a.top||0,_62c=_62a.left||0,_62d=_62a.right||0,_62e=_62a.bottom||0;if(_62c>50||_62d>50){setTimeout(dojo.hitch(this,function(){this._splitterThickness={};for(var _62f in this._splitters){this._computeSplitterThickness(_62f);}this._layoutChildren();}),50);return false;}var pe=this.pe;var _630={left:(_618?_61b+_62c:0)+pe.l+"px",right:(_618?_61c+_62d:0)+pe.r+"px"};if(_626){dojo.mixin(_626.style,_630);_626.style.top=_619+pe.t+"px";}if(_627){dojo.mixin(_627.style,_630);_627.style.bottom=_61a+pe.b+"px";}_630={top:(_618?0:_619+_62b)+pe.t+"px",bottom:(_618?0:_61a+_62e)+pe.b+"px"};if(_628){dojo.mixin(_628.style,_630);_628.style.left=_61b+pe.l+"px";}if(_629){dojo.mixin(_629.style,_630);_629.style.right=_61c+pe.r+"px";}dojo.mixin(_621,{top:pe.t+_619+_62b+"px",left:pe.l+_61b+_62c+"px",right:pe.r+_61c+_62d+"px",bottom:pe.b+_61a+_62e+"px"});var _631={top:_618?pe.t+"px":_621.top,bottom:_618?pe.b+"px":_621.bottom};dojo.mixin(_61e,_631);dojo.mixin(_61f,_631);_61e.left=pe.l+"px";_61f.right=pe.r+"px";_61d.top=pe.t+"px";_620.bottom=pe.b+"px";if(_618){_61d.left=_620.left=_61b+_62c+pe.l+"px";_61d.right=_620.right=_61c+_62d+pe.r+"px";}else{_61d.left=_620.left=pe.l+"px";_61d.right=_620.right=pe.r+"px";}var _632=this._borderBox.h-pe.t-pe.b,_633=_632-(_619+_62b+_61a+_62e),_634=_618?_632:_633;var _635=this._borderBox.w-pe.l-pe.r,_636=_635-(_61b+_62c+_61c+_62d),_637=_618?_636:_635;var dim={top:{w:_637,h:_619},bottom:{w:_637,h:_61a},left:{w:_61b,h:_634},right:{w:_61c,h:_634},center:{h:_633,w:_636}};if(_616){var _638=this["_"+_616+"Widget"],mb={};mb[/top|bottom/.test(_616)?"h":"w"]=_617;_638.resize?_638.resize(mb,dim[_638.region]):dojo.marginBox(_638.domNode,mb);}var _639=dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.some(this.getChildren(),function(_63a){return _63a.domNode.tagName=="TEXTAREA"||_63a.domNode.tagName=="INPUT";});if(_639){var _63b=function(_63c,_63d,_63e){if(_63c){(_63c.resize?_63c.resize(_63d,_63e):dojo.marginBox(_63c.domNode,_63d));}};if(_628){_628.style.height=_634;}if(_629){_629.style.height=_634;}_63b(this._leftWidget,{h:_634},dim.left);_63b(this._rightWidget,{h:_634},dim.right);if(_626){_626.style.width=_637;}if(_627){_627.style.width=_637;}_63b(this._topWidget,{w:_637},dim.top);_63b(this._bottomWidget,{w:_637},dim.bottom);_63b(this._centerWidget,dim.center);}else{var _63f=!_616||(/top|bottom/.test(_616)&&this.design!="sidebar"),_640=!_616||(/left|right/.test(_616)&&this.design=="sidebar"),_641={center:true,left:_63f,right:_63f,top:_640,bottom:_640};dojo.forEach(this.getChildren(),function(_642){if(_642.resize&&_641[_642.region]){_642.resize(null,dim[_642.region]);}},this);}},destroy:function(){for(var _643 in this._splitters){var _644=this._splitters[_643];dijit.byNode(_644).destroy();dojo.destroy(_644);}delete this._splitters;delete this._splitterThickness;this.inherited(arguments);}});dojo.extend(dijit._Widget,{region:"",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\" waiRole=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",postCreate:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));this._factor=/top|left/.test(this.region)?1:-1;this._cookieName=this.container.id+"_"+this.region;if(this.container.persist){var _645=dojo.cookie(this._cookieName);if(_645){this.child.domNode.style[this.horizontal?"height":"width"]=_645;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_646=this.container._splitterThickness[this.region];var flip={left:"right",right:"left",top:"bottom",bottom:"top",leading:"trailing",trailing:"leading"},_647=this.container["_"+flip[this.region]];var _648=dojo.contentBox(this.container.domNode)[dim]-(_647?dojo.marginBox(_647)[dim]:0)-20-_646*2;return Math.min(this.child.maxSize,_648);},_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");dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");if(this.fake){dojo.removeClass(this.fake,"dijitSplitterHover");dojo.removeClass(this.fake,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover");}var _649=this._factor,max=this._computeMaxSize(),min=this.child.minSize||20,_64a=this.horizontal,axis=_64a?"pageY":"pageX",_64b=e[axis],_64c=this.domNode.style,dim=_64a?"h":"w",_64d=dojo.marginBox(this.child.domNode)[dim],_64e=this.region,_64f=parseInt(this.domNode.style[_64e],10),_650=this._resize,_651=this.child.domNode,_652=dojo.hitch(this.container,this.container._layoutChildren),de=dojo.doc;this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_653){var _654=e[axis]-_64b,_655=_649*_654+_64d,_656=Math.max(Math.min(_655,max),min);if(_650||_653){_652(_64e,_656);}_64c[_64e]=_649*_654+_64f+(_656-_655)+"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");dojo.removeClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");dojo.removeClass(this.domNode,"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 _657=this.horizontal;var tick=1;var dk=dojo.keys;switch(e.charOrCode){case _657?dk.UP_ARROW:dk.LEFT_ARROW:tick*=-1;case _657?dk.DOWN_ARROW:dk.RIGHT_ARROW:break;default:return;}var _658=dojo.marginBox(this.child.domNode)[_657?"h":"w"]+this._factor*tick;this.container._layoutChildren(this.region,Math.max(Math.min(_658,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\" waiRole=\"presentation\"></div>",postCreate:function(){this.horizontal=/top|bottom/.test(this.region);dojo.addClass(this.domNode,"dijitGutter"+(this.horizontal?"H":"V"));}});}if(!dojo._hasResource["dijit.layout.LayoutContainer"]){dojo._hasResource["dijit.layout.LayoutContainer"]=true;dojo.provide("dijit.layout.LayoutContainer");dojo.declare("dijit.layout.LayoutContainer",dijit.layout._LayoutWidget,{baseClass:"dijitLayoutContainer",constructor:function(){dojo.deprecated("dijit.layout.LayoutContainer is deprecated","use BorderContainer instead",2);},layout:function(){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());},addChild:function(_659,_65a){this.inherited(arguments);if(this._started){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());}},removeChild:function(_65b){this.inherited(arguments);if(this._started){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());}}});dojo.extend(dijit._Widget,{layoutAlign:"none"});}if(!dojo._hasResource["dijit.layout.LinkPane"]){dojo._hasResource["dijit.layout.LinkPane"]=true;dojo.provide("dijit.layout.LinkPane");dojo.declare("dijit.layout.LinkPane",[dijit.layout.ContentPane,dijit._Templated],{templateString:"<div class=\"dijitLinkPane\" dojoAttachPoint=\"containerNode\"></div>",postMixInProperties:function(){if(this.srcNodeRef){this.title+=this.srcNodeRef.innerHTML;}this.inherited(arguments);},_fillContent:function(_65c){}});}if(!dojo._hasResource["dijit.layout.SplitContainer"]){dojo._hasResource["dijit.layout.SplitContainer"]=true;dojo.provide("dijit.layout.SplitContainer");dojo.declare("dijit.layout.SplitContainer",dijit.layout._LayoutWidget,{constructor:function(){dojo.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(dojo.isMozilla){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 _65d=dojo.doc.createElement("div");this.virtualSizer=_65d;_65d.style.position="relative";_65d.style.zIndex=10;_65d.className=this.isHorizontal?"dijitSplitContainerVirtualSizerH":"dijitSplitContainerVirtualSizerV";this.domNode.appendChild(_65d);dojo.setSelectable(_65d,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(_65e,i,_65f){this._setupChild(_65e);if(i<_65f.length-1){this._addSizer();}},this);if(this.persist){this._restoreState();}this.inherited(arguments);},_setupChild:function(_660){this.inherited(arguments);_660.domNode.style.position="absolute";dojo.addClass(_660.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(_661){_661=_661===undefined?this.sizers.length:_661;var _662=dojo.doc.createElement("div");_662.id=dijit.getUniqueId("dijit_layout_SplitterContainer_Splitter");this.sizers.splice(_661,0,_662);this.domNode.appendChild(_662);_662.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";var _663=dojo.doc.createElement("div");_663.className="thumb";_662.appendChild(_663);this.connect(_662,"onmousedown","_onSizerMouseDown");dojo.setSelectable(_662,false);},removeChild:function(_664){if(this.sizers.length){var i=dojo.indexOf(this.getChildren(),_664);if(i!=-1){if(i==this.sizers.length){i--;}dojo.destroy(this.sizers[i]);this.sizers.splice(i,1);}}this.inherited(arguments);if(this._started){this.layout();}},addChild:function(_665,_666){this.inherited(arguments);if(this._started){var _667=this.getChildren();if(_667.length>1){this._addSizer(_666);}this.layout();}},layout:function(){this.paneWidth=this._contentBox.w;this.paneHeight=this._contentBox.h;var _668=this.getChildren();if(!_668.length){return;}var _669=this.isHorizontal?this.paneWidth:this.paneHeight;if(_668.length>1){_669-=this.sizerWidth*(_668.length-1);}var _66a=0;dojo.forEach(_668,function(_66b){_66a+=_66b.sizeShare;});var _66c=_669/_66a;var _66d=0;dojo.forEach(_668.slice(0,_668.length-1),function(_66e){var size=Math.round(_66c*_66e.sizeShare);_66e.sizeActual=size;_66d+=size;});_668[_668.length-1].sizeActual=_669-_66d;this._checkSizes();var pos=0;var size=_668[0].sizeActual;this._movePanel(_668[0],pos,size);_668[0].position=pos;pos+=size;if(!this.sizers){return;}dojo.some(_668.slice(1),function(_66f,i){if(!this.sizers[i]){return true;}this._moveSlider(this.sizers[i],pos,this.sizerWidth);this.sizers[i].position=pos;pos+=this.sizerWidth;size=_66f.sizeActual;this._movePanel(_66f,pos,size);_66f.position=pos;pos+=size;},this);},_movePanel:function(_670,pos,size){if(this.isHorizontal){_670.domNode.style.left=pos+"px";_670.domNode.style.top=0;var box={w:size,h:this.paneHeight};if(_670.resize){_670.resize(box);}else{dojo.marginBox(_670.domNode,box);}}else{_670.domNode.style.left=0;_670.domNode.style.top=pos+"px";var box={w:this.paneWidth,h:size};if(_670.resize){_670.resize(box);}else{dojo.marginBox(_670.domNode,box);}}},_moveSlider:function(_671,pos,size){if(this.isHorizontal){_671.style.left=pos+"px";_671.style.top=0;dojo.marginBox(_671,{w:size,h:this.paneHeight});}else{_671.style.left=0;_671.style.top=pos+"px";dojo.marginBox(_671,{w:this.paneWidth,h:size});}},_growPane:function(_672,pane){if(_672>0){if(pane.sizeActual>pane.sizeMin){if((pane.sizeActual-pane.sizeMin)>_672){pane.sizeActual=pane.sizeActual-_672;_672=0;}else{_672-=pane.sizeActual-pane.sizeMin;pane.sizeActual=pane.sizeMin;}}}return _672;},_checkSizes:function(){var _673=0;var _674=0;var _675=this.getChildren();dojo.forEach(_675,function(_676){_674+=_676.sizeActual;_673+=_676.sizeMin;});if(_673<=_674){var _677=0;dojo.forEach(_675,function(_678){if(_678.sizeActual<_678.sizeMin){_677+=_678.sizeMin-_678.sizeActual;_678.sizeActual=_678.sizeMin;}});if(_677>0){var list=this.isDraggingLeft?_675.reverse():_675;dojo.forEach(list,function(_679){_677=this._growPane(_677,_679);},this);}}else{dojo.forEach(_675,function(_67a){_67a.sizeActual=Math.round(_674*(_67a.sizeMin/_673));});}},beginSizing:function(e,i){var _67b=this.getChildren();this.paneBefore=_67b[i];this.paneAfter=_67b[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;this.originPos=dojo.position(_67b[0].domNode,true);if(this.isHorizontal){var _67c=e.layerX||e.offsetX||0;var _67d=e.pageX;this.originPos=this.originPos.x;}else{var _67c=e.layerY||e.offsetY||0;var _67d=e.pageY;this.originPos=this.originPos.y;}this.startPoint=this.lastPoint=_67d;this.screenToClientOffset=_67d-_67c;this.dragOffset=this.lastPoint-this.paneBefore.sizeActual-this.originPos-this.paneBefore.position;if(!this.activeSizing){this._showSizingLine();}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(){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 _67e=this.paneBefore.position;var _67f=this.paneAfter.position+this.paneAfter.sizeActual;this.paneBefore.sizeActual=pos-_67e;this.paneAfter.position=pos+this.sizerWidth;this.paneAfter.sizeActual=_67f-this.paneAfter.position;dojo.forEach(this.getChildren(),function(_680){_680.sizeShare=_680.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");},_getCookieName:function(i){return this.id+"_"+i;},_restoreState:function(){dojo.forEach(this.getChildren(),function(_681,i){var _682=this._getCookieName(i);var _683=dojo.cookie(_682);if(_683){var pos=parseInt(_683);if(typeof pos=="number"){_681.sizeShare=pos;}}},this);},_saveState:function(){if(!this.persist){return;}dojo.forEach(this.getChildren(),function(_684,i){dojo.cookie(this._getCookieName(i),_684.sizeShare,{expires:365});},this);}});dojo.extend(dijit._Widget,{sizeMin:10,sizeShare:10});}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);},postCreate: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 _685=this.tabPosition.replace(/-h/,"");this.tablist.layoutAlign=_685;var _686=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_685},{domNode:this.containerNode,layoutAlign:"client"}];dijit.layout.layoutChildren(this.domNode,this._contentBox,_686);this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_686[2]);if(sc&&sc.resize){sc.resize(this._containerContentBox);}}else{if(this.tablist.resize){this.tablist.resize({w:dojo.contentBox(this.domNode).w});}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 wairole='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 _687=0;for(var pane in this.pane2button){var ow=this.pane2button[pane].innerDiv.scrollWidth;_687=Math.max(_687,ow);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_687+"px";}}});dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",cssStateNodes:{closeNode:"dijitTabCloseButton"},templateString:dojo.cache("dijit.layout","templates/_TabButton.html","<div waiRole=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick'>\n <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n \t<div waiRole=\"presentation\" dojoAttachPoint='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" 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' waiRole=\"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,postMixInProperties:function(){if(!this.iconClass){this.iconClass="dijitTabButtonIcon";}},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.containerNode,false);if(this.iconNode.className=="dijitTabButtonIcon"){dojo.style(this.iconNode,"width","1px");}},startup:function(){this.inherited(arguments);var n=this.domNode;setTimeout(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(disp){this.closeButton=disp;dojo.toggleClass(this.innerDiv,"dijitClosable",disp);this.closeNode.style.display=disp?"":"none";if(disp){var _688=dojo.i18n.getLocalization("dijit","common");if(this.closeNode){dojo.attr(this.closeNode,"title",_688.itemClose);}var _688=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:_688.itemClose,dir:this.dir,lang:this.lang,onClick:dojo.hitch(this,"onClickCloseButton")}));}else{if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}}},_setLabelAttr:function(_689){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._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\" iconClass=\"dijitTabStripMenuIcon\"\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 wairole='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"}),postCreate: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,_68a){this.inherited(arguments);var _68b;if(this.useMenu){var _68c=this.containerId;_68b=new dijit.MenuItem({id:page.id+"_stcMi",label:page.title,dir:page.dir,lang:page.lang,onClick:dojo.hitch(this,function(){var _68d=dijit.byId(_68c);_68d.selectChild(page);})});this._menuChildren[page.id]=_68b;this._menu.addChild(_68b,_68a);}this.pane2handles[page.id].push(this.connect(this.pane2button[page.id],"set",function(name,_68e){if(this._postStartup){if(name=="label"){if(_68b){_68b.set(name,_68e);}if(this._dim){this.resize(this._dim);}}}}));dojo.style(this.containerNode,"width",(dojo.style(this.containerNode,"width")+200)+"px");},onRemoveChild:function(page,_68f){var _690=this.pane2button[page.id];if(this._selectedTab===_690.domNode){this._selectedTab=null;}if(this.useMenu&&page&&page.id&&this._menuChildren[page.id]){this._menu.removeChild(this._menuChildren[page.id]);this._menuChildren[page.id].destroy();delete this._menuChildren[page.id];}this.inherited(arguments);},_initButtons:function(){this._menuChildren={};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.marginBox(btn).w;return true;}else{dojo.style(btn,"display","none");return false;}},this);if(this.useMenu){this._menu=new dijit.Menu({id:this.id+"_menu",dir:this.dir,lang:this.lang,targetNodeIds:[this._menuBtn.domNode],leftClickToOpen:true,refocus:false});this._supportingWidgets.push(this._menu);}},_getTabsWidth:function(){var _691=this.getChildren();if(_691.length){var _692=_691[this.isLeftToRight()?0:_691.length-1].domNode,_693=_691[this.isLeftToRight()?_691.length-1:0].domNode;return _693.offsetLeft+dojo.style(_693,"width")-_692.offsetLeft;}else{return 0;}},_enableBtn:function(_694){var _695=this._getTabsWidth();_694=_694||dojo.style(this.scrollNode,"width");return _695>0&&_694<_695;},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 _696=this._enableBtn(this._contentBox.w);this._buttons.style("display",_696?"":"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;},_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 _697=dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width");return (dojo.isIE==8?-1:1)*(val-_697);}},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 _698=this.getChildren(),_699=dojo.style(this.scrollNode,"width"),_69a=dojo.style(this.containerNode,"width"),_69b=_69a-_699,_69c=this._getTabsWidth();if(_698.length&&_69c>_699){return {min:this.isLeftToRight()?0:_698[_698.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_698[_698.length-1].domNode.offsetLeft+dojo.style(_698[_698.length-1].domNode,"width"))-_699:_69b};}else{var _69d=this.isLeftToRight()?0:_69b;return {min:_69d,max:_69d};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_69e=dojo.style(this.scrollNode,"width"),_69f=this._getScrollBounds();var pos=(n.offsetLeft+dojo.style(n,"width")/2)-_69e/2;pos=Math.min(Math.max(pos,_69f.min),_69f.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _6a0=this._getScrollBounds();x=Math.min(Math.max(x,_6a0.min),_6a0.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(_6a1,node){if(node&&dojo.hasClass(node,"dijitTabDisabled")){return;}var _6a2=dojo.style(this.scrollNode,"width");var d=(_6a2*0.75)*_6a1;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_6a3){var _6a4=this._getScrollBounds();this._leftBtn.set("disabled",_6a3<=_6a4.min);this._rightBtn.set("disabled",_6a3>=_6a4.max);}});dojo.declare("dijit.layout._ScrollingTabControllerButton",dijit.form.Button,{baseClass:"dijitTab tabStripButton",templateString:dojo.cache("dijit.layout","templates/_ScrollingTabControllerButton.html","<div dojoAttachEvent=\"onclick:_onButtonClick\">\n\t<div waiRole=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div waiRole=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img waiRole=\"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:"-1"});}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(_6a5){var cls=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_6a6=dojo.getObject(this.controllerWidget);return new _6a6({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},_6a5);},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["dijit.dijit-all"]){dojo._hasResource["dijit.dijit-all"]=true;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");dojo.provide("dijit.dijit-all");}dojo.i18n._preloadLocalizations("dijit.nls.dijit-all",["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"]);
+}
diff --git a/lib/dijit/dijit-all.js.uncompressed.js b/lib/dijit/dijit-all.js.uncompressed.js
deleted file mode 100644
index 1ce604128..000000000
--- a/lib/dijit/dijit-all.js.uncompressed.js
+++ /dev/null
@@ -1,28580 +0,0 @@
-/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-/*
- This is an optimized version of Dojo, built for deployment and not for
- development. To get sources and documentation, please visit:
-
- http://dojotoolkit.org
-*/
-
-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");
-
-//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]
-});
-
-}
-
-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.i18n = {
- // summary: Utility classes to enable loading of resources for internationalization (i18n)
-};
-=====*/
-
-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){
- // 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]);
- }
-};
-
-}
-
-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.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) {
- // 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;
-
- var 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);
-
- 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 value and selected cell
- this.value = null;
- 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;
- this.value = value;
-
- dojo.addClass(this._cells[i].node, "dijitPaletteCellSelected");
-
- if(priorityChange || priorityChange === undefined){
- this.onChange(value);
- }
-
- break;
- }
- }
- }
- },
-
- 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){
- // 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
- }
- }
-);
-=====*/
-
-}
-
-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.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: 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"]]
- },
-
- // _imagePaths: [protected] Map
- // This is stores the path to the palette images
- _imagePaths: {
- "7x10": dojo.moduleUrl("dijit.themes", "a11y/colors7x10.png"),
- "3x4": dojo.moduleUrl("dijit.themes", "a11y/colors3x4.png"),
- "7x10-rtl": dojo.moduleUrl("dijit.themes", "a11y/colors7x10-rtl.png"),
- "3x4-rtl": dojo.moduleUrl("dijit.themes", "a11y/colors3x4-rtl.png")
- },
-
- // templateString: String
- // The template of this widget.
- templateString: dojo.cache("dijit", "templates/ColorPalette.html", "<div class=\"dijitInline dijitColorPalette\">\n\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\" alt=\"\"/>\n\t<table class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\">\n\t\t<tbody dojoAttachPoint=\"gridNode\"></tbody>\n\t</table>\n</div>\n"),
-
- baseClass: "dijitColorPalette",
-
- dyeClass: 'dijit._Color',
-
- buildRendering: function(){
- // Instantiate the template, which makes a skeleton into which we'll insert a bunch of
- // <img> nodes
-
- this.inherited(arguments);
-
- this.imageNode.setAttribute("src", this._imagePaths[this.palette + (this.isLeftToRight() ? "" : "-rtl")].toString());
-
- var i18nColorNames = dojo.i18n.getLocalization("dojo", "colors", this.lang);
- this._preparePalette(
- this._palettes[this.palette],
- i18nColorNames
- );
- }
-});
-
-dojo.declare("dijit._Color", dojo.Color,
- // summary:
- // Object associated with each cell in a ColorPalette palette.
- // Implements dijit.Dye.
- {
- constructor: function(/*String*/alias){
- this._alias = alias;
- 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){
- dojo.create("img", {
- src: blankGif,
- "class": "dijitPaletteImg",
- alt: this._alias
- }, cell);
- }
- }
-);
-
-}
-
-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.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,
-
- // widgetClass: String
- // Name of class being declared, ex: "acme.myWidget"
- widgetClass: "",
-
- // propList: Object
- // Set of attributes for this widget along with default values, ex:
- // {delay: 100, title: "hello world"}
- defaults: null,
-
- // mixins: 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'][event]", src).orphan(),
- postscriptConnects = dojo.query("> script[type^='dojo/method']", src).orphan(),
- regularConnects = dojo.query("> script[type^='dojo/connect']", src).orphan(),
- srcType = src.nodeName;
-
- var propList = this.defaults || {};
-
- // For all methods defined like <script type="dojo/method" event="foo">,
- // add that method to prototype
- dojo.forEach(methods, function(s){
- var evt = s.getAttribute("event"),
- func = dojo.parser._functionFromScript(s);
- propList[evt] = func;
- });
-
- // 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" 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_.
- var connects = regularConnects.concat(postscriptConnects);
- dojo.forEach(connects, function(s){
- var evt = s.getAttribute("event") || "postscript",
- func = dojo.parser._functionFromScript(s);
- dojo.connect(wc.prototype, evt, func);
- });
- }
- }
-);
-
-}
-
-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.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
-};
-
-}
-
-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.dnd.getViewport = function(){
- // summary:
- // Returns a viewport size (visible part of the window)
-
- // TODO: remove this when getViewport() moved to dojo core, see #7028
-
- // FIXME: need more docs!!
- var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
- if(dojo.isMozilla){
- return {w: dd.clientWidth, h: w.innerHeight}; // Object
- }else if(!dojo.isOpera && w.innerWidth){
- return {w: w.innerWidth, h: w.innerHeight}; // Object
- }else if (!dojo.isOpera && dd && dd.clientWidth){
- return {w: dd.clientWidth, h: dd.clientHeight}; // Object
- }else if (b.clientWidth){
- return {w: b.clientWidth, h: b.clientHeight}; // Object
- }
- return null; // Object
-};
-
-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.dnd.getViewport(), 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);
-};
-
-}
-
-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.declare("dojo.dnd.Mover", null, {
- constructor: function(node, e, host){
- // summary:
- // an object, which makes a node follow the mouse.
- // 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,
- firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
- this.events = [
- dojo.connect(d, "onmousemove", this, "onMouseMove"),
- dojo.connect(d, "onmouseup", this, "onMouseUp"),
- // cancel text selection and text dragging
- dojo.connect(d, "ondragstart", dojo.stopEvent),
- dojo.connect(d.body, "onselectstart", dojo.stopEvent),
- firstEvent
- ];
- // notify that the move has started
- if(h && h.onMoveStart){
- h.onMoveStart(this);
- }
- },
- // mouse event processors
- onMouseMove: function(e){
- // summary:
- // event processor for onmousemove
- // e: Event
- // mouse 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){
- 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);
- }
- dojo.disconnect(this.events.pop());
- },
- 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;
- }
-});
-
-}
-
-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.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"),
- // 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, creates a Mover for the node
- // e: Event
- // mouse 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, "onmouseup", 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, used only for delayed drags
- // e: Event
- // mouse 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
- }
-});
-
-}
-
-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.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.marginBox(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;
- s.left = (leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l) + "px";
- s.top = (leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t) + "px";
- }
-});
-
-/*=====
-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
- };
- }
-});
-
-// WARNING: below are obsolete objects, instead of custom movers use custom moveables (above)
-
-dojo.dnd.move.constrainedMover = function(fun, within){
- // summary:
- // returns a constrained version of dojo.dnd.Mover
- // description:
- // this function produces n object, which will put a constraint on
- // the margin box of dragged object in absolute coordinates
- // fun: Function
- // called on drag, and returns a constraint box
- // within: Boolean
- // if true, constraints the whole dragged object withtin the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");
- var mover = function(node, e, notifier){
- dojo.dnd.Mover.call(this, node, e, notifier);
- };
- dojo.extend(mover, dojo.dnd.Mover.prototype);
- dojo.extend(mover, {
- onMouseMove: function(e){
- // summary: event processor for onmousemove
- // e: Event: mouse event
- dojo.dnd.autoScroll(e);
- var m = this.marginBox, c = this.constraintBox,
- l = m.l + e.pageX, t = m.t + e.pageY;
- l = l < c.l ? c.l : c.r < l ? c.r : l;
- t = t < c.t ? c.t : c.b < t ? c.b : t;
- this.host.onMove(this, {l: l, t: t});
- },
- onFirstMove: function(){
- // summary: called once to initialize things; it is meant to be called only once
- dojo.dnd.Mover.prototype.onFirstMove.call(this);
- var c = this.constraintBox = fun.call(this);
- c.r = c.l + c.w;
- c.b = c.t + c.h;
- if(within){
- var mb = dojo.marginBox(this.node);
- c.r -= mb.w;
- c.b -= mb.h;
- }
- }
- });
- return mover; // Object
-};
-
-dojo.dnd.move.boxConstrainedMover = function(box, within){
- // summary:
- // a specialization of dojo.dnd.constrainedMover, which constrains to the specified box
- // box: Object
- // a constraint box (l, t, w, h)
- // within: Boolean
- // if true, constraints the whole dragged object withtin the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");
- return dojo.dnd.move.constrainedMover(function(){ return box; }, within); // Object
-};
-
-dojo.dnd.move.parentConstrainedMover = function(area, within){
- // summary:
- // a specialization of dojo.dnd.constrainedMover, which constrains to the parent node
- // area: String
- // "margin" to constrain within the parent's margin box, "border" for the border box,
- // "padding" for the padding box, and "content" for the content box; "content" is the default value.
- // within: Boolean
- // if true, constraints the whole dragged object within the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");
- var fun = 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
- };
- return dojo.dnd.move.constrainedMover(fun, within); // 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;
-
-}
-
-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.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);
- }
- }
- });
-})();
-
-}
-
-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);
- }
-});
-
-}
-
-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");
- // FIXME: remove this back-compat require in 2.0
-/*=====
-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
- }
-
-})();
-
-}
-
-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.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"] }
-=====*/
-
- // 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 attr('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 attr('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;
- }
- });
- */
- },
-
- 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.
- // description:
- // Returns name/value hash for each form element.
- // If there are multiple elements w/the same name, value is an array,
- // unless they are radio buttons in which case value is a scalar since only
- // one can be checked at a time.
- //
- // If the name is a dot separated list (like a.b.c.d), creates a nested structure.
- // Only works on widget form elements.
- // example:
- // | { name: "John Smith", interests: ["sports", "movies"] }
-
- // 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;
- },
-
- // TODO: ComboBox might need time to process a recently input value. This should be async?
- isValid: function(){
- // summary:
- // Returns true if all of the widgets are valid
-
- // This also populate this._invalidWidgets[] array with list of invalid widgets...
- // TODO: put that into separate function? It's confusing to have that as a side effect
- // of a method named isValid().
-
- this._invalidWidgets = dojo.filter(this.getDescendants(), function(widget){
- return !widget.disabled && widget.isValid && !widget.isValid();
- });
- return !this._invalidWidgets.length;
- },
-
-
- 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.
- },
-
- _widgetChange: function(widget){
- // summary:
- // Connected to a widget's onChange function - update our
- // valid state, if needed.
- var isValid = this._lastValidState;
- if(!widget || this._lastValidState === undefined){
- // We have passed a null widget, or we haven't been validated
- // yet - let's re-check all our children
- // This happens when we connect (or reconnect) our children
- isValid = this.isValid();
- if(this._lastValidState === undefined){
- // Set this so that we don't fire an onValidStateChange
- // the first time
- this._lastValidState = isValid;
- }
- }else if(widget.isValid){
- this._invalidWidgets = dojo.filter(this._invalidWidgets || [], function(w){
- return (w != widget);
- }, this);
- if(!widget.isValid() && !widget.get("disabled")){
- this._invalidWidgets.push(widget);
- }
- isValid = (this._invalidWidgets.length === 0);
- }
- if(isValid !== this._lastValidState){
- this._lastValidState = isValid;
- this.onValidStateChange(isValid);
- }
- },
-
- connectChildren: function(){
- // summary:
- // Connects to the onChange function of all children to
- // track valid state changes. 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.
- dojo.forEach(this._changeConnections, dojo.hitch(this, "disconnect"));
- var _this = this;
-
- // we connect to validate - so that it better reflects the states
- // of the widgets - also, we only connect if it has a validate
- // function (to avoid too many unneeded connections)
- var conns = (this._changeConnections = []);
- dojo.forEach(dojo.filter(this.getDescendants(),
- function(item){ return item.validate; }
- ),
- function(widget){
- // We are interested in whenever the widget is validated - or
- // whenever the disabled attribute on that widget is changed
- conns.push(_this.connect(widget, "validate",
- dojo.hitch(_this, "_widgetChange", widget)));
- conns.push(_this.connect(widget, "_setDisabledAttr",
- dojo.hitch(_this, "_widgetChange", widget)));
- });
-
- // Call the widget change function to update the valid state, in
- // case something is different now.
- this._widgetChange(null);
- },
-
- startup: function(){
- this.inherited(arguments);
- // Initialize our valid state tracking. Needs to be done in startup
- // because it's not guaranteed that our children are initialized
- // yet.
- this._changeConnections = [];
- this.connectChildren();
- }
- });
-
-}
-
-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.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(/*Node*/ dialogNode){
- // summary:
- // Find focusable Items each time a dialog is opened,
- // setting _firstFocusItem and _lastFocusItem
- // tags:
- // protected
-
- var elems = dijit._getTabNavigable(dojo.byId(dialogNode));
- this._firstFocusItem = elems.lowest || elems.first || dialogNode;
- this._lastFocusItem = elems.last || elems.highest || this._firstFocusItem;
- if(dojo.isMoz && this._firstFocusItem.tagName.toLowerCase() == "input" &&
- dojo.getNodeProp(this._firstFocusItem, "type").toLowerCase() == "file"){
- // FF doesn't behave well when first element is input type=file, set first focusable to dialog container
- dojo.attr(dialogNode, "tabIndex", "0");
- this._firstFocusItem = dialogNode;
- }
- }
- }
-);
-
-}
-
-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>",
-
- // 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");
- },
-
- _setClassAttr: function(clazz){
- this.node.className = "dijitDialogUnderlay " + 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();
- this.domNode.style.display = "none";
- },
-
- uninitialize: function(){
- if(this.bgIframe){
- this.bgIframe.destroy();
- }
- 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");
-
-// 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,
-
- // 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
- this.parseResults = dojo.parser.parse({
- rootNode: rootNode,
- dir: this.dir,
- lang: this.lang
- });
- }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();
- }
- };
-})();
-
-}
-
-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");
-
-
-
- // for dijit.layout.marginBox2contentBox()
-
-
-
-
-
-
-dojo.declare(
- "dijit.layout.ContentPane", dijit._Widget,
-{
- // summary:
- // A widget that acts as a container for mixed HTML and widgets, and includes an Ajax interface
- // description:
- // A widget that can be used as a stand alone widget
- // or as a base class for other widgets.
- //
- // Handles replacement of document fragment using either external uri or javascript
- // generated markup or DOM content, instantiating widgets within that content.
- // Don't confuse it with an iframe, it only needs/wants document fragments.
- // It's useful as a child of LayoutContainer, SplitContainer, or TabContainer.
- // But note that those classes can contain any widget as a child.
- // example:
- // Some quick samples:
- // To change the innerHTML use .set('content', '<b>new content</b>')
- //
- // Or you can send it a NodeList, .set('content', dojo.query('div [class=selected]', userSelection))
- // please note that the nodes in NodeList will copied, not moved
- //
- // To do a ajax update use .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 attr("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,
-
- // 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 attr('content', ...) / attr('href', ...)
- //
- // False if it doesn't have any content, or if ContentPane is
- // still in the process of downloading href.
- isLoaded: false,
-
- baseClass: "dijitContentPane",
-
- // 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,
-
- // ioArgs: Object
- // Parameters to pass to xhrGet() request, for example:
- // | <div dojoType="dijit.layout.ContentPane" href="./bar" ioArgs="{timeout: 500}">
- ioArgs: {},
-
- // 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,
-
- // onLoadDeferred: [readonly] dojo.Deferred
- // This is the `dojo.Deferred` returned by attr('href', ...) and refresh().
- // Calling onLoadDeferred.addCallback() or addErrback() registers your
- // callback to be called only once, when the prior attr('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 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: []
- }),
-
- 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);
-
- // Detect if we were initialized with data
- if(!this.href && this.srcNodeRef && this.srcNodeRef.innerHTML){
- this.isLoaded = true;
- }
- },
-
- buildRendering: function(){
- // Overrides Widget.buildRendering().
- // Since we have no template we need to set this.containerNode ourselves.
- // For subclasses of ContentPane do have a template, does nothing.
- this.inherited(arguments);
- if(!this.containerNode){
- // make getDescendants() work
- this.containerNode = this.domNode;
- }
- },
-
- postCreate: function(){
- // remove the title attribute so it doesn't show up when hovering
- // over a node
- this.domNode.title = "";
-
- if(!dojo.attr(this.domNode,"role")){
- dijit.setWaiRole(this.domNode, "group");
- }
-
- dojo.addClass(this.domNode, this.baseClass);
- },
-
- 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;
-
- if(this.isLoaded){
- dojo.forEach(this.getChildren(), function(child){
- child.startup();
- });
- }
-
- if(this._isShown() || this.preload){
- this._onShow();
- }
-
- this.inherited(arguments);
- },
-
- _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 propogate 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, "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);
- },
-
- 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 attr("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 (an attr('href') will cancel any in-flight attr('href', ...))
- this.cancel();
-
- this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel"));
-
- this.href = href;
-
- // _setHrefAttr() is called during creation and by the user, after creation.
- // only in the second case do we actually load the URL; otherwise it's done in startup()
- if(this._created && (this.preload || 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 attr("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.href = "";
-
- // Cancel any in-flight requests (an attr('content') will cancel any in-flight attr('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"));
-
- this._setContent(data || "");
-
- this._isDownloaded = false; // mark that content is from a attr('content') not an attr('href')
-
- return this.onLoadDeferred; // dojo.Deferred
- },
- _getContentAttr: function(){
- // summary:
- // Hook to make attr("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);
- },
-
- 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.
- if(!this._wasShown){
- this._onShow();
- }
-
- this._resizeCalled = true;
-
- // 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);
- }
-
- // Make my children layout, or size my single child widget
- this._layoutChildren();
- },
-
- _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{
- // TODO: with _childOfLayoutWidget check maybe this branch no longer necessary?
- var node = this.domNode;
- return (node.style.display != 'none') && (node.style.visibility != 'hidden') && !dojo.hasClass(node, "dijitHidden");
- }
- },
-
- _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)
-
- if(this.href){
- if(!this._xhrDfd && // if there's an href that isn't already being loaded
- (!this.isLoaded || this._hrefChanged || this.refreshOnShow)
- ){
- this.refresh();
- }
- }else{
- // If we are the child of a layout widget then the layout widget will call resize() on
- // us, and then we will size our child/children. Otherwise, we need to do it now.
- if(!this._childOfLayoutWidget && this._needLayout){
- // If a layout has been scheduled for when we become visible, do it now
- this._layoutChildren();
- }
- }
-
- 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;
- },
-
- 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._load();
- return this.onLoadDeferred;
- },
-
- _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.isLoaded = true;
- try{
- this.onLoadDeferred.callback(data);
- this.onLoad(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.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(cont, 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,
- dir: this.dir,
- lang: this.lang
- }, this._contentSetterParams || {});
-
- dojo.mixin(setter, setterParams);
-
- setter.set( (dojo.isObject(cont) && cont.domNode) ? cont.domNode : cont );
-
- // setter params must be pulled afresh from the ContentPane each time
- delete this._contentSetterParams;
-
- if(!isFakeContent){
- // Startup each top level child widget (and they will start their children, recursively)
- dojo.forEach(this.getChildren(), function(child){
- // The parser has already called startup on all widgets *without* a getParent() method
- if(!this.parseOnLoad || child.getParent){
- child.startup();
- }
- }, this);
-
- // 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
- // overide 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);
- }
- },
-
- _scheduleLayout: function(){
- // summary:
- // 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._layoutChildren();
- }else{
- this._needLayout = true;
- }
- },
-
- _layoutChildren: function(){
- // summary:
- // Since I am a Container widget, each of my children expects me to
- // call resize() or layout() on them.
- // description:
- // Should be called on initialization and also whenever we get new content
- // (from an href, or from attr('content', ...))... but deferred until
- // the ContentPane is visible
-
- 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();
- }
- });
- }
- delete this._needLayout;
- },
-
- // 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
- }
-});
-
-}
-
-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: "",
-
- // 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 waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presentation\"></div>\n</div>\n"),
-
- postCreate: function(){
- this.inherited(arguments);
- this.connect(this.containerNode, "onkeypress", "_onKey");
- this.containerNode.title = this.title;
- },
-
- 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 c = this._currentOrientClass;
- if(c){
- dojo.removeClass(this.domNode, c);
- }
- c = "dijitTooltipAB"+(corner.charAt(1) == 'L'?"Left":"Right")+" dijitTooltip"+(corner.charAt(0) == 'T' ? "Below" : "Above");
- dojo.addClass(this.domNode, c);
- this._currentOrientClass = c;
- },
-
- 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
-
- if(this.autofocus){
- this._getFocusItems(this.containerNode);
- dijit.focus(this._firstFocusItem);
- }
- },
-
- 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();
- }
- }
- }
- );
-
-}
-
-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");
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/*=====
-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\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"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=\"onclick: onCancel\" title=\"${buttonCancel}\">\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: 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 overriden.
- // 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){
- 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 });
- 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(" ")
- };
-
- this._fadeIn = dojo.fadeIn({
- node: node,
- duration: this.duration,
- beforeBegin: dojo.hitch(this, function(){
- var underlay = dijit._underlay;
- if(!underlay){
- underlay = dijit._underlay = new dijit.DialogUnderlay(this.underlayAttrs);
- }else{
- underlay.set(this.underlayAttrs);
- }
-
- var ds = dijit._dialogStack,
- zIndex = 948 + ds.length*2;
- if(ds.length == 1){ // first dialog
- underlay.show();
- }
- dojo.style(dijit._underlay.domNode, 'zIndex', zIndex);
- dojo.style(this.domNode, 'zIndex', zIndex + 1);
- }),
- onEnd: dojo.hitch(this, function(){
- if(this.autofocus){
- // 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._fadeOut = dojo.fadeOut({
- node: node,
- duration: this.duration,
- onEnd: dojo.hitch(this, function(){
- node.style.display = "none";
-
- // Restore the previous dialog in the stack, or if this is the only dialog
- // then restore to original page
- var ds = dijit._dialogStack;
- if(ds.length == 0){
- dijit._underlay.hide();
- }else{
- dojo.style(dijit._underlay.domNode, 'zIndex', 948 + ds.length*2);
- dijit._underlay.set(ds[ds.length-1].underlayAttrs);
- }
-
- // Restore focus to wherever it was before this dialog was displayed
- if(this.refocus){
- var focus = this._savedFocus;
-
- // 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.
- if(ds.length > 0){
- var pd = ds[ds.length-1];
- if(!dojo.isDescendant(focus.node, pd.domNode)){
- pd._getFocusItems(pd.domNode);
- focus = pd._firstFocusItem;
- }
- }
-
- dijit.focus(focus);
- }
- })
- });
- },
-
- uninitialize: function(){
- var wasPlaying = false;
- if(this._fadeIn && this._fadeIn.status() == "playing"){
- wasPlaying = true;
- this._fadeIn.stop();
- }
- if(this._fadeOut && this._fadeOut.status() == "playing"){
- wasPlaying = true;
- this._fadeOut.stop();
- }
-
- // 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((this.open || wasPlaying) && !dijit._underlay._destroyed){
- dijit._underlay.hide();
- }
-
- if(this._moveable){
- this._moveable.destroy();
- }
- this.inherited(arguments);
- },
-
- _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.marginBox(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
-
- var ds = dijit._dialogStack;
- if(ds[ds.length-1] != this){
- // console.debug(this.id + ': skipping because', this, 'is not the active dialog');
- return;
- }
-
- 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
- if(this.open){ return; }
-
- // first time we show the dialog, there's some initialization stuff to do
- if(!this._alreadyInitialized){
- this._setup();
- this._alreadyInitialized=true;
- }
-
- if(this._fadeOut.status() == "playing"){
- this._fadeOut.stop();
- }
-
- 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(dojo.doc.documentElement, "onkeypress", this, "_onKey"));
-
- dojo.style(this.domNode, {
- opacity:0,
- display:""
- });
-
- this.open = true;
- this._onShow(); // lazy load trigger
-
- this._size();
- this._position();
- dijit._dialogStack.push(this);
- this._fadeIn.play();
-
- this._savedFocus = dijit.getFocus(this);
- },
-
- hide: function(){
- // summary:
- // Hide the dialog
-
- // if we haven't been initialized yet then we aren't showing and we can just return
- // or if we aren't the active dialog, don't allow us to close yet
- var ds = dijit._dialogStack;
- if(!this._alreadyInitialized || this != ds[ds.length-1]){
- return;
- }
-
- if(this._fadeIn.status() == "playing"){
- this._fadeIn.stop();
- }
-
- // throw away current active dialog from stack -- making the previous dialog or the node on the original page active
- ds.pop();
-
- this._fadeOut.play();
-
- if(this._scrollConnected){
- this._scrollConnected = false;
- }
- dojo.forEach(this._modalconnects, dojo.disconnect);
- this._modalconnects = [];
-
- if(this._relativePosition){
- delete this._relativePosition;
- }
- this.open = false;
-
- this.onHide();
- },
-
- 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(){
- dojo.forEach(this._modalconnects, dojo.disconnect);
- if(this.refocus && this.open){
- setTimeout(dojo.hitch(dijit,"focus",this._savedFocus), 25);
- }
- this.inherited(arguments);
- }
- }
-);
-
-dojo.declare(
- "dijit.Dialog",
- [dijit.layout.ContentPane, dijit._DialogBase],
- {}
-);
-
-// Stack of currenctly displayed dialogs, layered on top of each other
-dijit._dialogStack = [];
-
-// For back-compat. TODO: remove in 2.0
-
-
-}
-
-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");
-
-// 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){
- 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){
- 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){
- 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){
- 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){
- 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){
- 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 && 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 && dojo.body().createTextRange){
- try{
- range = dojo.body().createControlRange();
- 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
- }
-
-});
-
-}
-
-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)
-
-}
-
-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");
-
-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
-};
-
-}
-
-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");
-
-
-
-
-
-
-
-// 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.savedContent";
- 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.savedContent" ' +
- '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 = {};
- this.contentPreFilters.push(dojo.hitch(this, "_preFixUrlAttributes"));
- if(dojo.isMoz){
- this.contentPreFilters.push(this._normalizeFontStyle);
- this.contentPostFilters.push(this._removeMozBogus);
- }
- if(dojo.isWebKit){
- // Try to clean up WebKit bogus artifacts. The inserted classes
- // made by WebKit sometimes messes things up.
- this.contentPreFilters.push(this._removeWebkitBogus);
- this.contentPostFilters.push(this._removeWebkitBogus);
- }
- if(dojo.isIE){
- // IE generates <strong> and <em> but we want to normalize to <b> and <i>
- this.contentPostFilters.push(this._normalizeFontStyle);
- }
- //this.contentDomPostFilters.push(this._postDomFixUrlAttributes);
-
- 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: "",
-
- // _content: [private] String
- // temporary content storage
- _content: "",
-
- // 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__%%**@@",
-
- // onLoadDeferred: [protected] dojo.Deferred
- // Deferred which is fired when the editor finishes loading
- 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.");
- }
-
- 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"],
-
- // 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(this._editorCommandsLocalized){
- return;
- }
- this._editorCommandsLocalized = true;
-
- //in IE, names for blockformat is locale dependent, so we cache the values here
-
- //if the normal way fails, we try the hard way to get the list
-
- //do not use _cacheLocalBlockFormatNames here, as it will
- //trigger security warning in IE7
-
- //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
- var div = dojo.doc.createElement('div');
- dojo.style(div, {
- position: "absolute",
- top: "-2000px"
- });
- dojo.doc.body.appendChild(div);
- div.innerHTML = localhtml;
- var node = div.firstChild;
- while(node){
- dijit._editor.selection.selectElement(node.firstChild);
- dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [node.firstChild]);
- var nativename = node.tagName.toLowerCase();
- this._local2NativeFormatNames[nativename] = document.queryCommandValue("formatblock");
- //this.queryCommandValue("formatblock");
- this._native2LocalFormatNames[this._local2NativeFormatNames[nativename]] = nativename;
- node = node.nextSibling.nextSibling;
- }
- dojo.body().removeChild(div);
- },
-
- 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.
- //
- // A dojo.Deferred object is created at this.onLoadDeferred, and
- // users may attach to it to be informed when the rich-text area
- // initialization is finalized.
- // 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 ]);
-
- this._content = "";
- 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){
- dojo.connect(ta.form, "onsubmit", this, function(){
- // FIXME: should we be calling close() here instead?
- 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.savedContent = 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);
-
- // 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.savedContent");
- if(saveTextarea.value !== ""){
- var datas = saveTextarea.value.split(this._SEPARATOR), i=0, dat;
- while((dat=datas[i++])){
- var data = dat.split(":");
- if(data[0] == this.name){
- html = data[1];
- datas.splice(i, 1); // TODO: this has no effect
- break;
- }
- }
- }
-
- // TODO: this is troublesome if this editor has been destroyed, should have global handler.
- // TODO: need to clear <textarea> in global handler
- dojo.addOnUnload(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);
-
- // 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 || (!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;") + "}\n",
- "\tli > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; }\n",
- "\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(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){
- this.disabled = value;
- if(!this.isLoaded){ return; } // this method requires init to be complete
- value = !!value;
- 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 && (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
- var tabStop = (this.tabStop = dojo.doc.createElement('<div tabIndex=-1>'));
- this.editingArea.appendChild(tabStop);
- 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);
-
- 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");
- }
-
- 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.savedContent = 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.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 _c=this.getValue(true);
-
- if(_c!=this.savedContent){
- this.onChange(_c);
- this.savedContent=_c;
- }
- },
- _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: why is this needed - should we deprecate this ?
- 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);
- },
- 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;
- var webkit420 = 1 << 4;
-
- function isSupportedBy(browsers){
- return {
- ie: Boolean(browsers & ie),
- mozilla: Boolean(browsers & mozilla),
- webkit: Boolean(browsers & webkit),
- webkit420: Boolean(browsers & webkit420),
- 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 | webkit420);
- 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 | webkit420);
- 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.isWebKit > 420 && supportedBy.webkit420) ||
- (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 == "copy"){
- command = "cut";
- }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 attr('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;
-
- // 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();
- },
-
- 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);
- }
- },
-
- _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.savedContent");
- if(saveTextarea.value){
- saveTextarea.value += this._SEPARATOR;
- }
- saveTextarea.value += this.name + ":" + 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 false; }
-
- if(!arguments.length){ save = true; }
- this._content = this.getValue();
- var changed = (this.savedContent != this._content);
-
- // 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 = save ? this._content : this.savedContent;
- dojo.destroy(this.domNode);
- this.domNode = this.textarea;
- }else{
- // if(save){
- // why we treat moz differently? comment out to fix #1061
- // if(dojo.isMoz){
- // var nc = dojo.doc.createElement("span");
- // this.domNode.appendChild(nc);
- // nc.innerHTML = this.editNode.innerHTML;
- // }else{
- // this.domNode.innerHTML = this._content;
- // }
- // }
-
- // Note that this destroys the iframe
- this.domNode.innerHTML = save ? this._content : this.savedContent;
- }
- 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;
-
- return changed; // Boolean: whether the content has been modified
- },
-
- destroy: function(){
- if(!this.isClosed){ this.close(false); }
- this.inherited(arguments);
- },
-
- _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, '');
- 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;
- },
-
- 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
- }
-});
-
-}
-
-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,
- {
-
- // 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; });
- 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);
- }
- },
-
- 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.focus(last ? "end" : "start");
- this.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
- },
-
- _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.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 ],
- {
- // summary:
- // A spacer between two `dijit.Toolbar` items
- templateString: '<div class="dijitToolbarSeparator dijitInline" waiRole="presentation"></div>',
- postCreate: function(){ 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");
-
-
-
-
-
-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" waiRole="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.connectKeyNavHandlers(
- this.isLeftToRight() ? [dojo.keys.LEFT_ARROW] : [dojo.keys.RIGHT_ARROW],
- this.isLeftToRight() ? [dojo.keys.RIGHT_ARROW] : [dojo.keys.LEFT_ARROW]
- );
- this.inherited(arguments);
- },
-
- startup: function(){
- if(this._started){ return; }
-
- this.startupKeyNavChildren();
-
- this.inherited(arguments);
- }
-}
-);
-
-// For back-compat, remove for 2.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.
-
- // _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. Set to 0 for no max height.
- // any dropdown taller than this will have scrollbars
- 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; }
-
- 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){
- // 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);
- }
- },
-
- _setupDropdown: function(){
- // summary:
- // set up nodes and connect our mouse and keypress events
- this._buttonNode = this._buttonNode || this.focusNode || this.domNode;
- this._popupStateNode = this._popupStateNode || this.focusNode || this._buttonNode;
- this._aroundNode = this._aroundNode || this.domNode;
- this.connect(this._buttonNode, "onmousedown", "_onDropDownMouseDown");
- this.connect(this._buttonNode, "onclick", "_onDropDownClick");
- this.connect(this._buttonNode, "onkeydown", "_onDropDownKeydown");
- this.connect(this._buttonNode, "onkeyup", "_onKey");
-
- // If we have a _setStateClass function (which happens when
- // we are a form widget), then we need to connect our open/close
- // functions to it
- if(this._setStateClass){
- this.connect(this, "openDropDown", "_setStateClass");
- this.connect(this, "closeDropDown", "_setStateClass");
- }
-
- // 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(){
- this._setupDropdown();
- this.inherited(arguments);
- },
-
- destroyDescendants: 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);
- },
-
- _onDropDownKeydown: function(/*Event*/ e){
- if(e.keyCode == dojo.keys.DOWN_ARROW || e.keyCode == dojo.keys.ENTER || e.keyCode == dojo.keys.SPACE){
- e.preventDefault(); // stop IE screen jump
- }
- },
-
- _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;
- if(d && this._opened && d.handleKey){
- if(d.handleKey(e) === false){ return; }
- }
- if(d && this._opened && e.keyCode == dojo.keys.ESCAPE){
- this.toggleDropDown();
- }else if(d && !this._opened &&
- (e.keyCode == dojo.keys.DOWN_ARROW || e.keyCode == dojo.keys.ENTER || e.keyCode == dojo.keys.SPACE)){
- this.toggleDropDown();
- if(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
-
- this.closeDropDown();
- // don't focus on button. the user has explicitly focused on something else.
- 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
- // tags:
- // protected
-
- loadCallback();
- },
-
- toggleDropDown: function(){
- // summary:
- // Toggle the drop-down widget; if it is up, close it, if not, open it
- // tags:
- // protected
-
- if(this.disabled || this.readOnly){ return; }
- this.focus();
- var dropDown = this.dropDown;
- if(!dropDown){ 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 - it returns the
- // return value of dijit.popup.open
- // tags:
- // protected
-
- var dropDown = this.dropDown;
- var ddNode = dropDown.domNode;
- var 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){
- dijit.popup.moveOffScreen(ddNode);
- 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);
-
- // Get size of drop down, and determine if vertical scroll bar needed
- var mb = dojo.marginBox(ddNode);
- var overHeight = (this.maxHeight && mb.h > this.maxHeight);
- dojo.style(ddNode, {
- overflowX: "hidden",
- overflowY: overHeight ? "auto" : "hidden"
- });
- if(overHeight){
- mb.h = this.maxHeight;
- if("w" in mb){
- mb.w += 16; // room for vertical scrollbar
- }
- }else{
- delete mb.h;
- }
- delete mb.t;
- delete mb.l;
-
- // Adjust dropdown width to match or be larger than my width
- if(this.forceWidth){
- mb.w = this.domNode.offsetWidth;
- }else if(this.autoWidth){
- mb.w = Math.max(mb.w, this.domNode.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: this._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;
- self.state = "";
- }
- });
- dojo.attr(this._popupStateNode, "popupActive", "true");
- dojo.addClass(self._popupStateNode, "dijitHasDropDownOpen");
- this._opened=true;
- this.state="Opened";
- // 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
- // tags:
- // protected
-
- if(this._opened){
- if(focus){ this.focus(); }
- dijit.popup.close(this.dropDown);
- this._opened = false;
- this.state = "";
- }
- }
-
- }
-);
-
-}
-
-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.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\twaiRole=\"button\" waiState=\"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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),
-
- attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
- value: "valueNode",
- iconClass: { node: "iconNode", type: "class" }
- }),
-
-
- _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
- }
- },
-
- _fillContent: function(/*DomNode*/ source){
- // Overrides _Templated._fillContent().
- // If button label is specified as srcNodeRef.innerHTML rather than
- // this.params.label, handle it here.
- if(source && (!this.params || !("label" in this.params))){
- this.set('label', source.innerHTML);
- }
- },
-
- postCreate: function(){
- dojo.setSelectable(this.focusNode, false);
- this.inherited(arguments);
- },
-
- _setShowLabelAttr: function(val){
- if(this.containerNode){
- dojo.toggleClass(this.containerNode, "dijitDisplayNone", !val);
- }
- this.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 attr('label', ...) to work.
- // description:
- // Set the label (text) of the button; takes an HTML string.
- this.containerNode.innerHTML = this.label = content;
- if(this.showLabel == false && !this.params.title){
- this.titleNode.title = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
- }
- }
-});
-
-
-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\twaiRole=\"button\" waiState=\"haspopup-true,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\"\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){
- var dropDownNode = dojo.query("[widgetId]", this.dropDownContainer)[0];
- this.dropDown = dijit.byNode(dropDownNode);
- delete this.dropDownContainer;
- }
- dijit.popup.moveOffScreen(this.dropDown.domNode);
-
- 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.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' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"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\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"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\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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"
-
- 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.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);
- }
-});
-
-}
-
-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.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=[];
- },
-
- // 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,
-
- 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);
- }
- }
- },
-
- 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; }
- if(this.button){
- try{
- enabled = 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);
- }
-});
-
-}
-
-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.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
- // summary:
- // This plugin tries to make all browsers behave consistently w.r.t
- // displaying paragraphs, specifically dealing with when the user presses
- // the ENTER key.
- //
- // It deals mainly with how the text appears on the screen (specifically
- // address the double-spaced line problem on IE), but also has some code
- // to normalize what attr('value') returns.
- //
- // description:
- // This plugin has three modes:
- //
- // * blockModeForEnter=BR
- // * blockModeForEnter=DIV
- // * blockModeForEnter=P
- //
- // In blockModeForEnter=P, the ENTER key semantically means "start a new
- // paragraph", whereas shift-ENTER means "new line in the current paragraph".
- // For example:
- //
- // | first paragraph <shift-ENTER>
- // | second line of first paragraph <ENTER>
- // |
- // | second paragraph
- //
- // In the other two modes, the ENTER key means to go to a new line in the
- // current paragraph, and users [visually] 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.
- //
- // blockNodeForEnter=BR
- // --------------------
- // On IE, typing the above keystrokes in the editor will internally produce DOM of:
- //
- // | <p>one</p>
- // | <p>two</p>
- // | <p>three</p>
- // | <p></p>
- // | <p>four</p>
- // | <p>five</p>
- // | <p>six</p>
- //
- // However, blockNodeForEnter=BR makes the Editor on IE display like other browsers, by
- // changing the CSS for the <p> node to not have top/bottom margins,
- // thus eliminating the double-spaced appearance.
- //
- // Also, attr('value') when used w/blockNodeForEnter=br on IE will return:
- //
- // | <p> one <br> two <br> three </p>
- // | <p> four <br> five <br> six </p>
- //
- // This output normalization implemented by a filter when the
- // editor writes out it's data, to convert consecutive <p>
- // nodes into a single <p> node with internal <br> separators.
- //
- // There's also a pre-filter to mirror the post-filter.
- // It converts a single <p> with <br> line breaks
- // into separate <p> nodes, and creates empty <p> nodes for spacing
- // between paragraphs.
- //
- // On FF typing the above keystrokes will internally generate:
- //
- // | one <br> two <br> three <br> <br> four <br> five <br> six <br>
- //
- // And on Safari it will generate:
- //
- // | "one"
- // | <div>two</div>
- // | <div>three</div>
- // | <div><br></div>
- // | <div>four</div>
- // | <div>five</div>
- // | <div>six</div>
- //
- // Thus, Safari and FF already look correct although semantically their content is a bit strange.
- // On Safari or Firefox blockNodeForEnter=BR uses the builtin editor command "insertBrOnReturn",
- // but that doesn't seem to do anything.
- // Thus, attr('value') on safari/FF returns the browser-specific HTML listed above,
- // rather than the semantically meaningful value that IE returns: <p>one<br>two</p> <p>three<br>four</p>.
- //
- // (Note: originally based on http://bugs.dojotoolkit.org/ticket/2859)
- //
- // blockNodeForEnter=P
- // -------------------
- // Plugin will monitor keystrokes and update the editor's content on the fly,
- // so that the ENTER key will create a new <p> on FF and Safari (it already
- // works that way by default on IE).
- //
- // blockNodeForEnter=DIV
- // ---------------------
- // Follows the same code path as blockNodeForEnter=P but inserting a <div>
- // on ENTER key. Although it produces strange internal DOM, like this:
- //
- // | <div>paragraph one</div>
- // | <div>paragraph one, line 2</div>
- // | <div>&nbsp;</div>
- // | <div>paragraph two</div>
- //
- // it does provide a consistent look on all browsers, and the on-the-fly DOM updating
- // can be useful for collaborative editing.
-
- // 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.
- //
- // See class description for more details.
- blockNodeForEnter: 'BR',
-
- constructor: function(args){
- if(args){
- dojo.mixin(this,args);
- }
- },
-
- setEditor: function(editor){
- // Overrides _Plugin.setEditor().
- this.editor = editor;
- if(this.blockNodeForEnter == 'BR'){
- if(dojo.isIE){
- editor.contentDomPreFilters.push(dojo.hitch(this, "regularPsToSingleLinePs"));
- editor.contentDomPostFilters.push(dojo.hitch(this, "singleLinePsToRegularPs"));
- editor.onLoadDeferred.addCallback(dojo.hitch(this, "_fixNewLineBehaviorForIE"));
- }else{
- editor.onLoadDeferred.addCallback(dojo.hitch(this,function(d){
- try{
- this.editor.document.execCommand("insertBrOnReturn", false, true);
- }catch(e){}
- return d;
- }));
- }
- }else if(this.blockNodeForEnter){
- // add enter key handler
- // FIXME: need to port to the new event code!!
- dojo['require']('dijit._editor.range');
- 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, doc=this.editor.document,br;
- 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(!e.shiftKey && 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)){
- if(e.shiftKey){
- 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{
- dojo.place(br, header, "before");
- }
- }else if(dijit.range.atEndOfContainer(header, range.startContainer, range.startOffset)){
- newrange = dijit.range.create(this.editor.window);
- br=doc.createElement('br');
- if(e.shiftKey){
- header.appendChild(br);
- header.appendChild(doc.createTextNode('\xA0'));
- newrange.setStart(header.lastChild,0);
- }else{
- dojo.place(br, header, "after");
- newrange.setStartAfter(header);
- }
-
- selection.removeAllRanges();
- selection.addRange(newrange);
- }else{
- return true; // let browser handle
- }
- }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);
- if(dijit.range.atEndOfContainer(block.blockNode, range.endContainer, range.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.
- var rs = range.startContainer;
- if(rs && rs.nodeType == 3){
- // Text node, we have to split it.
- var nodeToMove, tNode;
- var txt = rs.nodeValue;
- var startNode = doc.createTextNode(txt.substring(0, range.startOffset));
- var endNode = doc.createTextNode(txt.substring(range.startOffset, 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;
- }
- }
- }
-
- 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 = "";
- }
- 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);
- 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;
- },
-
- 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;
- }
- },
- _fixNewLineBehaviorForIE: function(d){
- // summary:
- // Insert CSS so <p> nodes don't have spacing around them,
- // thus hiding the fact that ENTER key on IE is creating new
- // paragraphs
-
- // cannot use !important since there may be custom user styling;
- var doc = this.editor.document;
- if(doc.__INSERTED_EDITIOR_NEWLINE_CSS === undefined){
- var style = dojo.create("style", {type: "text/css"}, doc.getElementsByTagName("head")[0]);
- style.styleSheet.cssText = "p{margin:0;}"; // cannot use !important since there may be custom user styling;
- this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS = true;
- }
- return d;
- },
- regularPsToSingleLinePs: function(element, noWhiteSpaceInEmptyP){
- // summary:
- // Converts a <p> node containing <br>'s into multiple <p> nodes.
- // description:
- // See singleLinePsToRegularPs(). This method does the
- // opposite thing, and is used as a pre-filter when loading the
- // editor, to mirror the effects of the post-filter at end of edit.
- // tags:
- // private
- function wrapLinesInPs(el){
- // move "lines" of top-level text nodes into ps
- function wrapNodes(nodes){
- // nodes are assumed to all be siblings
- var newP = nodes[0].ownerDocument.createElement('p'); // FIXME: not very idiomatic
- nodes[0].parentNode.insertBefore(newP, nodes[0]);
- dojo.forEach(nodes, function(node){
- newP.appendChild(node);
- });
- }
-
- var currentNodeIndex = 0;
- var nodesInLine = [];
- var currentNode;
- while(currentNodeIndex < el.childNodes.length){
- currentNode = el.childNodes[currentNodeIndex];
- if( currentNode.nodeType==3 || // text node
- (currentNode.nodeType==1 && currentNode.nodeName!='BR' && dojo.style(currentNode, "display")!="block")
- ){
- nodesInLine.push(currentNode);
- }else{
- // hit line delimiter; process nodesInLine if there are any
- var nextCurrentNode = currentNode.nextSibling;
- if(nodesInLine.length){
- wrapNodes(nodesInLine);
- currentNodeIndex = (currentNodeIndex+1)-nodesInLine.length;
- if(currentNode.nodeName=="BR"){
- dojo.destroy(currentNode);
- }
- }
- nodesInLine = [];
- }
- currentNodeIndex++;
- }
- if(nodesInLine.length){ wrapNodes(nodesInLine); }
- }
-
- function splitP(el){
- // split a paragraph into seperate paragraphs at BRs
- var currentNode = null;
- var trailingNodes = [];
- var lastNodeIndex = el.childNodes.length-1;
- for(var i=lastNodeIndex; i>=0; i--){
- currentNode = el.childNodes[i];
- if(currentNode.nodeName=="BR"){
- var newP = currentNode.ownerDocument.createElement('p');
- dojo.place(newP, el, "after");
- if(trailingNodes.length==0 && i != lastNodeIndex){
- newP.innerHTML = "&nbsp;"
- }
- dojo.forEach(trailingNodes, function(node){
- newP.appendChild(node);
- });
- dojo.destroy(currentNode);
- trailingNodes = [];
- }else{
- trailingNodes.unshift(currentNode);
- }
- }
- }
-
- var pList = [];
- var ps = element.getElementsByTagName('p');
- dojo.forEach(ps, function(p){ pList.push(p); });
- dojo.forEach(pList, function(p){
- var prevSib = p.previousSibling;
- if( (prevSib) && (prevSib.nodeType == 1) &&
- (prevSib.nodeName == 'P' || dojo.style(prevSib, 'display') != 'block')
- ){
- var newP = p.parentNode.insertBefore(this.document.createElement('p'), p);
- // this is essential to prevent IE from losing the P.
- // if it's going to be innerHTML'd later we need
- // to add the &nbsp; to _really_ force the issue
- newP.innerHTML = noWhiteSpaceInEmptyP ? "" : "&nbsp;";
- }
- splitP(p);
- },this.editor);
- wrapLinesInPs(element);
- return element;
- },
-
- singleLinePsToRegularPs: function(element){
- // summary:
- // Called as post-filter.
- // Apparently collapses adjacent <p> nodes into a single <p>
- // nodes with <br> separating each line.
- //
- // example:
- // Given this input:
- // | <p>line 1</p>
- // | <p>line 2</p>
- // | <ol>
- // | <li>item 1
- // | <li>item 2
- // | </ol>
- // | <p>line 3</p>
- // | <p>line 4</p>
- //
- // Will convert to:
- // | <p>line 1<br>line 2</p>
- // | <ol>
- // | <li>item 1
- // | <li>item 2
- // | </ol>
- // | <p>line 3<br>line 4</p>
- //
- // Not sure why this situation would even come up after the pre-filter and
- // the enter-key-handling code.
- //
- // tags:
- // private
-
- function getParagraphParents(node){
- // summary:
- // Used to get list of all nodes that contain paragraphs.
- // Seems like that would just be the very top node itself, but apparently not.
- var ps = node.getElementsByTagName('p');
- var parents = [];
- for(var i=0; i<ps.length; i++){
- var p = ps[i];
- var knownParent = false;
- for(var k=0; k < parents.length; k++){
- if(parents[k] === p.parentNode){
- knownParent = true;
- break;
- }
- }
- if(!knownParent){
- parents.push(p.parentNode);
- }
- }
- return parents;
- }
-
- function isParagraphDelimiter(node){
- return (!node.childNodes.length || node.innerHTML=="&nbsp;");
- }
-
- var paragraphContainers = getParagraphParents(element);
- for(var i=0; i<paragraphContainers.length; i++){
- var container = paragraphContainers[i];
- var firstPInBlock = null;
- var node = container.firstChild;
- var deleteNode = null;
- while(node){
- if(node.nodeType != 1 || node.tagName != 'P' ||
- (node.getAttributeNode('style') || {/*no style*/}).specified){
- firstPInBlock = null;
- }else if(isParagraphDelimiter(node)){
- deleteNode = node;
- firstPInBlock = null;
- }else{
- if(firstPInBlock == null){
- firstPInBlock = node;
- }else{
- if( (!firstPInBlock.lastChild || firstPInBlock.lastChild.nodeName != 'BR') &&
- (node.firstChild) &&
- (node.firstChild.nodeName != 'BR')
- ){
- firstPInBlock.appendChild(this.editor.document.createElement('br'));
- }
- while(node.firstChild){
- firstPInBlock.appendChild(node.firstChild);
- }
- deleteNode = node;
- }
- }
- node = node.nextSibling;
- if(deleteNode){
- dojo.destroy(deleteNode);
- deleteNode = null;
- }
- }
- }
- return element;
- }
-});
-
-}
-
-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.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: 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: 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");
- }
- },
-
- 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);
- }
-
- // 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);
-
- 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 only enable customUndo for IE, as it
- // has broken native undo/redo support. Note: the implementation does
- // support other browsers which have W3C DOM2 Range API implemented.
- // It was also enabled on WebKit, to fix undo/redo enablement. (#9613)
- customUndo: dojo.isIE || dojo.isWebKit,
-
- // 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);
- }
- },
- _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;
- try{
- r = this.inherited('execCommand', arguments);
- if(dojo.isWebKit && cmd == 'paste' && !r){ //see #4598: safari does not support invoking paste 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 */ && /copy|cut|paste/.test(cmd)){
- // 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('queryCommandEnabled',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){
- 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){
- // 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.savedContent, 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('_onBlur',arguments);
- this.endEditing(true);
- },
- _saveSelection: function(){
- // summary:
- // Save the currently selected text in _savedSelection attribute
- // tags:
- // private
- this._savedSelection=this._getBookmark();
- //console.log('save selection',this._savedSelection,this);
- },
- _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);
- },
-
- _setDisabledAttr: function(/*Boolean*/ value){
- if(!this.disabled && value){
- // Disable editor: disable all enabled buttons and remember that list
- this._buttonEnabledPlugins = dojo.filter(this._plugins, function(p){
- if (p && p.button && !p.button.get("disabled")) {
- p.button.set("disabled", true);
- return true;
- }
- return false;
- });
- }else if(this.disabled && !value){
- // Enable editor: we only want to enable the buttons that should be
- // enabled (for example, the outdent button shouldn't be enabled if the current
- // text can't be outdented).
- dojo.forEach(this._buttonEnabledPlugins, function(p){
- p.button.attr("disabled", false);
- p.updateState && p.updateState(); // just in case something changed, like caret position
- });
- }
-
- this.inherited(arguments);
- },
-
- _setStateClass: function(){
- 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"));
- }
- }
- }
-);
-
-// 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;
-});
-
-}
-
-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.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
-}
-
-}
-
-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.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
-};
-
-}
-
-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.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
-};
-
-}
-
-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.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
- }
-
-};
-
-}
-
-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.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}\" waiRole=\"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.toLowerCase() == "input" || ((type == "hidden" || type == "file") && this.templateString == dijit.form.TextBox.prototype.templateString)){
- this.templateString = this._singleNodeTemplate;
- }
- this.inherited(arguments);
- },
-
- _setPlaceHolderAttr: function(v){
- this.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 attr('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 attr('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._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 attr('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 set('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 attr('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.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 attr('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;
- this._setValueAttr(this.get('value'), undefined, value);
- },
-
- 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();
- },
-
- 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
- if(dojo.isIE){ // IE INPUT tag fontFamily has to be set directly using STYLE
- 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;
- }
- }
- }
- }
- }
- this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values shuld be the same
- this.inherited(arguments);
- if(dojo.isMoz || dojo.isOpera){
- this.connect(this.textbox, "oninput", this._onInput);
- }else{
- this.connect(this.textbox, "onkeydown", this._onInput);
- this.connect(this.textbox, "onkeyup", this._onInput);
- this.connect(this.textbox, "onpaste", this._onInput);
- this.connect(this.textbox, "oncut", this._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 attr('value', ...)
- // and attr('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();
-
- this._refreshState();
- this.inherited(arguments);
- },
-
- 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 range = element.createTextRange();
- with(range){
- collapse(true);
- moveStart("character", -99999); // move to 0
- moveStart("character", start); // delta from 0 is the correct position
- moveEnd("character", stop-start);
- select();
- }
- }
- }else if(_window["getSelection"]){
- if(element.setSelectionRange){
- element.setSelectionRange(start, stop);
- }
- }
-};
-
-}
-
-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.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\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></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;
- }
-
- 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){
- // summary:
- // Private function to set CSS for tooltip node based on which position it's in.
- // This is called by the dijit popup code.
- // tags:
- // protected
-
- 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];
- },
-
- _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: [const] String[]
- // Id's of domNodes to attach the tooltip to.
- // When user hovers over any of the specified dom nodes, the tooltip will appear.
- //
- // Note: Currently connectId can only be specified on initialization, it cannot
- // be changed via attr('connectId', ...)
- //
- // Note: in 2.0 this will be renamed to connectIds for less confusion.
- connectId: [],
-
- // position: String[]
- // See description of `dijit.Tooltip.defaultPosition` for details on position parameter.
- position: [],
-
- constructor: function(){
- // Map id's of nodes I'm connected to to a list of the this.connect() handles
- this._nodeConnectionsById = {};
- },
-
- _setConnectIdAttr: function(newIds){
- for(var oldId in this._nodeConnectionsById){
- this.removeTarget(oldId);
- }
- dojo.forEach(dojo.isArrayLike(newIds) ? newIds : [newIds], this.addTarget, this);
- },
-
- _getConnectIdAttr: function(){
- var ary = [];
- for(var id in this._nodeConnectionsById){
- ary.push(id);
- }
- return ary;
- },
-
- addTarget: function(/*DOMNODE || String*/ id){
- // summary:
- // Attach tooltip to specified node, if it's not already connected
- var node = dojo.byId(id);
- if(!node){ return; }
- if(node.id in this._nodeConnectionsById){ return; }//Already connected
-
- this._nodeConnectionsById[node.id] = [
- this.connect(node, "onmouseenter", "_onTargetMouseEnter"),
- this.connect(node, "onmouseleave", "_onTargetMouseLeave"),
- this.connect(node, "onfocus", "_onTargetFocus"),
- this.connect(node, "onblur", "_onTargetBlur")
- ];
- },
-
- removeTarget: function(/*DOMNODE || String*/ node){
- // summary:
- // Detach tooltip from specified node
-
- // map from DOMNode back to plain id string
- var id = node.id || node;
-
- if(id in this._nodeConnectionsById){
- dojo.forEach(this._nodeConnectionsById[id], this.disconnect, this);
- delete this._nodeConnectionsById[id];
- }
- },
-
- postCreate: function(){
- 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"];
-
-}
-
-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.__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}\" waiRole=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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.
- // 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_$",
-
- // 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, Warning, or Error)
- state: "",
-
- // tooltipPosition: String[]
- // See description of `dijit.Tooltip.defaultPosition` for details on this parameter.
- tooltipPosition: [],
-
- _setValueAttr: function(){
- // summary:
- // Hook so attr('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 /^\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 && !isEmpty && isFocused && this._isValidSubset();
- this.state = ((isValid || ((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "" : "Error";
- if(this.state == "Error"){ this._maskValidSubsetError = isFocused; } // we want the error to show up afer a blur and refocus
- this._setStateClass();
- dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
- if(isFocused){
- if(this.state == "Error"){
- message = this.getErrorMessage(true);
- }else{
- message = this.getPromptMessage(true); // show the prompt whever there's no error
- }
- this._maskValidSubsetError = true; // since we're focused, always mask warnings
- }
- this.displayMessage(message);
- return isValid;
- },
-
- // _message: String
- // Currently displayed message
- _message: "",
-
- displayMessage: function(/*String*/ message){
- // summary:
- // Overridable method to display validation errors/hints.
- // By default uses a tooltip.
- // tags:
- // extension
- if(this._message == message){ return; }
- this._message = message;
- dijit.hideTooltip(this.domNode);
- if(message){
- 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.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.required = value;
- dijit.setWaiState(this.focusNode, "required", value);
- this._refreshState();
- },
-
- reset:function(){
- // Overrides dijit.form.TextBox.reset() by also
- // hiding errors about partial matches
- this._maskValidSubsetError = true;
- this.inherited(arguments);
- },
-
- _onBlur: function(){
- 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 attr('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 + "'" : "") + ">", 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 attr('value', ...) works.
-
- dijit.setWaiState(this.focusNode, "valuenow", value);
- this.inherited(arguments);
- }
- }
-);
-
-}
-
-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.declare(
- "dijit.form.ComboBoxMixin",
- null,
- {
- // 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: 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: [const] 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/ComboBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachPoint=\"comboNode\" waiRole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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\tdojoAttachEvent=\"onkeypress:_onKeyPress,compositionend\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t/></div\n></div>\n"),
-
- baseClass: "dijitTextBox dijitComboBox",
-
- // Set classes like dijitDownArrowButtonHover depending on
- // mouse action over button node
- cssStateNodes: {
- "downArrowNode": "dijitDownArrowButton"
- },
-
- _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 doesnt 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.comboNode, "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._onKeyPress({charOrCode: 229}); // fake IME key to cause a search
- }), 100); // long delay that will probably be preempted by keyboard input
- }
- this.inherited(arguments);
- },
-
- _onKeyPress: 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 searchFunction = "_startSearchFromInput";
- var pw = this._popupWidget;
- var dk = dojo.keys;
- var highlighted = null;
- this._prev_key_backspace = false;
- this._abortQuery();
- if(this._isShowingNow){
- pw.handleKey(key);
- highlighted = pw.getHighlightedOption();
- }
- switch(key){
- case dk.PAGE_DOWN:
- case dk.DOWN_ARROW:
- case dk.PAGE_UP:
- case dk.UP_ARROW:
- if(!this._isShowingNow){
- doSearch = true;
- searchFunction = "_startSearchAll";
- }else{
- 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:
- // prevent submit, but allow event to bubble
- 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._isShowingNow){
- this._lastQuery = null; // in case results come back later
- this._hideResultList();
- }
- break;
-
- case ' ':
- if(highlighted){
- dojo.stopEvent(evt);
- this._selectOption();
- this._hideResultList();
- }else{
- doSearch = true;
- }
- break;
-
- case dk.ESCAPE:
- if(this._isShowingNow){
- dojo.stopEvent(evt);
- this._hideResultList();
- }
- 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.
- // On IE and safari, IME input produces keycode == 229, and we simulate
- // it on firefox by attaching to compositionend event (see compositionend method)
- 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, searchFunction),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){
- this._fetchHandle = null;
- if( this.disabled ||
- this.readOnly ||
- (dataObject.query[this.searchAttr] != this._lastQuery)
- ){
- return;
- }
- this._popupWidget.clearResultList();
- if(!results.length && !this._maxOptions){ // this condition needs to match !this._isvalid set in FilteringSelect::_openResultList
- this._hideResultList();
- 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._popupWidget.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._popupWidget.highlightFirstOption();
- }else if(-1 == dataObject.direction){
- this._popupWidget.highlightLastOption();
- }
- this._announceOption(this._popupWidget.getHighlightedOption());
- }else if(this.autoComplete && !this._prev_key_backspace /*&& !dataObject.direction*/
- // 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(){
- this._hideResultList();
- // hide the tooltip
- this.displayMessage("");
-
- // Position the list and if it's too big to fit on the screen then
- // size it to the maximum possible height
- // Our dear friend IE doesnt take max-height so we need to
- // calculate that on our own every time
-
- // TODO: want to redo this, see
- // http://trac.dojotoolkit.org/ticket/3272
- // and
- // http://trac.dojotoolkit.org/ticket/4108
-
-
- // natural size of the list has changed, so erase old
- // width/height settings, which were hardcoded in a previous
- // call to this function (via dojo.marginBox() call)
- dojo.style(this._popupWidget.domNode, {width: "", height: ""});
-
- var best = this.open();
- // #3212:
- // only set auto scroll bars if necessary prevents issues with
- // scroll bars appearing when they shouldn't when node is made
- // wider (fractional pixels cause this)
- var popupbox = dojo.marginBox(this._popupWidget.domNode);
- this._popupWidget.domNode.style.overflow =
- ((best.h == popupbox.h) && (best.w == popupbox.w)) ? "hidden" : "auto";
- // #4134:
- // borrow TextArea scrollbar test so content isn't covered by
- // scrollbar and horizontal scrollbar doesn't appear
- var newwidth = best.w;
- if(best.h < this._popupWidget.domNode.scrollHeight){
- newwidth += 16;
- }
- dojo.marginBox(this._popupWidget.domNode, {
- h: best.h,
- w: Math.max(newwidth, this.domNode.offsetWidth)
- });
-
- // If we increased the width of drop down to match the width of ComboBox.domNode,
- // then need to reposition the drop down (wrapper) so (all of) the drop down still
- // appears underneath the ComboBox.domNode
- if(newwidth < this.domNode.offsetWidth){
- this._popupWidget.domNode.parentNode.style.left = dojo.position(this.domNode, true).x + "px";
- }
-
- dijit.setWaiState(this.comboNode, "expanded", "true");
- },
-
- _hideResultList: function(){
- this._abortQuery();
- if(this._isShowingNow){
- dijit.popup.close(this._popupWidget);
- this._isShowingNow=false;
- dijit.setWaiState(this.comboNode, "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._popupWidget;
- 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._hideResultList();
- 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
- // attr('item', value)
- // tags:
- // private
- if(!displayedValue){ displayedValue = this.labelFunc(item, this.store); }
- this.value = this._getValueField() != this.searchAttr? this.store.getIdentity(item) : displayedValue;
- this.item = item;
- dijit.form.ComboBox.superclass._setValueAttr.call(this, 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._popupWidget.nextButton ||
- node == this._popupWidget.previousButton){
- newValue = node.innerHTML;
- this.item = undefined;
- this.value = '';
- }else{
- newValue = this.labelFunc(node.item, this.store);
- 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._hideResultList();
- this._setCaretPos(this.focusNode, this.focusNode.value.length);
- dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true); // set this.value and fire onChange
- },
-
- _onArrowMouseDown: function(evt){
- // summary:
- // Callback when arrow is clicked
- if(this.disabled || this.readOnly){
- return;
- }
- dojo.stopEvent(evt);
- this.focus();
- if(this._isShowingNow){
- this._hideResultList();
- }else{
- // forces full population of results, if they click
- // on the arrow it means they want to see more options
- this._startSearchAll();
- }
- },
-
- _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){
- if(!this._popupWidget){
- var popupId = this.id + "_popup";
- this._popupWidget = new dijit.form._ComboBoxMenu({
- 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);
- dojo.hitch(_this, "_hideResultList")();
- },
- 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._nextSearch = this._popupWidget.onPage = dojo.hitch(this, nextSearch, this._fetchHandle);
- }, query, this), this.searchDelay);
- },
-
- _setMaxOptions: function(size, request){
- this._maxOptions = size;
- },
-
- _getValueField: function(){
- // summmary:
- // 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;
- },
-
- /////////////// Event handlers /////////////////////
-
- // FIXME: For 2.0, rename to "_compositionEnd"
- compositionend: function(/*Event*/ evt){
- // summary:
- // When inputting characters using an input method, such as
- // Asian languages, it will generate this event instead of
- // onKeyDown event.
- // Note: this event is only triggered in FF (not in IE/safari)
- // tags:
- // private
-
- // 229 is the code produced by IE and safari while pressing keys during
- // IME input mode
- this._onKeyPress({charOrCode: 229});
- },
-
- //////////// 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.store.fetchSelectedItem();
- if(item){
- var valueField = this._getValueField();
- this.value = valueField != this.searchAttr? this.store.getValue(item, valueField) : this.labelFunc(item, this.store);
- }
- }
- }
- this.inherited(arguments);
- },
-
- postCreate: function(){
- // summary:
- // Subclasses must call this method from their postCreate() methods
- // tags:
- // protected
-
- if(!this.hasDownArrow){
- this.downArrowNode.style.display = "none";
- }
-
- // 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");
- var cn=this.comboNode;
- dijit.setWaiState(cn, "labelledby", label[0].id);
-
- }
- this.inherited(arguments);
- },
-
- uninitialize: function(){
- if(this._popupWidget && !this._popupWidget._destroyed){
- this._hideResultList();
- this._popupWidget.destroy();
- }
- this.inherited(arguments);
- },
-
- _getMenuLabelFromItem: function(/*Item*/ item){
- var label = this.labelAttr? this.store.getValue(item, this.labelAttr) : this.labelFunc(item, this.store);
- var 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 occurence found. Override this method
- // to implement your custom highlighing.
- // tags:
- // protected
-
- // Add greedy when this.highlightMatch == "all"
- var modifiers = "i"+(this.highlightMatch == "all"?"g":"");
- var escapedLabel = this._escapeHtml(label);
- find = dojo.regexp.escapeString(find); // escape regexp special chars
- var ret = escapedLabel.replace(new RegExp("(^|\\s)("+ find +")", modifiers),
- '$1<span class="dijitComboBoxHighlightMatch">$2</span>');
- return ret;// 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
- },
-
- open: function(){
- // summary:
- // Opens the drop down menu. TODO: rename to _open.
- // tags:
- // private
- this._isShowingNow=true;
- return dijit.popup.open({
- popup: this._popupWidget,
- around: this.domNode,
- parent: this
- });
- },
-
- 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.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' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"
- +"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"
- +"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRole='option'></li>"
- +"</ul>",
-
- // _messages: Object
- // Holds "next" and "previous" text for paging buttons on drop down
- _messages: null,
-
- baseClass: "dijitComboBoxMenu",
-
- postMixInProperties: function(){
- this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang);
- this.inherited(arguments);
- },
-
- _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
- },
-
- postCreate: function(){
- // fill in template with i18n messages
- this.previousButton.innerHTML = this._messages["previousMessage"];
- this.nextButton.innerHTML = this._messages["nextMessage"];
- this.inherited(arguments);
- },
-
- 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 labelObject = labelFunc(item);
- var menuitem = dojo.doc.createElement("li");
- dijit.setWaiRole(menuitem, "option");
- 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);
- menuitem.className = "dijitReset dijitMenuItem" +
- (this.isLeftToRight() ? "" : " dijitMenuItemRtl");
- 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]);
- }
- },
-
- _onMouseDown: function(/*Event*/ evt){
- dojo.stopEvent(evt);
- },
-
- _onMouseUp: function(/*Event*/ evt){
- if(evt.target === this.domNode || !this._highlighted_option){
- return;
- }else if(evt.target == this.previousButton){
- this.onPage(-1);
- }else if(evt.target == this.nextButton){
- 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(key){
- switch(key){
- case dojo.keys.DOWN_ARROW:
- this._highlightNextOption();
- break;
- case dojo.keys.PAGE_DOWN:
- this.pageDown();
- break;
- case dojo.keys.UP_ARROW:
- this._highlightPrevOption();
- break;
- case dojo.keys.PAGE_UP:
- this.pageUp();
- break;
- }
- }
- }
-);
-
-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 attr('value', value) works.
- // description:
- // Sets the value of the select.
- this.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);
-
-}
-
-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.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)
-
- _isvalid: true,
-
- // required: Boolean
- // True (default) if user is required to enter a value into this field.
- required: true,
-
- _lastDisplayedValue: "",
-
- isValid: function(){
- // Overrides ValidationTextBox.isValid()
- return this._isvalid || (!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 function that dynamically sets the label of the
- // ComboBox
-
- // 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: do nothing 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._isvalid = false;
- this.validate(this._focused);
- this.item = null;
- }else{
- this.set('item', result[0], priorityChange);
- }
- },
-
- _openResultList: function(/*Object*/ results, /*Object*/ dataObject){
- // 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;
- }
- if(this.item === undefined){ // item == undefined for keyboard search
- this._isvalid = results.length != 0 || this._maxOptions != 0; // result.length==0 && maxOptions != 0 implies the nextChoices item selected but then the datastore returned 0 more entries
- this.validate(true);
- }
- dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments);
- },
-
- _getValueAttr: function(){
- // summary:
- // Hook for attr('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 attr('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
- // attr('item', value)
- // tags:
- // private
- this._isvalid = true;
- 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 attr('displayedValue', label) works.
- // description:
- // Sets textbox to display label. Also performs reverse lookup
- // to set the hidden value.
-
- // When this is called during initialization it'll ping the datastore
- // for reverse lookup, and when that completes (after an XHR request)
- // will call setValueAttr()... but that shouldn't trigger an onChange()
- // event, even when it happens after creation has finished
- if(!this._created){
- priorityChange = false;
- }
-
- if(this.store){
- this._hideResultList();
- 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;
- 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);
- }
- },
-
- postMixInProperties: function(){
- this.inherited(arguments);
- this._isvalid = !this.required;
- },
-
- undo: function(){
- this.set('displayedValue', this._lastDisplayedValue);
- }
- }
-);
-
-}
-
-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 == 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:'May 14, 1802'});
- // | 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(!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:'July 18, 1918'}] }
- // into this:
- // { name:['Kermit'], born:(new Date('July 18, 1918')) }
- //
- // 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){
- item = this._itemsByIdentity[identity];
- }else{
- item = this._arrayOfAllItems[identity];
- }
- if(item === undefined){
- item = null;
- }
- return item; // Object
- },
-
- getIdentityAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Identity.getIdentifierAttributes()
-
- 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 == 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["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.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 misin 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){
- 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);
- }
-
- // Enable custom undo for webkit, needed for noFormat to work properly
- // and still undo.
- this.editor.customUndo = this.editor.customUndo || dojo.isWebKit;
- });
- },
-
- 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 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
- });
- }
-});
-
-}
-
-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");
-
-
-
-
-/*=====
-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: 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 opens the click the button.
- // 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, or 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);
- });
- 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.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){
- var cb = function(items){
- 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(items);
- }
- // 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);
- };
- var opts = dojo.mixin({onComplete:cb, scope: this}, fetchArgs);
- this._loadingStore = true;
- store.fetch(opts);
- }else{
- delete this._fetchedWith;
- }
- return oStore; // dojo.data.api.Identity
- },
-
- _setValueAttr: function(/*anything*/ newValue, /*Boolean, optional*/ 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.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];
- },
-
- _getValueDeprecated: false, // remove when _FormWidget:getValue is removed
- getValue: function(){
- // summary:
- // get the value of the widget.
- return this._lastValue;
- },
-
- undo: function(){
- // summary:
- // restore the value to the last value passed to onChange
- this._setValueAttr(this._lastValueReported, false);
- },
-
- _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.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);
- }
- this._handleOnChange(this.value);
- },
-
- _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;
- },
-
- _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("value"),
- label: String(node.innerHTML),
- selected: node.getAttribute("selected") || false,
- disabled: node.getAttribute("disabled") || false };
- }, this) : [];
- }
- if(!this.value){
- this.value = this._getValueFromOpts();
- }else if(this.multiple && typeof this.value == "string"){
- this.value = this.value.split(",");
- }
- },
-
- postCreate: function(){
- // summary:
- // sets up our event handling that we need for functioning
- // as a select
- dojo.setSelectable(this.focusNode, false);
- 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
- }
-});
-
-}
-
-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\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"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);
- }
- },
-
- postCreate: function(){
- this.inherited(arguments);
- dojo.setSelectable(this.domNode, false);
- 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);
- },
-
- _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);
-
- // _onUnhover() is called when the menu is hidden (collapsed), due to clicking
- // a MenuItem and having it execut. When that happens, FF and IE don't generate
- // an onmouseout event for the MenuItem, so give _CssStateMixin some help
- this._hovering = false;
- this._setStateClass();
- },
-
- _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.
- this.disabled = value;
- dijit.setWaiState(this.focusNode, 'disabled', value ? 'true' : 'false');
- },
- _setAccelKeyAttr: function(/*String*/ value){
- // summary:
- // Hook for attr('accelKey', ...) to work.
- // Set accelKey on this menu item.
- this.accelKey=value;
-
- 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");
- }
- });
-
-}
-
-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\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"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.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"),
-
- postCreate: function(){
- 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");
-
-
-
-
-
-
-
-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.addClass(this.domNode, "dijitMenuActive");
- dojo.removeClass(this.domNode, "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.removeClass(this.domNode, "dijitMenuActive");
- dojo.addClass(this.domNode, "dijitMenuPassive");
- },
-
- 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.focusedChild){ // unhighlight the focused item
- this.focusedChild._setSelected(false);
- this.focusedChild._onUnhover();
- this.focusedChild = null;
- }
- if(this.currentPopup){
- // Close all popups that are open and descendants of this menu
- dijit.popup.close(this.currentPopup);
- this.currentPopup = 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\" waiRole=\"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 attr('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);
- }
-}
-);
-
-// Back-compat (TODO: remove in 2.0)
-
-
-
-
-
-
-}
-
-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.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);
- },
- 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\twaiRole=\"combobox\" waiState=\"haspopup-true\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" waiRole=\"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}\" waiState=\"hidden-true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"titleNode\" waiRole=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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: "",
-
- // tooltipPosition: String[]
- // See description of dijit.Tooltip.defaultPosition for details on this parameter.
- tooltipPosition: [],
-
- // emptyLabel: string
- // What to display in an "empty" dropdown
- emptyLabel: "",
-
- // _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);
- if(this.options.length && !this.value && this.srcNodeRef){
- var si = this.srcNodeRef.selectedIndex;
- this.value = this.options[si != -1 ? 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){
- // 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,
- 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();
- }
-
- var len = this.options.length;
- 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)
- this.containerNode.innerHTML = '<span class="dijitReset dijitInline ' + this.baseClass + 'Label">' +
- (newDisplay || this.emptyLabel || "&nbsp;") +
- '</span>';
- dijit.setWaiState(this.focusNode, "valuetext", (newDisplay || this.emptyLabel || "&nbsp;") );
- },
-
- 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.state = isValid ? "" : "Error";
- this._setStateClass();
- dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
- var message = isValid ? "" : this._missingMsg;
- if(this._message !== message){
- this._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 || !(/^\s*$/.test(this.value)));
- },
-
- reset: function(){
- // summary:
- // Overridden so that the state will be cleared.
- this.inherited(arguments);
- dijit.hideTooltip(this.domNode);
- this.state = "";
- this._setStateClass();
- delete this._message;
- },
-
- postMixInProperties: function(){
- // summary:
- // set the missing message
- this.inherited(arguments);
- this._missingMsg = dojo.i18n.getLocalization("dijit.form", "validate",
- this.lang).missingMessage;
- },
-
- postCreate: function(){
- this.inherited(arguments);
- if(this.tableNode.style.width){
- dojo.addClass(this.domNode, this.baseClass + "FixedWidth");
- }
- },
-
- 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);
- }
-});
-
-}
-
-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.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/]+(?:\\?[^?#\\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('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){ //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){
- // 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;
- }
-});
-
-}
-
-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.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\" waiRole=\"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);
- }
- }
-});
-
-}
-
-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.declare("dijit._MenuBarItemMixin", null, {
- templateString: dojo.cache("dijit", "templates/MenuBarItem.html", "<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" dojoAttachPoint=\"focusNode\" waiRole=\"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)
-
-});
-
-}
-
-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.declare("dijit.PopupMenuBarItem", [dijit.PopupMenuItem, dijit._MenuBarItemMixin], {
- // summary:
- // Item in a MenuBar like "File" or "Edit", that spawns a submenu when pressed (or hovered)
-});
-
-
-}
-
-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.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
-}
-
-}
-
-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], {
- // summary:
- // A progress indication widget, showing the amount completed
- // (often the percentage completed) of a task.
- //
- // example:
- // | <div dojoType="ProgressBar"
- // | places="0"
- // | progress="..." maximum="...">
- // | </div>
- //
- // description:
- // Note that the progress bar is updated via (a non-standard)
- // update() method, rather than via attr() like other widgets.
-
- // progress: [const] 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
- // TODO: rename to value for 2.0
- progress: "0",
-
- // 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.
- indeterminate: false,
-
- // 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\"\n\t><div waiRole=\"progressbar\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</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"),
-
- // public functions
- postCreate: function(){
- this.inherited(arguments);
- this.indeterminateHighContrastImage.setAttribute("src",
- this._indeterminateHighContrastImagePath.toString());
- this.update();
- },
-
- update: function(/*Object?*/attributes){
- // summary:
- // Change attributes of ProgressBar, similar to attr(hash).
- //
- // 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});
-
- // TODO: deprecate this method and use set() instead
-
- dojo.mixin(this, attributes || {});
- var tip = this.internalProgress;
- var percent = 1, classFunc;
- if(this.indeterminate){
- classFunc = "addClass";
- dijit.removeWaiState(tip, "valuenow");
- dijit.removeWaiState(tip, "valuemin");
- dijit.removeWaiState(tip, "valuemax");
- }else{
- classFunc = "removeClass";
- 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;
- }
- var text = this.report(percent);
- this.label.firstChild.nodeValue = text;
- dijit.setWaiState(tip, "describedby", this.label.id);
- dijit.setWaiState(tip, "valuenow", this.progress);
- dijit.setWaiState(tip, "valuemin", 0);
- dijit.setWaiState(tip, "valuemax", this.maximum);
- }
- dojo[classFunc](this.domNode, "dijitProgressBarIndeterminate");
- tip.style.width = (percent * 100) + "%";
- this.onChange();
- },
-
- _setValueAttr: function(v){
- if(v == Infinity){
- this.update({indeterminate:true});
- }else{
- this.update({indeterminate:false, progress:v});
- }
- },
-
- _getValueAttr: function(){
- return this.progress;
- },
-
- report: function(/*float*/percent){
- // summary:
- // Generates message to show inside progress bar (normally indicating amount of task completed).
- // May be overridden.
- // tags:
- // extension
-
- return dojo.number.format(percent, { type: "percent", places: this.places, locale: this.lang });
- },
-
- onChange: function(){
- // summary:
- // Callback fired when progress updates.
- // tags:
- // progress
- }
-});
-
-}
-
-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.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\" waiRole=\"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\" waiRole=\"presentation\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\" waiRole=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\" 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:""
- }),
-
- postCreate: function(){
- if(!this.open){
- this.hideNode.style.display = this.wipeNode.style.display = "none";
- }
-
- // 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");
- }
- this._setCss();
- dojo.setSelectable(this.titleNode, false);
-
- // 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";
- }
- });
- this.inherited(arguments);
- },
-
- _setOpenAttr: function(/* Boolean */ open){
- // summary:
- // Hook to make attr("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.
- if(this.open !== open){ this.toggle(); }
- dijit.setWaiState(this.containerNode,"hidden", this.open ? "false" : "true");
- dijit.setWaiState(this.focusNode, "pressed", this.open ? "true" : "false");
- },
-
- _setToggleableAttr: function(/* Boolean */ canToggle){
- // summary:
- // Hook to make attr("canToggle", boolean) work.
- // canToggle: Boolean
- // True to allow user to open/close pane by clicking title bar.
- this.toggleable = canToggle;
- dijit.setWaiRole(this.focusNode, canToggle ? "button" : "heading");
- if(canToggle){
- // TODO: if canToggle is switched from true 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._setCss();
- },
-
- _setContentAttr: function(content){
- // summary:
- // Hook to make attr("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
-
- dojo.forEach([this._wipeIn, this._wipeOut], function(animation){
- if(animation && animation.status() == "playing"){
- animation.stop();
- }
- });
-
- var anim = this[this.open ? "_wipeOut" : "_wipeIn"]
- if(anim){
- anim.play();
- }else{
- this.hideNode.style.display = this.open ? "" : "none";
- }
- this.open =! this.open;
-
- // 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.open){
- this._onShow();
- }else{
- this.onHide();
- }
-
- this._setCss();
- },
-
- _setCss: function(){
- // summary:
- // Set the open/close css state for the TitlePane
- // tags:
- // private
-
- var node = this.titleBarNode || this.focusNode;
-
- if(this._titleBarClass){
- dojo.removeClass(node, this._titleBarClass);
- }
- this._titleBarClass = "dijit" + (this.toggleable ? "" : "Fixed") + (this.open ? "Open" : "Closed");
- dojo.addClass(node, this._titleBarClass);
- 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);
- }
-});
-
-}
-
-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["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.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;
-};
-
-}
-
-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], insertIndex: insertIndex};
-
- 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.
- this.store.newItem(args, pInfo);
- }
- }});
- }else{
- // [as far as we know] there is no id so we must assume this is a new item
- this.store.newItem(args, pInfo);
- }
- },
-
- 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 Tree and a dojo.store that doesn't have a root item,
- // i.e. has multiple "top level" items.
- //
- // description
- // Use this class to wrap a dojo.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.
- // It allows dijit.Tree to assume a single root item, even if the store doesn't have one.
-
- // 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).
- //
- // Developers can override this function to do something more efficient if they can
- // detect which items are possible top level items (based on the item and the
- // parentInfo parameters). 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);
- }
-});
-
-
-
-}
-
-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.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: 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\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t/><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" waiRole=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" waiRole=\"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"}
- }),
-
- postCreate: 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);
- }
- },
-
- _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.
- this.indent = indent;
-
- // 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);
- });
- },
-
- 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";
-
- if(this[clsName]){
- dojo.removeClass(this[nodeName], this[clsName]);
- }
- this[clsName] = this.tree["get" + upper + "Class"](item, this.isExpanded);
- if(this[clsName]){
- dojo.addClass(this[nodeName], this[clsName]);
- }
- 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.removeClass(this.expandoNode, styles);
- dojo.addClass(this.expandoNode, styles[idx]);
-
- // 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");
- 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
- },
-
- 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"],
-
- // path: String[] or Item[]
- // Full path from rootNode to selected node expressed as array of items or array of ids.
- // Since setting the path may be asynchronous (because ofwaiting on dojo.data), set("path", ...)
- // returns a Deferred to indicate when the set is complete.
- path: [],
-
- // selectedItem: [readonly] Item
- // The currently selected item in this tree.
- // This property can only be set (via set('selectedItem', ...)) when that item is already
- // visible in the tree. (I.e. the tree has already been expanded to show that node.)
- // Should generally use `path` attribute to set the selected item instead.
- 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\" waiRole=\"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".
- dndController: null,
-
- // 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";
- }
- 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){
- // summary:
- // Select a tree node related to passed item.
- // WARNING: if model use multi-parented items or desired tree node isn't already loaded
- // behavior is undefined. Use set('path', ...) instead.
-
- var oldValue = this.get("selectedItem");
- var identity = (!item || dojo.isString(item)) ? item : this.model.getIdentity(item);
- if(identity == oldValue ? this.model.getIdentity(oldValue) : null){ return; }
- var nodes = this._itemNodesMap[identity];
- this._selectNode((nodes && nodes[0]) || null); //select the first item
- },
-
- _getSelectedItemAttr: function(){
- // summary:
- // Return item related to selected tree node.
- return this.selectedNode && this.selectedNode.item;
- },
-
- _setPathAttr: function(/*Item[] || String[]*/ path){
- // summary:
- // Select the tree node identified by passed path.
- // path:
- // Array of items or item id's
- // returns:
- // Deferred to indicate when the set is complete
-
- var d = new dojo.Deferred();
-
- this._selectNode(null);
- if(!path || !path.length){
- d.resolve(true);
- return d;
- }
-
- // If this is called during initialization, defer running until Tree has finished loading
- this._loadDeferred.addCallback(dojo.hitch(this, function(){
- if(!this.rootNode){
- d.reject(new Error("!this.rootNode"));
- return;
- }
- if(path[0] !== this.rootNode.item && (dojo.isString(path[0]) && path[0] != this.model.getIdentity(this.rootNode.item))){
- d.reject(new Error(this.id + ":path[0] doesn't match this.rootNode.item. Maybe you are using the wrong tree."));
- return;
- }
- path.shift();
-
- var node = this.rootNode;
-
- function advance(){
- // summary:
- // Called when "node" has completed loading and expanding. Pop the next item from the path
- // (which must be a child of "node") and advance to it, and then recurse.
-
- // Set item and identity to next item in path (node is pointing to the item that was popped
- // from the path _last_ time.
- var item = path.shift(),
- identity = dojo.isString(item) ? item : this.model.getIdentity(item);
-
- // Change "node" from previous item in path to the item we just popped from path
- dojo.some(this._itemNodesMap[identity], function(n){
- if(n.getParent() == node){
- node = n;
- return true;
- }
- return false;
- });
-
- if(path.length){
- // Need to do more expanding
- this._expandNode(node).addCallback(dojo.hitch(this, advance));
- }else{
- // Final destination node, select it
- this._selectNode(node);
-
- // signal that path setting is finished
- d.resolve(true);
- }
- }
-
- this._expandNode(node).addCallback(dojo.hitch(this, advance));
- }));
-
- return d;
- },
-
- _getPathAttr: function(){
- // summary:
- // Return an array of items that is the path to selected tree node.
- if(!this.selectedNode){ return; }
- var res = [];
- var treeNode = this.selectedNode;
- while(treeNode && treeNode !== this.rootNode){
- res.unshift(treeNode.item);
- treeNode = treeNode.getParent();
- }
- res.unshift(this.rootNode.item);
- return res;
- },
-
- ////////////// 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"){ // 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";
- 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, /*Event*/ evt){
- this._publish("execute", { item: message.item, node: message.node } );
- this._selectNode(message.node);
- this.onClick(message.item, message.node, 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);
- }
- }
- },
-
- _onClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){
- // summary:
- // Translates click events into commands for the controller to process
-
- var domElement = e.target,
- isExpandoClick = (domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText);
-
- 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);
- }
- if(!isExpandoClick){
- this._selectNode(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);
- }
- if(!isExpandoClick){
- this._selectNode(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);
- },
-
- _selectNode: function(/*_tree.Node*/ node){
- // summary:
- // Mark specified node as select, and unmark currently selected node.
- // tags:
- // protected
-
- if(this.selectedNode && !this.selectedNode._destroyed){
- this.selectedNode.setSelected(false);
- }
- if(node){
- node.setSelected(true);
- }
- this.selectedNode = node;
- },
-
- _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){
- var parent = node.getParent();
- if(parent){
- // if node has not already been orphaned from a _onSetItem(parent, "children", ..) call...
- parent.removeChild(node);
- }
- node.destroyRecursive();
- });
- 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);
- dojo.style(this.domNode, "overflow", "auto"); // for scrollbars
- }
-
- // 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.marginBox(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
-
-
-
-}
-
-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.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
- // Class name for Editor widget
- editor: "dijit.form.TextBox",
-
- // editorWrapper: String
- // Class name 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: {},
-
- 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.
- this.disabled = disabled;
- dijit.setWaiState(this.domNode, "disabled", disabled);
- if(disabled){
- this.displayNode.removeAttribute("tabIndex");
- }else{
- this.displayNode.setAttribute("tabIndex", 0);
- }
- dojo.toggleClass(this.displayNode, "dijitInlineEditBoxDisplayModeDisabled", 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 = dojo.getObject(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);
- }
- 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.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
-
- // tell the world that we have changed
- setTimeout(dojo.hitch(this, "onChange", value), 0); // setTimeout prevents browser freeze for long-running event handlers
-
- 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.
-
- this.value = val = dojo.trim(val);
- if(!this.renderAsHtml){
- val = val.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;").replace(/\n/g, "<br>");
- }
- this.displayNode.innerHTML = val || this.noValueIndicator;
- },
-
- 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 dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\"\n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" label=\"${buttonSave}\"></button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\" label=\"${buttonCancel}\"></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);
- },
-
- postCreate: function(){
- // Create edit widget in place in the template
- var cls = dojo.getObject(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;
- var ew = (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);
-
- // 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 cls.prototype){
- 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);
- }
-});
-
-}
-
-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.declare(
- "dijit.form.Form",
- [dijit._Widget, dijit._Templated, dijit.form._FormMixin],
- {
- // 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: this code should be in parser, not here.
- 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();
- }
- }
- }
-);
-
-}
-
-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["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");
-
-
-}
-
-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\" waiRole=\"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, attr('value') will return either the string or false depending on
- // whether or not the checkbox is checked.
- //
- // attr('value', string) will check the checkbox and change the value to the
- // specified string
- //
- // attr('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.readOnly = value;
- dojo.attr(this.focusNode, 'readOnly', value);
- dijit.setWaiState(this.focusNode, "readonly", value);
- },
-
- _setValueAttr: function(/*String or Boolean*/ newValue, /*Boolean*/ priorityChange){
- // summary:
- // Handler for value= attribute to constructor, and also calls to
- // attr('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.value = newValue;
- dojo.attr(this.focusNode, 'value', newValue);
- newValue = true;
- }
- if(this._created){
- this.set('checked', newValue, priorityChange);
- }
- },
- _getValueAttr: function(){
- // summary:
- // Hook so attr('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.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){
- 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);
- }
- }
- }
-);
-
-}
-
-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");
-
-
-// TODO: for 2.0, move the RadioButton code into this file
-
-}
-
-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.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
-};
-
-}
-
-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.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));
-}
-
-}
-
-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.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,
- // but after the field is blurred the value is displayed with 3 decimal places:
- // | {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. attr('value') returns undefined).
- //
- // Symmetrically, attr('value', NaN) will clear the displayed value,
- // whereas attr('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);
- },
-
- /*=====
- parse: 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
- },
- =====*/
- parse: dojo.number.parse,
-
- _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); // attr('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);
- },
-
- _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange, /*String?*/formattedValue){
- // summary:
- // Hook so attr('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 attr('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).
- }
-);
-
-}
-
-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.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,
-
- parse: function(/* String */ value, /* Object */ constraints){
- // summary:
- // Parses string value as a Currency, according to the constraints object
- // tags:
- // protected extension
- var v = dojo.currency.parse(value, constraints);
- if(isNaN(v) && /\d+/.test(value)){ // currency parse failed, but it could be because they are using NumberTextBox format so try its parse
- return this.inherited(arguments, [ value, dojo.mixin({}, constraints, this.editOptions) ]);
- }
- 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
- }
- }
-);
-
-}
-
-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.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,
- 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,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,ie:0,
- il:0,'in':0,is: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,sy: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}*/
-};
-
-}
-
-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.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)
-};
-
-}
-
-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");
-
-// 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 = 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
-
- var info = dojo.date.locale._parseInfo(options),
- tokens = info.tokens, bundle = info.bundle,
- re = new RegExp("^" + info.regexp + "$", info.strict ? "" : "i"),
- match = re.exec(value);
-
- 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+?' : p2+'[1-9]|1[0-2]';
- break;
- case 'D':
- s = p2+'[1-9]|'+p3+'[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]';
- break;
- case 'd':
- s = '3[01]|[12]\\d|'+p2+'[1-9]';
- break;
- case 'w':
- s = p2+'[1-9]|[1-4][0-9]|5[0-3]';
- break;
- case 'E':
- s = '\\S+';
- break;
- case 'h': //hour (1-12)
- s = p2+'[1-9]|1[0-2]';
- break;
- case 'k': //hour (0-11)
- s = p2+'\\d|1[01]';
- break;
- case 'H': //hour (0-23)
- s = p2+'\\d|1\\d|2[0-3]';
- break;
- case 'K': //hour (1-24)
- s = p2+'[1-9]|1\\d|2[0-4]';
- 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'];
- if(options.strict){
- s = am + '|' + pm;
- }else{
- s = am + '|' + pm;
- 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
-};
-
-}
-
-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.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\">\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\" waiRole=\"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 class=\"dijitVisible\">\n\t\t\t\t\t<div class=\"dijitPopup dijitMenu dijitMenuPassive dijitHidden\" dojoAttachPoint=\"monthDropDown\" dojoAttachEvent=\"onmouseup: _onMonthSelect, onmouseover: _onMenuHover, onmouseout: _onMenuHover\">\n\t\t\t\t\t\t<div class=\"dijitCalendarMonthLabelTemplate dijitCalendarMonthLabel\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel dijitInline dijitVisible\" dojoAttachEvent=\"onmousedown: _onMonthToggle\"></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\" waiRole=\"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\"></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"),
-
- // value: Date
- // The currently selected Date
- value: new 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",
-
- baseClass:"dijitCalendar",
-
- // Set node classes for various mouse events, see dijit._CssStateMixin for more details
- cssStateNodes: {
- "decrementMonth": "dijitCalendarArrow",
- "incrementMonth": "dijitCalendarArrow",
- "previousYearLabelNode": "dijitCalendarPreviousYear",
- "nextYearLabelNode": "dijitCalendarNextYear"
- },
-
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- tabIndex: "domNode"
- }),
-
- setValue: function(/*Date*/ value){
- // summary:
- // Deprecated. Used attr('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 getter attr('value')
- var value = new this.dateClassObj(this.value);
- value.setHours(0, 0, 0, 0); // return midnight, local time for back-compat
-
- // 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*/ value){
- // summary:
- // Support setter attr("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.
- // tags:
- // protected
- if(!this.value || this.dateFuncObj.compare(value, this.value)){
- value = new this.dateClassObj(value);
- value.setHours(1); // to avoid issues when DST shift occurs at midnight, see #8521, #9366
- this.displayMonth = new this.dateClassObj(value);
- if(!this.isDisabledDate(value, this.lang)){
- this.value = value;
- this.onChange(this.get('value'));
- }
- dojo.attr(this.domNode, "aria-label",
- this.dateLocaleModule.format(value,
- {selector:"date", formatLength:"full"}));
- this._populateGrid();
- }
- },
-
- _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 = this.displayMonth;
- 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();
- var label = dojo.query(".dijitCalendarDateLabel", template)[0],
- text = date.getDateLocalized ? date.getDateLocalized(this.lang) : date.getDate();
- this._setText(label, text);
- }, this);
-
- // Fill in localized month name
- var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, month);
- this._setText(this.monthLabelNode, monthNames[month.getMonth()]);
- // Repopulate month list based on current year (Hebrew calendar)
- dojo.query(".dijitCalendarMonthLabelTemplate", this.domNode).forEach(function(node, i){
- dojo.toggleClass(node, "dijitHidden", !(i in monthNames)); // hide leap months (Hebrew)
- this._setText(node, monthNames[i]);
- }, this);
-
- // 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);
-
- // Set up repeating mouse behavior
- var _this = this;
- var typematic = function(nodeProp, dateProp, adj){
-//FIXME: leaks (collects) listeners if populateGrid is called multiple times. Do this once?
- _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);
- },
-
- 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.
- if(isNaN(this.value)){ delete this.value; }
- this.inherited(arguments);
- },
-
- postCreate: 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.value);
- // Fill in spacer/month dropdown element with all the month names (invisible) so that the maximum width will affect layout
- var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, dateObj);
- cloneClass(".dijitCalendarMonthLabelTemplate", monthNames.length-1);
- dojo.query(".dijitCalendarMonthLabelTemplate", this.domNode).forEach(function(node, i){
- dojo.attr(node, "month", i);
- if(i in monthNames){ this._setText(node, monthNames[i]); }
- dojo.place(node.cloneNode(true), this.monthLabelSpacer);
- }, this);
-
- this.value = null;
- this.set('value', dateObj);
- },
-
- _onMenuHover: function(e){
- dojo.stopEvent(e);
- dojo.toggleClass(e.target, "dijitMenuItemHover");
- },
-
- _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.displayMonth = this.dateFuncObj.add(this.displayMonth, part, amount);
- this._populateGrid();
- },
-
- _onMonthToggle: function(/*Event*/ evt){
- // summary:
- // Handler for when user triggers or dismisses the month list
- // tags:
- // protected
- dojo.stopEvent(evt);
-
- if(evt.type == "mousedown"){
- var coords = dojo.position(this.monthLabelNode);
-// coords.y -= dojo.position(this.domNode, true).y;
- // Size the dropdown's width to match the label in the widget
- // so that they are horizontally aligned
- var dim = {
- width: coords.w + "px",
- top: -this.displayMonth.getMonth() * coords.h + "px"
- };
- if((dojo.isIE && dojo.isQuirks) || dojo.isIE < 7){
- dim.left = -coords.w/2 + "px";
- }
- dojo.style(this.monthDropDown, dim);
- this._popupHandler = this.connect(document, "onmouseup", "_onMonthToggle");
- }else{
- this.disconnect(this._popupHandler);
- delete this._popupHandler;
- }
-
- dojo.toggleClass(this.monthDropDown, "dijitHidden");
- dojo.toggleClass(this.monthLabelNode, "dijitVisible");
- },
-
- _onMonthSelect: function(/*Event*/ evt){
- // summary:
- // Handler for when user selects a month from a list
- // tags:
- // protected
- this._onMonthToggle(evt);
- this.displayMonth.setMonth(dojo.attr(evt.target, "month"));
- 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);
- this.onValueSelected(this.get('value'));
- }
- },
-
- _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; }
-
- dojo.removeClass(this._currentNode, "dijitCalendarHoveredDate");
- if(dojo.hasClass(this._currentNode, "dijitCalendarActiveDate")) {
- dojo.removeClass(this._currentNode, "dijitCalendarActiveDate");
- }
- 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
-//TODO: skip disabled dates without ending up in a loop
-//TODO: could optimize by avoiding populate grid when month does not change
- _onKeyPress: function(/*Event*/evt){
- // summary:
- // Provides keyboard navigation of calendar
- // tags:
- // protected
- var dk = dojo.keys,
- increment = -1,
- interval,
- newValue = this.value;
- 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 ? "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 Date(newValue).setDate(1);
- break;
- case dk.ENTER:
- this.onValueSelected(this.get('value'));
- break;
- case dk.ESCAPE:
- //TODO
- default:
- return;
- }
- dojo.stopEvent(evt);
-
- if(interval){
- newValue = this.dateFuncObj.add(newValue, interval, increment);
- }
-
- this.set("value", newValue);
- },
-
- onValueSelected: function(/*Date*/ date){
- // summary:
- // Notification that a date cell was selected. It may be the same as the previous value.
- // description:
- // Used by `dijit.form._DateTimeTextBox` (and thus `dijit.form.DateTextBox`)
- // to get notification when the user has clicked a date.
- // 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.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
-=====*/
- }
- }
-);
-
-}
-
-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");
-
-
-
-
-
-
-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,
- {
- // summary:
- // Base class for validating, serializable, range-bound date or time text box.
-
- // 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: dojo.date.compare,
-
- 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);
- },
-
- // 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;
- },
-
- _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, [constraints]);
- },
-
- _onFocus: function(/*Event*/ evt){
- // summary:
- // open the popup
- this._open();
- this.inherited(arguments);
- },
-
- _setValueAttr: function(/*Date*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
- // summary:
- // Sets the date on this textbox. Note that `value` must be like a Javascript Date object.
- if(value !== undefined){
- if(!value || value.toString() == dijit.form._DateTimeTextBox.prototype.value.toString()){
- value = null;
- }
- if(value instanceof Date && !(this.dateClassObj instanceof Date)){
- value = new this.dateClassObj(value);
- }
- }
- this.inherited(arguments, [value, priorityChange, formattedValue]);
- if(this._picker){
- // #3948: fix blank date on popup only
- if(!value){value = new this.dateClassObj();}
- this._picker.set('value', value);
- }
- },
-
- _open: function(){
- // summary:
- // opens the TimePicker, and sets the onValueSelected value
-
- if(this.disabled || this.readOnly || !this.popupClass){return;}
-
- var textBox = this;
-
- if(!this._picker){
- var PopupProto = dojo.getObject(this.popupClass, false);
- this._picker = new PopupProto({
- onValueSelected: function(value){
- if(textBox._tabbingAway){
- delete textBox._tabbingAway;
- }else{
- textBox.focus(); // focus the textbox before the popup closes to avoid reopening the popup
- }
- setTimeout(dojo.hitch(textBox, "_close"), 1); // allow focus time to take
-
- // 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: this.get('value') || new this.dateClassObj(),
- constraints: textBox.constraints,
-
- datePackage: textBox.datePackage,
-
- isDisabledDate: function(/*Date*/ date){
- // summary:
- // disables dates outside of the min/max of the _DateTimeTextBox
- var compare = dojo.date.compare;
- var constraints = textBox.constraints;
- return constraints && (
- (constraints.min && compare(constraints.min, date, textBox._selector) > 0) ||
- (constraints.max && compare(constraints.max, date, textBox._selector) < 0)
- );
- }
- });
- }
- if(!this._opened){
- // Open drop down. Align left sides of input box and drop down, even in RTL mode,
- // otherwise positioning thrown off when the drop down width is changed in marginBox call below (#10676)
- dijit.popup.open({
- parent: this,
- popup: this._picker,
- orient: {'BL':'TL', 'TL':'BL'},
- around: this.domNode,
- onCancel: dojo.hitch(this, this._close),
- onClose: function(){ textBox._opened=false; }
- });
- this._opened=true;
- }
-
- dojo.marginBox(this._picker.domNode,{ w:this.domNode.offsetWidth });
- },
-
- _close: function(){
- if(this._opened){
- dijit.popup.close(this._picker);
- this._opened=false;
- }
- },
-
- _onBlur: function(){
- // summary:
- // Called magically when focus has shifted away from this widget and it's dropdown
- this._close();
- if(this._picker){
- // teardown so that constraints will be rebuilt next time (redundant reference: #6002)
- this._picker.destroy();
- delete this._picker;
- }
- this.inherited(arguments);
- // don't focus on <input>. the user has explicitly focused on something else.
- },
-
- _getDisplayedValueAttr: function(){
- return this.textbox.value;
- },
-
- _setDisplayedValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){
- this._setValueAttr(this.parse(value, this.constraints), priorityChange, value);
- },
-
- destroy: function(){
- if(this._picker){
- this._picker.destroy();
- delete this._picker;
- }
- this.inherited(arguments);
- },
-
- postCreate: function(){
- this.inherited(arguments);
- this.connect(this.focusNode, 'onkeypress', this._onKeyPress);
- this.connect(this.focusNode, 'onclick', this._open);
- },
-
- _onKeyPress: function(/*Event*/ e){
- // summary:
- // Handler for keypress events
-
- var p = this._picker, dk = dojo.keys;
- // Handle the key in the picker, if it has a handler. If the handler
- // returns false, then don't handle any other keys.
- if(p && this._opened && p.handleKey){
- if(p.handleKey(e) === false){ return; }
- }
- if(this._opened && e.charOrCode == dk.ESCAPE && !(e.shiftKey || e.ctrlKey || e.altKey || e.metaKey)){
- this._close();
- dojo.stopEvent(e);
- }else if(!this._opened && e.charOrCode == dk.DOWN_ARROW){
- this._open();
- dojo.stopEvent(e);
- }else if(e.charOrCode === dk.TAB){
- this._tabbingAway = true;
- }else if(this._opened && (e.keyChar || e.charOrCode === dk.BACKSPACE || e.charOrCode == dk.DELETE)){
- // Replace the element - but do it after a delay to allow for
- // filtering to occur
- setTimeout(dojo.hitch(this, function(){
- if(this._picker && this._opened){
- dijit.placeOnScreenAroundElement(p.domNode.parentNode, this.domNode, {'BL':'TL', 'TL':'BL'}, p.orient ? dojo.hitch(p, "orient") : null);
- }
- }), 1);
- }
- }
- }
-);
-
-}
-
-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.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 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`
- value: new Date("") // value.toString()="NaN"
- }
-);
-
-}
-
-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.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}\" waiRole=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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 waiRole=\"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 waiRole=\"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=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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\twaiRole=\"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));
- }
-});
-
-}
-
-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.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);
- }
- }
-});
-
-}
-
-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.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 attr('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 attr('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();
- }
-});
-
-}
-
-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.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\" tabIndex=\"-1\" 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\" waiRole=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"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\" waiRole=\"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 waiRole=\"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\" tabIndex=\"-1\" 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: Boolean
- // Show increment/decrement buttons at the ends of the slider?
- showButtons: true,
-
- // minimum:: Integer
- // The minimum value the slider can be set to.
- minimum: 0,
-
- // maximum: 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, optional*/ 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, optional*/ priorityChange){
- // summary:
- // Hook so attr('value', value) works.
- this.valueNode.value = this.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, optional*/ 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);
- }
- },
-
- postCreate: function(){
- if(this.showButtons){
- this.incrementButton.style.display="";
- this.decrementButton.style.display="";
- 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});
- // 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);
-
- this.inherited(arguments);
- 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 pixelValue = e[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);
- }
-});
-
-
-
-}
-
-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.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\" tabIndex=\"-1\" 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\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" waiRole=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"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\" waiRole=\"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\" tabIndex=\"-1\" 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;
- }
-});
-
-
-}
-
-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.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,
-
- postCreate: function(){
- 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;
- }
-});
-
-}
-
-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.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
-
-});
-
-
-}
-
-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.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;
- }
-});
-
-
-
-}
-
-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.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
-});
-
-}
-
-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)
- if(!this.value && this.srcNodeRef){
- this.value = this.srcNodeRef.value;
- }
- this.inherited(arguments);
- },
-
- 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);
- },
-
- postCreate: function(){
- this.inherited(arguments);
- if(dojo.isIE && this.cols){ // attribute selectors is not supported in IE6
- dojo.addClass(this.textbox, "dijitTextAreaCols");
- }
- },
-
- _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);
- }
-});
-
-}
-
-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.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>
-
-
- // 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 && !(dojo.isSafari < 4)){ // Safari 4.0 && Chrome
- newH += dojo._getBorderExtents(textarea).h;
- }else{ // Safari 3.x and Opera 9.6
- 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();
- },
-
- postCreate: 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' });
- this.connect(this.textbox, "onscroll", this._onInput);
- this.connect(this.textbox, "onresize", this._onInput);
- this.connect(this.textbox, "onfocus", this._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);
- }
-});
-
-}
-
-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 wairole='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",
-
- postCreate: function(){
- dijit.setWaiRole(this.domNode, "tablist");
-
- this.pane2button = {}; // mapping from pane id to buttons
- this.pane2handles = {}; // mapping from pane id to this.connect() handles
-
- // 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");
- this.pane2handles[page.id] = [
- this.connect(page, 'set', function(name, value){
- var buttonAttr = {
- title: 'label',
- showTitle: 'showLabel',
- iconClass: 'iconClass',
- closable: 'closeButton',
- tooltip: 'title'
- }[name];
- if(buttonAttr){
- button.set(buttonAttr, value);
- }
- }),
- 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; }
- dojo.forEach(this.pane2handles[page.id], this.disconnect, this);
- delete this.pane2handles[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.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 page navigation
- 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",
-
- postCreate: function(/*Event*/ evt){
- dijit.setWaiRole((this.focusNode || this.domNode), "tab");
- this.inherited(arguments);
- },
-
- 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();
- }
- });
-
-
-}
-
-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",
-
-/*=====
- // selectedChildWidget: [readonly] dijit._Widget
- // References the currently selected child widget, if any.
- // Adjust selected child with selectChild() method.
- selectedChildWidget: null,
-=====*/
-
- postCreate: function(){
- this.inherited(arguments);
- dojo.addClass(this.domNode, "dijitLayoutContainer");
- dijit.setWaiRole(this.containerNode, "tabpanel");
- 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.removeClass(child.domNode, "dijitVisible");
- dojo.addClass(child.domNode, "dijitHidden");
-
- // 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
- this._transition(page, this.selectedChildWidget, animate);
- this.selectedChildWidget = page;
- dojo.publish(this.id+"-selectChild", [page]);
-
- if(this.persist){
- dojo.cookie(this.id + "_selectedChild", this.selectedChildWidget.id);
- }
- }
- },
-
- _transition: function(/*dijit._Widget*/newWidget, /*dijit._Widget*/oldWidget){
- // summary:
- // Hide the old widget and display the new widget.
- // Subclasses should override this.
- // tags:
- // protected extension
- if(oldWidget){
- this._hideChild(oldWidget);
- }
- 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();
- }
- }
- },
-
- _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.
- this.selectChild(this._adjacent(true), true);
- },
-
- back: function(){
- // summary:
- // Go back to previous page.
- 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.
- var children = this.getChildren();
- page.isFirstChild = (page == children[0]);
- page.isLastChild = (page == children[children.length-1]);
- page.selected = true;
-
- dojo.removeClass(page.domNode, "dijitHidden");
- dojo.addClass(page.domNode, "dijitVisible");
-
- page._onShow();
- },
-
- _hideChild: function(/*dijit._Widget*/ page){
- // summary:
- // Hide the specified child by changing it's CSS, and call _onHide() so
- // it's notified.
- page.selected=false;
- dojo.removeClass(page.domNode, "dijitVisible");
- dojo.addClass(page.domNode, "dijitHidden");
-
- 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
-});
-
-}
-
-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.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
- }
-});
-
-}
-
-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");
-
-
-
-
-
-
-
-
-
- // for back compat, remove for 2.0
-
-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",
-
- postCreate: function(){
- this.domNode.style.overflow = "hidden";
- this.inherited(arguments);
- dijit.setWaiRole(this.domNode, "tablist");
- },
-
- 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);
- }
- },
-
- _getTargetHeight: function(/* Node */ node){
- // summary:
- // For the given node, returns the height that should be
- // set to achieve our vertical space (subtract any padding
- // we may have).
- //
- // This is used by the animations.
- //
- // TODO: I don't think this works correctly in IE quirks when an elements
- // style.height including padding and borders
- var cs = dojo.getComputedStyle(node);
- return Math.max(this._verticalSpace - dojo._getPadBorderExtents(node, cs).h - dojo._getMarginExtents(node, cs).h, 0);
- },
-
- 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;}
-
- var openPaneContainer = openPane._wrapperWidget.domNode,
- openPaneContainerMargin = dojo._getMarginExtents(openPaneContainer),
- openPaneContainerPadBorder = dojo._getPadBorderExtents(openPaneContainer),
- 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.marginBox(child._wrapperWidget.domNode).h;
- }
- });
- this._verticalSpace = mySize.h - totalCollapsedHeight - openPaneContainerMargin.h
- - openPaneContainerPadBorder.h - openPane._buttonWidget.getTitleHeight();
-
- // Memo size to make displayed child
- this._containerContentBox = {
- h: this._verticalSpace,
- w: this._contentBox.w - openPaneContainerMargin.w - openPaneContainerPadBorder.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
- 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(){
- dojo.forEach(this.getChildren(), function(child){
- child._wrapperWidget.destroy();
- });
- this.inherited(arguments);
- },
-
- _transition: function(/*dijit._Widget?*/newWidget, /*dijit._Widget?*/oldWidget, /*Boolean*/ animate){
- // Overrides StackContainer._transition() to provide sliding of title bars etc.
-
-//TODO: should be able to replace this with calls to slideIn/slideOut
- if(this._inTransition){ return; }
- var animations = [];
- var paneHeight = this._verticalSpace;
- if(newWidget){
- newWidget._wrapperWidget.set("selected", true);
-
- 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);
- }
-
- var newContents = newWidget.domNode;
- dojo.addClass(newContents, "dijitVisible");
- dojo.removeClass(newContents, "dijitHidden");
-
- if(animate){
- var newContentsOverflow = newContents.style.overflow;
- newContents.style.overflow = "hidden";
- animations.push(dojo.animateProperty({
- node: newContents,
- duration: this.duration,
- properties: {
- height: { start: 1, end: this._getTargetHeight(newContents) }
- },
- onEnd: function(){
- newContents.style.overflow = newContentsOverflow;
-
- // Kick IE to workaround layout bug, see #11415
- if(dojo.isIE){
- setTimeout(function(){
- dojo.removeClass(newContents.parentNode, "dijitAccordionInnerContainerFocused");
- setTimeout(function(){
- dojo.addClass(newContents.parentNode, "dijitAccordionInnerContainerFocused");
- }, 0);
- }, 0);
- }
- }
- }));
- }
- }
- if(oldWidget){
- oldWidget._wrapperWidget.set("selected", false);
- var oldContents = oldWidget.domNode;
- if(animate){
- var oldContentsOverflow = oldContents.style.overflow;
- oldContents.style.overflow = "hidden";
- animations.push(dojo.animateProperty({
- node: oldContents,
- duration: this.duration,
- properties: {
- height: { start: this._getTargetHeight(oldContents), end: 1 }
- },
- onEnd: function(){
- dojo.addClass(oldContents, "dijitHidden");
- dojo.removeClass(oldContents, "dijitVisible");
- oldContents.style.overflow = oldContentsOverflow;
- if(oldWidget.onHide){
- oldWidget.onHide();
- }
- }
- }));
- }else{
- dojo.addClass(oldContents, "dijitHidden");
- dojo.removeClass(oldContents, "dijitVisible");
- if(oldWidget.onHide){
- oldWidget.onHide();
- }
- }
- }
-
- if(animate){
- this._inTransition = true;
- var combined = dojo.fx.combine(animations);
- combined.onEnd = dojo.hitch(this, function(){
- delete this._inTransition;
- });
- combined.play();
- }
- },
-
- // 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._inTransition || this.disabled || e.altKey || !(fromTitle || e.ctrlKey)){
- if(this._inTransition){
- dojo.stopEvent(e);
- }
- 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(){
- // 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)
- dojo.place(this.contentWidget.domNode, this.domNode);
- },
-
- postCreate: function(){
- this.inherited(arguments);
- this.connect(this.contentWidget, 'set', function(name, value){
- var mappedName = {title: "label", tooltip: "title", iconClass: "iconClass"}[name];
- if(mappedName){
- this.button.set(mappedName, value);
- }
- }, this);
- },
-
- _setSelectedAttr: function(/*Boolean*/ isSelected){
- this.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();
-
- 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' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowTextUp' waiRole=\"presentation\">+</span\n\t\t><span class='arrowTextDown' waiRole=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" waiRole=\"presentation\"/>\n\t\t<span waiRole=\"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;
- },
-
- postCreate: function(){
- this.inherited(arguments);
- dojo.setSelectable(this.domNode, false);
- var titleTextNodeId = dojo.attr(this.domNode,'id').replace(' ','_');
- dojo.attr(this.titleTextNode, "id", titleTextNodeId+"_title");
- dijit.setWaiState(this.focusNode, "labelledby", dojo.attr(this.titleTextNode, "id"));
- },
-
- getTitleHeight: function(){
- // summary:
- // Returns the height of the title dom node.
- return dojo.marginBox(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();
- if(!parent._inTransition){
- 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.selected = isSelected;
- dijit.setWaiState(this.focusNode, "expanded", isSelected);
- dijit.setWaiState(this.focusNode, "selected", isSelected);
- this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
- }
-});
-
-}
-
-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.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.
- //
- // NOTE: Splitters must not be more than 50 pixels in width.
- //
- // 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.
- //
- // example:
- // | <div dojoType="dijit.layout.BorderContainer" design="sidebar" gutters="false"
- // | style="width: 400px; height: 300px;">
- // | <div dojoType="ContentPane" region="top">header text</div>
- // | <div dojoType="ContentPane" region="right" splitter="true" style="width: 200px;">table of contents</div>
- // | <div dojoType="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: 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: 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);
- },
-
- postCreate: function(){
- this.inherited(arguments);
-
- this._splitters = {};
- this._splitterThickness = {};
- },
-
- 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"; }
-
- //FIXME: redundant?
- this["_"+region] = child.domNode;
- this["_"+region+"Widget"] = child;
-
- // Create draggable splitter for resizing pane,
- // or alternately if splitter=false but BorderContainer.gutters=true then
- // insert dummy div just for spacing
- if((child.splitter || this.gutters) && !this._splitters[region]){
- 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;
- this._splitters[region] = splitter.domNode;
- dojo.place(this._splitters[region], child.domNode, "after");
-
- // Splitters arent added as Contained children, so we need to call startup explicitly
- splitter.startup();
- }
- child.region = region;
- }
- },
-
- _computeSplitterThickness: function(region){
- this._splitterThickness[region] = this._splitterThickness[region] ||
- dojo.marginBox(this._splitters[region])[(/top|bottom/.test(region) ? 'h' : 'w')];
- },
-
- layout: function(){
- // Implement _LayoutWidget.layout() virtual method.
- for(var region in this._splitters){ this._computeSplitterThickness(region); }
- 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 = this._splitters[region];
- if(splitter){
- dijit.byNode(splitter).destroy();
- delete this._splitters[region];
- delete this._splitterThickness[region];
- }
- this.inherited(arguments);
- delete this["_"+region];
- delete this["_" +region+"Widget"];
- if(this._started){
- this._layoutChildren();
- }
- dojo.removeClass(child.domNode, this.baseClass+"Pane");
- },
-
- getChildren: function(){
- // Override _LayoutWidget.getChildren() to only return real children, not the splitters.
- return dojo.filter(this.inherited(arguments), function(widget){
- return !widget.isSplitter;
- });
- },
-
- getSplitter: function(/*String*/region){
- // summary:
- // Returns the widget responsible for rendering the splitter associated with region
- var splitter = this._splitters[region];
- return splitter ? dijit.byNode(splitter) : null;
- },
-
- 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?*/changedRegion, /*Number?*/ changedRegionSize){
- // 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.
- // changedRegion:
- // The region should be changed because splitter was dragged.
- // "left", "right", "top", or "bottom".
- // changedRegionSize:
- // The new width/height (in pixels) to make changedRegion
-
- 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;
- }
-
- var sidebarLayout = (this.design == "sidebar");
- var topHeight = 0, bottomHeight = 0, leftWidth = 0, rightWidth = 0;
- var topStyle = {}, leftStyle = {}, rightStyle = {}, bottomStyle = {},
- centerStyle = (this._center && this._center.style) || {};
-
- var changedSide = /left|right/.test(changedRegion);
-
- var layoutSides = !changedRegion || (!changedSide && !sidebarLayout);
- var layoutTopBottom = !changedRegion || (changedSide && sidebarLayout);
-
- // Ask browser for width/height of side panes.
- // Would be nice to cache this but height can change according to width
- // (because words wrap around). I don't think width will ever change though
- // (except when the user drags a splitter).
- if(this._top){
- topStyle = (changedRegion == "top" || layoutTopBottom) && this._top.style;
- topHeight = changedRegion == "top" ? changedRegionSize : dojo.marginBox(this._top).h;
- }
- if(this._left){
- leftStyle = (changedRegion == "left" || layoutSides) && this._left.style;
- leftWidth = changedRegion == "left" ? changedRegionSize : dojo.marginBox(this._left).w;
- }
- if(this._right){
- rightStyle = (changedRegion == "right" || layoutSides) && this._right.style;
- rightWidth = changedRegion == "right" ? changedRegionSize : dojo.marginBox(this._right).w;
- }
- if(this._bottom){
- bottomStyle = (changedRegion == "bottom" || layoutTopBottom) && this._bottom.style;
- bottomHeight = changedRegion == "bottom" ? changedRegionSize : dojo.marginBox(this._bottom).h;
- }
-
- var splitters = this._splitters;
- var topSplitter = splitters.top, bottomSplitter = splitters.bottom,
- leftSplitter = splitters.left, rightSplitter = splitters.right;
- var splitterThickness = this._splitterThickness;
- var topSplitterThickness = splitterThickness.top || 0,
- leftSplitterThickness = splitterThickness.left || 0,
- rightSplitterThickness = splitterThickness.right || 0,
- bottomSplitterThickness = splitterThickness.bottom || 0;
-
- // Check for race condition where CSS hasn't finished loading, so
- // the splitter width == the viewport width (#5824)
- if(leftSplitterThickness > 50 || rightSplitterThickness > 50){
- setTimeout(dojo.hitch(this, function(){
- // Results are invalid. Clear them out.
- this._splitterThickness = {};
-
- for(var region in this._splitters){
- this._computeSplitterThickness(region);
- }
- this._layoutChildren();
- }), 50);
- return false;
- }
-
- var pe = this.pe;
-
- var splitterBounds = {
- left: (sidebarLayout ? leftWidth + leftSplitterThickness: 0) + pe.l + "px",
- right: (sidebarLayout ? rightWidth + rightSplitterThickness: 0) + pe.r + "px"
- };
-
- if(topSplitter){
- dojo.mixin(topSplitter.style, splitterBounds);
- topSplitter.style.top = topHeight + pe.t + "px";
- }
-
- if(bottomSplitter){
- dojo.mixin(bottomSplitter.style, splitterBounds);
- bottomSplitter.style.bottom = bottomHeight + pe.b + "px";
- }
-
- splitterBounds = {
- top: (sidebarLayout ? 0 : topHeight + topSplitterThickness) + pe.t + "px",
- bottom: (sidebarLayout ? 0 : bottomHeight + bottomSplitterThickness) + pe.b + "px"
- };
-
- if(leftSplitter){
- dojo.mixin(leftSplitter.style, splitterBounds);
- leftSplitter.style.left = leftWidth + pe.l + "px";
- }
-
- if(rightSplitter){
- dojo.mixin(rightSplitter.style, splitterBounds);
- rightSplitter.style.right = rightWidth + pe.r + "px";
- }
-
- dojo.mixin(centerStyle, {
- top: pe.t + topHeight + topSplitterThickness + "px",
- left: pe.l + leftWidth + leftSplitterThickness + "px",
- right: pe.r + rightWidth + rightSplitterThickness + "px",
- bottom: pe.b + bottomHeight + bottomSplitterThickness + "px"
- });
-
- var bounds = {
- top: sidebarLayout ? pe.t + "px" : centerStyle.top,
- bottom: sidebarLayout ? pe.b + "px" : centerStyle.bottom
- };
- dojo.mixin(leftStyle, bounds);
- dojo.mixin(rightStyle, bounds);
- leftStyle.left = pe.l + "px"; rightStyle.right = pe.r + "px"; topStyle.top = pe.t + "px"; bottomStyle.bottom = pe.b + "px";
- if(sidebarLayout){
- topStyle.left = bottomStyle.left = leftWidth + leftSplitterThickness + pe.l + "px";
- topStyle.right = bottomStyle.right = rightWidth + rightSplitterThickness + pe.r + "px";
- }else{
- topStyle.left = bottomStyle.left = pe.l + "px";
- topStyle.right = bottomStyle.right = pe.r + "px";
- }
-
- // More calculations about sizes of panes
- var containerHeight = this._borderBox.h - pe.t - pe.b,
- middleHeight = containerHeight - ( topHeight + topSplitterThickness + bottomHeight + bottomSplitterThickness),
- sidebarHeight = sidebarLayout ? containerHeight : middleHeight;
-
- var containerWidth = this._borderBox.w - pe.l - pe.r,
- middleWidth = containerWidth - (leftWidth + leftSplitterThickness + rightWidth + rightSplitterThickness),
- sidebarWidth = sidebarLayout ? middleWidth : containerWidth;
-
- // New margin-box size of each pane
- var dim = {
- top: { w: sidebarWidth, h: topHeight },
- bottom: { w: sidebarWidth, h: bottomHeight },
- left: { w: leftWidth, h: sidebarHeight },
- right: { w: rightWidth, h: sidebarHeight },
- center: { h: middleHeight, w: middleWidth }
- };
-
- if(changedRegion){
- // Respond to splitter drag event by changing changedRegion's width or height
- var child = this["_" + changedRegion + "Widget"],
- mb = {};
- mb[ /top|bottom/.test(changedRegion) ? "h" : "w"] = changedRegionSize;
- child.resize ? child.resize(mb, dim[child.region]) : dojo.marginBox(child.domNode, mb);
- }
-
- // Nodes in IE<8 don't respond to t/l/b/r, and TEXTAREA doesn't respond in any browser
- var janky = dojo.isIE < 8 || (dojo.isIE && dojo.isQuirks) || dojo.some(this.getChildren(), function(child){
- return child.domNode.tagName == "TEXTAREA" || child.domNode.tagName == "INPUT";
- });
- if(janky){
- // Set the size of the children the old fashioned way, by setting
- // CSS width and height
-
- var resizeWidget = function(widget, changes, result){
- if(widget){
- (widget.resize ? widget.resize(changes, result) : dojo.marginBox(widget.domNode, changes));
- }
- };
-
- if(leftSplitter){ leftSplitter.style.height = sidebarHeight; }
- if(rightSplitter){ rightSplitter.style.height = sidebarHeight; }
- resizeWidget(this._leftWidget, {h: sidebarHeight}, dim.left);
- resizeWidget(this._rightWidget, {h: sidebarHeight}, dim.right);
-
- if(topSplitter){ topSplitter.style.width = sidebarWidth; }
- if(bottomSplitter){ bottomSplitter.style.width = sidebarWidth; }
- resizeWidget(this._topWidget, {w: sidebarWidth}, dim.top);
- resizeWidget(this._bottomWidget, {w: sidebarWidth}, dim.bottom);
-
- resizeWidget(this._centerWidget, dim.center);
- }else{
- // Calculate which panes need a notification that their size has been changed
- // (we've already set style.top/bottom/left/right on those other panes).
- var notifySides = !changedRegion || (/top|bottom/.test(changedRegion) && this.design != "sidebar"),
- notifyTopBottom = !changedRegion || (/left|right/.test(changedRegion) && this.design == "sidebar"),
- notifyList = {
- center: true,
- left: notifySides,
- right: notifySides,
- top: notifyTopBottom,
- bottom: notifyTopBottom
- };
-
- // Send notification to those panes that have changed size
- dojo.forEach(this.getChildren(), function(child){
- if(child.resize && notifyList[child.region]){
- child.resize(null, dim[child.region]);
- }
- }, this);
- }
- },
-
- destroy: function(){
- for(var region in this._splitters){
- var splitter = this._splitters[region];
- dijit.byNode(splitter).destroy();
- dojo.destroy(splitter);
- }
- delete this._splitters;
- delete this._splitterThickness;
- 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: '',
-
- // 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: 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" waiRole="separator"><div class="dijitSplitterThumb"></div></div>',
-
- postCreate: function(){
- this.inherited(arguments);
- this.horizontal = /top|bottom/.test(this.region);
- dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V"));
-// dojo.addClass(this.child.domNode, "dijitSplitterPane");
-// dojo.setSelectable(this.domNode, false); //TODO is this necessary?
-
- this._factor = /top|left/.test(this.region) ? 1 : -1;
-
- this._cookieName = this.container.id + "_" + this.region;
- 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:
- // Compute the maximum size that my corresponding pane can be set to
-
- var dim = this.horizontal ? 'h' : 'w',
- thickness = this.container._splitterThickness[this.region];
-
- // Get DOMNode of opposite pane, if an opposite pane exists.
- // Ex: if I am the _Splitter for the left pane, then get the right pane.
- var flip = {left:'right', right:'left', top:'bottom', bottom:'top', leading:'trailing', trailing:'leading'},
- oppNode = this.container["_" + flip[this.region]];
-
- // I can expand up to the edge of the opposite pane, or if there's no opposite pane, then to
- // edge of BorderContainer
- var available = dojo.contentBox(this.container.domNode)[dim] -
- (oppNode ? dojo.marginBox(oppNode)[dim] : 0) -
- 20 - thickness * 2;
-
- return Math.min(this.child.maxSize, available);
- },
-
- _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");
- dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
- if(this.fake){
- dojo.removeClass(this.fake, "dijitSplitterHover");
- dojo.removeClass(this.fake, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover");
- }
-
- //Performance: load data info local vars for onmousevent function closure
- var factor = this._factor,
- max = this._computeMaxSize(),
- min = this.child.minSize || 20,
- 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],
- region = this.region,
- splitterStart = parseInt(this.domNode.style[region], 10),
- resize = this._resize,
- childNode = this.child.domNode,
- layoutFunc = dojo.hitch(this.container, this.container._layoutChildren),
- 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(region, boundChildSize);
- }
- splitterStyle[region] = factor * delta + splitterStart + (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");
- dojo.removeClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
- dojo.removeClass(this.domNode, "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.marginBox(this.child.domNode)[ horizontal ? 'h' : 'w' ] + this._factor * tick;
- this.container._layoutChildren(this.region, 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" waiRole="presentation"></div>',
-
- postCreate: function(){
- this.horizontal = /top|bottom/.test(this.region);
- dojo.addClass(this.domNode, "dijitGutter" + (this.horizontal ? "H" : "V"));
- }
-});
-
-}
-
-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.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'
-});
-
-}
-
-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.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
- }
-});
-
-}
-
-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");
-
-//
-// 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
-});
-
-}
-
-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: Boolean
- // Defines whether the tablist gets an extra class for layouting, putting a border/shading
- // around the set of tabs.
- tabStrip: false,
-
- // nested: 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);
- },
-
- postCreate: 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){
- this.tablist.resize({w: dojo.contentBox(this.domNode).w});
- }
-
- // 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);
- }
-});
-
-
-}
-
-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 wairole='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 waiRole=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick'>\n <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n \t<div waiRole=\"presentation\" dojoAttachPoint='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" 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' waiRole=\"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,
-
- postMixInProperties: function(){
- // Override blank iconClass from Button to do tab height adjustment on IE6,
- // to make sure that tabs with and w/out close icons are same height
- if(!this.iconClass){
- this.iconClass = "dijitTabButtonIcon";
- }
- },
-
- postCreate: function(){
- this.inherited(arguments);
- dojo.setSelectable(this.containerNode, false);
-
- // If a custom icon class has not been set for the
- // tab icon, set its width to one pixel. This ensures
- // that the height styling of the tab is maintained,
- // as it is based on the height of the icon.
- // TODO: I still think we can just set dijitTabButtonIcon to 1px in CSS <Bill>
- if(this.iconNode.className == "dijitTabButtonIcon"){
- dojo.style(this.iconNode, "width", "1px");
- }
- },
-
- 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(disp){
- this.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 attr('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);
- }
-});
-
-}
-
-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._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\" iconClass=\"dijitTabStripMenuIcon\"\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 wairole='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: 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"
- }),
-
- postCreate: 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);
- var menuItem;
- if(this.useMenu){
- var containerId = this.containerId;
- menuItem = new dijit.MenuItem({
- id: page.id + "_stcMi",
- label: page.title,
- dir: page.dir,
- lang: page.lang,
- onClick: dojo.hitch(this, function(){
- var container = dijit.byId(containerId);
- container.selectChild(page);
- })
- });
- this._menuChildren[page.id] = menuItem;
- this._menu.addChild(menuItem, insertIndex);
- }
-
- // update the menuItem label when the button label is updated
- this.pane2handles[page.id].push(
- this.connect(this.pane2button[page.id], "set", function(name, value){
- if(this._postStartup){
- if(name == "label"){
- if(menuItem){
- menuItem.set(name, value);
- }
-
- // The changed label will have changed the width of the
- // buttons, so do a resize
- if(this._dim){
- this.resize(this._dim);
- }
- }
- }
- })
- );
-
- // 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;
- }
-
- // delete menu entry corresponding to pane that was removed from TabContainer
- if(this.useMenu && page && page.id && this._menuChildren[page.id]){
- this._menu.removeChild(this._menuChildren[page.id]);
- this._menuChildren[page.id].destroy();
- delete this._menuChildren[page.id];
- }
-
- 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.
- this._menuChildren = {};
-
- // 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.marginBox(btn).w;
- return true;
- }else{
- dojo.style(btn, "display", "none");
- return false;
- }
- }, this);
-
- if(this.useMenu){
- // Create the menu that is used to select tabs.
- this._menu = new dijit.Menu({
- id: this.id + "_menu",
- dir: this.dir,
- lang: this.lang,
- targetNodeIds: [this._menuBtn.domNode],
- leftClickToOpen: true,
- refocus: false // selecting a menu item sets focus to a TabButton
- });
- this._supportingWidgets.push(this._menu);
- }
- },
-
- _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;
- },
-
- _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(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(e){
- // summary:
- // Scrolls the menu to the right.
- // e:
- // The mouse click event.
- this.doSlide(1, this._getBtnNode(e));
- },
-
- doSlideLeft: function(e){
- // summary:
- // Scrolls the menu to the left.
- // e:
- // The mouse click event.
- this.doSlide(-1,this._getBtnNode(e));
- },
-
- doSlide: function(direction, 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(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._ScrollingTabControllerButton",
- dijit.form.Button,
- {
- baseClass: "dijitTab tabStripButton",
-
- templateString: dojo.cache("dijit.layout", "templates/_ScrollingTabControllerButton.html", "<div dojoAttachEvent=\"onclick:_onButtonClick\">\n\t<div waiRole=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div waiRole=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img waiRole=\"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: "-1"
- }
-);
-
-}
-
-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.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";
- }
- }
-});
-
-
-}
-
-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;
-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");
-dojo.provide("dijit.dijit-all");
-
-/*=====
-dijit["dijit-all"] = {
- // summary:
- // A rollup that includes every dijit. You probably don't need this.
-};
-=====*/
-
-
-
-
-
-
-
-
-
-
-// Editor
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// Form widgets
-
-
-// Button widgets
-
-
-
-
-
-
-
-// TextBox widgets
-
-
-
-
-
-
-
-// Select widgets
-
-
-
-
-
-// Slider widgets
-
-
-
-
-
-
-
-// Textarea widgets
-
-
-
-// Layout widgets
-
-
-
- //deprecated
-
- //deprecated
-
-
-
-}
-
-
-dojo.i18n._preloadLocalizations("dijit.nls.dijit-all", ["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"]);
diff --git a/lib/dijit/dijit.js b/lib/dijit/dijit.js
index 77b70ab93..8d4f2ae8e 100644
--- a/lib/dijit/dijit.js
+++ b/lib/dijit/dijit.js
@@ -1,14 +1,38 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
-/*
- This is an optimized version of Dojo, built for deployment and not for
- development. To get sources and documentation, please visit:
- http://dojotoolkit.org
-*/
+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
-if(!dojo._hasResource["dojo.window"]){dojo._hasResource["dojo.window"]=true;dojo.provide("dojo.window");dojo.window.getBox=function(){var _1=(dojo.doc.compatMode=="BackCompat")?dojo.body():dojo.doc.documentElement;var _2=dojo._docScroll();return {w:_1.clientWidth,h:_1.clientHeight,l:_2.x,t:_2.y};};dojo.window.get=function(_3){if(dojo.isIE&&window!==document.parentWindow){_3.parentWindow.execScript("document._parentWindow = window;","Javascript");var _4=_3._parentWindow;_3._parentWindow=null;return _4;}return _3.parentWindow||_3.defaultView;};dojo.window.scrollIntoView=function(_5,_6){try{_5=dojo.byId(_5);var _7=_5.ownerDocument||dojo.doc,_8=_7.body||dojo.body(),_9=_7.documentElement||_8.parentNode,_a=dojo.isIE,_b=dojo.isWebKit;if((!(dojo.isMoz||_a||_b||dojo.isOpera)||_5==_8||_5==_9)&&(typeof _5.scrollIntoView!="undefined")){_5.scrollIntoView(false);return;}var _c=_7.compatMode=="BackCompat",_d=_c?_8:_9,_e=_b?_8:_d,_f=_d.clientWidth,_10=_d.clientHeight,rtl=!dojo._isBodyLtr(),_11=_6||dojo.position(_5),el=_5.parentNode,_12=function(el){return ((_a<=6||(_a&&_c))?false:(dojo.style(el,"position").toLowerCase()=="fixed"));};if(_12(_5)){return;}while(el){if(el==_8){el=_e;}var _13=dojo.position(el),_14=_12(el);if(el==_e){_13.w=_f;_13.h=_10;if(_e==_9&&_a&&rtl){_13.x+=_e.offsetWidth-_13.w;}if(_13.x<0||!_a){_13.x=0;}if(_13.y<0||!_a){_13.y=0;}}else{var pb=dojo._getPadBorderExtents(el);_13.w-=pb.w;_13.h-=pb.h;_13.x+=pb.l;_13.y+=pb.t;}if(el!=_e){var _15=el.clientWidth,_16=_13.w-_15;if(_15>0&&_16>0){_13.w=_15;if(_a&&rtl){_13.x+=_16;}}_15=el.clientHeight;_16=_13.h-_15;if(_15>0&&_16>0){_13.h=_15;}}if(_14){if(_13.y<0){_13.h+=_13.y;_13.y=0;}if(_13.x<0){_13.w+=_13.x;_13.x=0;}if(_13.y+_13.h>_10){_13.h=_10-_13.y;}if(_13.x+_13.w>_f){_13.w=_f-_13.x;}}var l=_11.x-_13.x,t=_11.y-Math.max(_13.y,0),r=l+_11.w-_13.w,bot=t+_11.h-_13.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);_11.x+=el.scrollLeft;el.scrollLeft+=(_a>=8&&!_c&&rtl)?-s:s;_11.x-=el.scrollLeft;}if(bot*t>0){_11.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_11.y-=el.scrollTop;}el=(el!=_e)&&!_14&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);_5.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(_17){if(this._hash[_17.id]){throw new Error("Tried to register widget with id=="+_17.id+" but that id is already registered");}this._hash[_17.id]=_17;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_18,_19){_19=_19||dojo.global;var i=0,id;for(id in this._hash){_18.call(_19,this._hash[id],i++,this._hash);}return this;},filter:function(_1a,_1b){_1b=_1b||dojo.global;var res=new dijit.WidgetSet(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_1a.call(_1b,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,_1c;for(id in this._hash){_1c=this._hash[id];if(_1c.declaredClass==cls){res.add(_1c);}}return res;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(_1d,_1e){return dojo.map(this.toArray(),_1d,_1e);},every:function(_1f,_20){_20=_20||dojo.global;var x=0,i;for(i in this._hash){if(!_1f.call(_20,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(_21,_22){_22=_22||dojo.global;var x=0,i;for(i in this._hash){if(_21.call(_22,this._hash[i],x++,this._hash)){return true;}}return false;}});(function(){dijit.registry=new dijit.WidgetSet();var _23=dijit.registry._hash,_24=dojo.attr,_25=dojo.hasAttr,_26=dojo.style;dijit.byId=function(id){return typeof id=="string"?_23[id]:id;};var _27={};dijit.getUniqueId=function(_28){var id;do{id=_28+"_"+(_28 in _27?++_27[_28]:_27[_28]=0);}while(_23[id]);return dijit._scopeName=="dijit"?id:dijit._scopeName+"_"+id;};dijit.findWidgets=function(_29){var _2a=[];function _2b(_2c){for(var _2d=_2c.firstChild;_2d;_2d=_2d.nextSibling){if(_2d.nodeType==1){var _2e=_2d.getAttribute("widgetId");if(_2e){_2a.push(_23[_2e]);}else{_2b(_2d);}}}};_2b(_29);return _2a;};dijit._destroyAll=function(){dijit._curFocus=null;dijit._prevFocus=null;dijit._activeStack=[];dojo.forEach(dijit.findWidgets(dojo.body()),function(_2f){if(!_2f._destroyed){if(_2f.destroyRecursive){_2f.destroyRecursive();}else{if(_2f.destroy){_2f.destroy();}}}});};if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit._destroyAll();});}dijit.byNode=function(_30){return _23[_30.getAttribute("widgetId")];};dijit.getEnclosingWidget=function(_31){while(_31){var id=_31.getAttribute&&_31.getAttribute("widgetId");if(id){return _23[id];}_31=_31.parentNode;}return null;};var _32=(dijit._isElementShown=function(_33){var s=_26(_33);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_24(_33,"type")!="hidden");});dijit.hasDefaultTabStop=function(_34){switch(_34.nodeName.toLowerCase()){case "a":return _25(_34,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":if(dojo.isMoz){try{return _34.contentDocument.designMode=="on";}catch(err){return false;}}else{if(dojo.isWebKit){var doc=_34.contentDocument,_35=doc&&doc.body;return _35&&_35.contentEditable=="true";}else{try{doc=_34.contentWindow.document;_35=doc&&doc.body;return _35&&_35.firstChild&&_35.firstChild.contentEditable=="true";}catch(e){return false;}}}default:return _34.contentEditable=="true";}};var _36=(dijit.isTabNavigable=function(_37){if(_24(_37,"disabled")){return false;}else{if(_25(_37,"tabIndex")){return _24(_37,"tabIndex")>=0;}else{return dijit.hasDefaultTabStop(_37);}}});dijit._getTabNavigable=function(_38){var _39,_3a,_3b,_3c,_3d,_3e;var _3f=function(_40){dojo.query("> *",_40).forEach(function(_41){if((dojo.isIE&&_41.scopeName!=="HTML")||!_32(_41)){return;}if(_36(_41)){var _42=_24(_41,"tabIndex");if(!_25(_41,"tabIndex")||_42==0){if(!_39){_39=_41;}_3a=_41;}else{if(_42>0){if(!_3b||_42<_3c){_3c=_42;_3b=_41;}if(!_3d||_42>=_3e){_3e=_42;_3d=_41;}}}}if(_41.nodeName.toUpperCase()!="SELECT"){_3f(_41);}});};if(_32(_38)){_3f(_38);}return {first:_39,last:_3a,lowest:_3b,highest:_3d};};dijit.getFirstInTabbingOrder=function(_43){var _44=dijit._getTabNavigable(dojo.byId(_43));return _44.lowest?_44.lowest:_44.first;};dijit.getLastInTabbingOrder=function(_45){var _46=dijit._getTabNavigable(dojo.byId(_45));return _46.last?_46.last:_46.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};}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(_47){var _48=dojo.doc,_49=_47.mark;if(_49){if(dojo.global.getSelection){var sel=dojo.global.getSelection();if(sel&&sel.removeAllRanges){if(_49.pRange){var r=_49;var n=r.node;n.selectionStart=r.start;n.selectionEnd=r.end;}else{sel.removeAllRanges();sel.addRange(_49);}}else{console.warn("No idea how to restore selection for this browser!");}}else{if(_48.selection&&_49){var rg;if(_49.pRange){rg=_49.range;}else{if(dojo.isArray(_49)){rg=_48.body.createControlRange();dojo.forEach(_49,function(n){rg.addElement(n);});}else{rg=_48.body.createTextRange();rg.moveToBookmark(_49);}}rg.select();}}}},getFocus:function(_4a,_4b){var _4c=!dijit._curFocus||(_4a&&dojo.isDescendant(dijit._curFocus,_4a.domNode))?dijit._prevFocus:dijit._curFocus;return {node:_4c,bookmark:(_4c==dijit._curFocus)&&dojo.withGlobal(_4b||dojo.global,dijit.getBookmark),openedForWindow:_4b};},focus:function(_4d){if(!_4d){return;}var _4e="node" in _4d?_4d.node:_4d,_4f=_4d.bookmark,_50=_4d.openedForWindow,_51=_4f?_4f.isCollapsed:false;if(_4e){var _52=(_4e.tagName.toLowerCase()=="iframe")?_4e.contentWindow:_4e;if(_52&&_52.focus){try{_52.focus();}catch(e){}}dijit._onFocusNode(_4e);}if(_4f&&dojo.withGlobal(_50||dojo.global,dijit.isCollapsed)&&!_51){if(_50){_50.focus();}try{dojo.withGlobal(_50||dojo.global,dijit.moveToBookmark,null,[_4f]);}catch(e2){}}},_activeStack:[],registerIframe:function(_53){return dijit.registerWin(_53.contentWindow,_53);},unregisterIframe:function(_54){dijit.unregisterWin(_54);},registerWin:function(_55,_56){var _57=function(evt){dijit._justMouseDowned=true;setTimeout(function(){dijit._justMouseDowned=false;},0);if(dojo.isIE&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}dijit._onTouchNode(_56||evt.target||evt.srcElement,"mouse");};var doc=dojo.isIE?_55.document.documentElement:_55.document;if(doc){if(dojo.isIE){doc.attachEvent("onmousedown",_57);var _58=function(evt){if(evt.srcElement.tagName.toLowerCase()!="#document"&&dijit.isTabNavigable(evt.srcElement)){dijit._onFocusNode(_56||evt.srcElement);}else{dijit._onTouchNode(_56||evt.srcElement);}};doc.attachEvent("onactivate",_58);var _59=function(evt){dijit._onBlurNode(_56||evt.srcElement);};doc.attachEvent("ondeactivate",_59);return function(){doc.detachEvent("onmousedown",_57);doc.detachEvent("onactivate",_58);doc.detachEvent("ondeactivate",_59);doc=null;};}else{doc.addEventListener("mousedown",_57,true);var _5a=function(evt){dijit._onFocusNode(_56||evt.target);};doc.addEventListener("focus",_5a,true);var _5b=function(evt){dijit._onBlurNode(_56||evt.target);};doc.addEventListener("blur",_5b,true);return function(){doc.removeEventListener("mousedown",_57,true);doc.removeEventListener("focus",_5a,true);doc.removeEventListener("blur",_5b,true);doc=null;};}}},unregisterWin:function(_5c){_5c&&_5c();},_onBlurNode:function(_5d){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(_5e,by){if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);delete dijit._clearActiveWidgetsTimer;}var _5f=[];try{while(_5e){var _60=dojo.attr(_5e,"dijitPopupParent");if(_60){_5e=dijit.byId(_60).domNode;}else{if(_5e.tagName&&_5e.tagName.toLowerCase()=="body"){if(_5e===dojo.body()){break;}_5e=dojo.window.get(_5e.ownerDocument).frameElement;}else{var id=_5e.getAttribute&&_5e.getAttribute("widgetId"),_61=id&&dijit.byId(id);if(_61&&!(by=="mouse"&&_61.get("disabled"))){_5f.unshift(id);}_5e=_5e.parentNode;}}}}catch(e){}dijit._setStack(_5f,by);},_onFocusNode:function(_62){if(!_62){return;}if(_62.nodeType==9){return;}dijit._onTouchNode(_62);if(_62==dijit._curFocus){return;}if(dijit._curFocus){dijit._prevFocus=dijit._curFocus;}dijit._curFocus=_62;dojo.publish("focusNode",[_62]);},_setStack:function(_63,by){var _64=dijit._activeStack;dijit._activeStack=_63;for(var _65=0;_65<Math.min(_64.length,_63.length);_65++){if(_64[_65]!=_63[_65]){break;}}var _66;for(var i=_64.length-1;i>=_65;i--){_66=dijit.byId(_64[i]);if(_66){_66._focused=false;_66._hasBeenBlurred=true;if(_66._onBlur){_66._onBlur(by);}dojo.publish("widgetBlur",[_66,by]);}}for(i=_65;i<_63.length;i++){_66=dijit.byId(_63[i]);if(_66){_66._focused=true;if(_66._onFocus){_66._onFocus(by);}dojo.publish("widgetFocus",[_66,by]);}}}});dojo.addOnLoad(function(){var _67=dijit.registerWin(window);if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit.unregisterWin(_67);_67=null;});}});}if(!dojo._hasResource["dojo.AdapterRegistry"]){dojo._hasResource["dojo.AdapterRegistry"]=true;dojo.provide("dojo.AdapterRegistry");dojo.AdapterRegistry=function(_68){this.pairs=[];this.returnWrappers=_68||false;};dojo.extend(dojo.AdapterRegistry,{register:function(_69,_6a,_6b,_6c,_6d){this.pairs[((_6d)?"unshift":"push")]([_69,_6a,_6b,_6c]);},match:function(){for(var i=0;i<this.pairs.length;i++){var _6e=this.pairs[i];if(_6e[1].apply(this,arguments)){if((_6e[3])||(this.returnWrappers)){return _6e[2];}else{return _6e[2].apply(this,arguments);}}}throw new Error("No match found");},unregister:function(_6f){for(var i=0;i<this.pairs.length;i++){var _70=this.pairs[i];if(_70[0]==_6f){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(_71,pos,_72,_73){var _74=dojo.map(_72,function(_75){var c={corner:_75,pos:{x:pos.x,y:pos.y}};if(_73){c.pos.x+=_75.charAt(1)=="L"?_73.x:-_73.x;c.pos.y+=_75.charAt(0)=="T"?_73.y:-_73.y;}return c;});return dijit._place(_71,_74);};dijit._place=function(_76,_77,_78){var _79=dojo.window.getBox();if(!_76.parentNode||String(_76.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(_76);}var _7a=null;dojo.some(_77,function(_7b){var _7c=_7b.corner;var pos=_7b.pos;if(_78){_78(_76,_7b.aroundCorner,_7c);}var _7d=_76.style;var _7e=_7d.display;var _7f=_7d.visibility;_7d.visibility="hidden";_7d.display="";var mb=dojo.marginBox(_76);_7d.display=_7e;_7d.visibility=_7f;var _80=Math.max(_79.l,_7c.charAt(1)=="L"?pos.x:(pos.x-mb.w)),_81=Math.max(_79.t,_7c.charAt(0)=="T"?pos.y:(pos.y-mb.h)),_82=Math.min(_79.l+_79.w,_7c.charAt(1)=="L"?(_80+mb.w):pos.x),_83=Math.min(_79.t+_79.h,_7c.charAt(0)=="T"?(_81+mb.h):pos.y),_84=_82-_80,_85=_83-_81,_86=(mb.w-_84)+(mb.h-_85);if(_7a==null||_86<_7a.overflow){_7a={corner:_7c,aroundCorner:_7b.aroundCorner,x:_80,y:_81,w:_84,h:_85,overflow:_86};}return !_86;});_76.style.left=_7a.x+"px";_76.style.top=_7a.y+"px";if(_7a.overflow&&_78){_78(_76,_7a.aroundCorner,_7a.corner);}return _7a;};dijit.placeOnScreenAroundNode=function(_87,_88,_89,_8a){_88=dojo.byId(_88);var _8b=_88.style.display;_88.style.display="";var _8c=dojo.position(_88,true);_88.style.display=_8b;return dijit._placeOnScreenAroundRect(_87,_8c.x,_8c.y,_8c.w,_8c.h,_89,_8a);};dijit.placeOnScreenAroundRectangle=function(_8d,_8e,_8f,_90){return dijit._placeOnScreenAroundRect(_8d,_8e.x,_8e.y,_8e.width,_8e.height,_8f,_90);};dijit._placeOnScreenAroundRect=function(_91,x,y,_92,_93,_94,_95){var _96=[];for(var _97 in _94){_96.push({aroundCorner:_97,corner:_94[_97],pos:{x:x+(_97.charAt(1)=="L"?0:_92),y:y+(_97.charAt(0)=="T"?0:_93)}});}return dijit._place(_91,_96,_95);};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(_98,_99,_9a,_9b){return dijit.placementRegistry.match.apply(dijit.placementRegistry,arguments);};dijit.getPopupAroundAlignment=function(_9c,_9d){var _9e={};dojo.forEach(_9c,function(pos){switch(pos){case "after":_9e[_9d?"BR":"BL"]=_9d?"BL":"BR";break;case "before":_9e[_9d?"BL":"BR"]=_9d?"BR":"BL";break;case "below":_9e[_9d?"BL":"BR"]=_9d?"TL":"TR";_9e[_9d?"BR":"BL"]=_9d?"TR":"TL";break;case "above":default:_9e[_9d?"TL":"TR"]=_9d?"BL":"BR";_9e[_9d?"TR":"TL"]=_9d?"BR":"BL";break;}});return _9e;};}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,moveOffScreen:function(_9f){var _a0=_9f.parentNode;if(!_a0||!dojo.hasClass(_a0,"dijitPopup")){_a0=dojo.create("div",{"class":"dijitPopup",style:{visibility:"hidden",top:"-9999px"}},dojo.body());dijit.setWaiRole(_a0,"presentation");_a0.appendChild(_9f);}var s=_9f.style;s.display="";s.visibility="";s.position="";s.top="0px";dojo.style(_a0,{visibility:"hidden",top:"-9999px"});},getTopPopup:function(){var _a1=this._stack;for(var pi=_a1.length-1;pi>0&&_a1[pi].parent===_a1[pi-1].widget;pi--){}return _a1[pi];},open:function(_a2){var _a3=this._stack,_a4=_a2.popup,_a5=_a2.orient||((_a2.parent?_a2.parent.isLeftToRight():dojo._isBodyLtr())?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"}),_a6=_a2.around,id=(_a2.around&&_a2.around.id)?(_a2.around.id+"_dropdown"):("popup_"+this._idGen++);var _a7=_a4.domNode.parentNode;if(!_a7||!dojo.hasClass(_a7,"dijitPopup")){this.moveOffScreen(_a4.domNode);_a7=_a4.domNode.parentNode;}dojo.attr(_a7,{id:id,style:{zIndex:this._beginZIndex+_a3.length},"class":"dijitPopup "+(_a4.baseClass||_a4["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:_a2.parent?_a2.parent.id:""});if(dojo.isIE||dojo.isMoz){var _a8=_a7.childNodes[1];if(!_a8){_a8=new dijit.BackgroundIframe(_a7);}}var _a9=_a6?dijit.placeOnScreenAroundElement(_a7,_a6,_a5,_a4.orient?dojo.hitch(_a4,"orient"):null):dijit.placeOnScreen(_a7,_a2,_a5=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_a2.padding);_a7.style.visibility="visible";_a4.domNode.style.visibility="visible";var _aa=[];_aa.push(dojo.connect(_a7,"onkeypress",this,function(evt){if(evt.charOrCode==dojo.keys.ESCAPE&&_a2.onCancel){dojo.stopEvent(evt);_a2.onCancel();}else{if(evt.charOrCode===dojo.keys.TAB){dojo.stopEvent(evt);var _ab=this.getTopPopup();if(_ab&&_ab.onCancel){_ab.onCancel();}}}}));if(_a4.onCancel){_aa.push(dojo.connect(_a4,"onCancel",_a2.onCancel));}_aa.push(dojo.connect(_a4,_a4.onExecute?"onExecute":"onChange",this,function(){var _ac=this.getTopPopup();if(_ac&&_ac.onExecute){_ac.onExecute();}}));_a3.push({wrapper:_a7,iframe:_a8,widget:_a4,parent:_a2.parent,onExecute:_a2.onExecute,onCancel:_a2.onCancel,onClose:_a2.onClose,handlers:_aa});if(_a4.onOpen){_a4.onOpen(_a9);}return _a9;},close:function(_ad){var _ae=this._stack;while(dojo.some(_ae,function(_af){return _af.widget==_ad;})){var top=_ae.pop(),_b0=top.wrapper,_b1=top.iframe,_b2=top.widget,_b3=top.onClose;if(_b2.onClose){_b2.onClose();}dojo.forEach(top.handlers,dojo.disconnect);if(_b2&&_b2.domNode){this.moveOffScreen(_b2.domNode);}else{dojo.destroy(_b0);}if(_b3){_b3();}}}};dijit._frames=new function(){var _b4=[];this.pop=function(){var _b5;if(_b4.length){_b5=_b4.pop();_b5.style.display="";}else{if(dojo.isIE){var _b6=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"")||"javascript:\"\"";var _b7="<iframe src='"+_b6+"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";_b5=dojo.doc.createElement(_b7);}else{_b5=dojo.create("iframe");_b5.src="javascript:\"\"";_b5.className="dijitBackgroundIframe";dojo.style(_b5,"opacity",0.1);}_b5.tabIndex=-1;dijit.setWaiRole(_b5,"presentation");}return _b5;};this.push=function(_b8){_b8.style.display="none";_b4.push(_b8);};}();dijit.BackgroundIframe=function(_b9){if(!_b9.id){throw new Error("no id");}if(dojo.isIE||dojo.isMoz){var _ba=dijit._frames.pop();_b9.appendChild(_ba);if(dojo.isIE<7){this.resize(_b9);this._conn=dojo.connect(_b9,"onresize",this,function(){this.resize(_b9);});}else{dojo.style(_ba,{width:"100%",height:"100%"});}this.iframe=_ba;}};dojo.extend(dijit.BackgroundIframe,{resize:function(_bb){if(this.iframe&&dojo.isIE<7){dojo.style(this.iframe,{width:_bb.offsetWidth+"px",height:_bb.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(_bc,pos){dojo.window.scrollIntoView(_bc,pos);};}if(!dojo._hasResource["dojo.uacss"]){dojo._hasResource["dojo.uacss"]=true;dojo.provide("dojo.uacss");(function(){var d=dojo,_bd=d.doc.documentElement,ie=d.isIE,_be=d.isOpera,maj=Math.floor,ff=d.isFF,_bf=d.boxModel.replace(/-/,""),_c0={dj_ie:ie,dj_ie6:maj(ie)==6,dj_ie7:maj(ie)==7,dj_ie8:maj(ie)==8,dj_quirks:d.isQuirks,dj_iequirks:ie&&d.isQuirks,dj_opera:_be,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};_c0["dj_"+_bf]=true;var _c1="";for(var clz in _c0){if(_c0[clz]){_c1+=clz+" ";}}_bd.className=d.trim(_bd.className+" "+_c1);dojo._loaders.unshift(function(){if(!dojo._isBodyLtr()){var _c2="dj_rtl dijitRtl "+_c1.replace(/ /g,"-rtl ");_bd.className=d.trim(_bd.className+" "+_c2);}});})();}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,_c3,_c4,_c5,obj,_c6,_c7,_c8){if(obj!=this._obj){this.stop();this._initialDelay=_c7||500;this._subsequentDelay=_c6||0.9;this._minDelay=_c8||10;this._obj=obj;this._evt=evt;this._node=_c4;this._currentTimeout=-1;this._count=-1;this._callback=dojo.hitch(_c3,_c5);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(_c9,_ca,_cb,_cc,_cd,_ce,_cf){if(_ca.keyCode){_ca.charOrCode=_ca.keyCode;dojo.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_ca.charCode){_ca.charOrCode=String.fromCharCode(_ca.charCode);dojo.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}return [dojo.connect(_c9,"onkeypress",this,function(evt){if(evt.charOrCode==_ca.charOrCode&&(_ca.ctrlKey===undefined||_ca.ctrlKey==evt.ctrlKey)&&(_ca.altKey===undefined||_ca.altKey==evt.altKey)&&(_ca.metaKey===undefined||_ca.metaKey==(evt.metaKey||false))&&(_ca.shiftKey===undefined||_ca.shiftKey==evt.shiftKey)){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_cb,_c9,_cc,_ca,_cd,_ce,_cf);}else{if(dijit.typematic._obj==_ca){dijit.typematic.stop();}}}),dojo.connect(_c9,"onkeyup",this,function(evt){if(dijit.typematic._obj==_ca){dijit.typematic.stop();}})];},addMouseListener:function(_d0,_d1,_d2,_d3,_d4,_d5){var dc=dojo.connect;return [dc(_d0,"mousedown",this,function(evt){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_d1,_d0,_d2,_d0,_d3,_d4,_d5);}),dc(_d0,"mouseup",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_d0,"mouseout",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_d0,"mousemove",this,function(evt){evt.preventDefault();}),dc(_d0,"dblclick",this,function(evt){dojo.stopEvent(evt);if(dojo.isIE){dijit.typematic.trigger(evt,_d1,_d0,_d2,_d0,_d3,_d4,_d5);setTimeout(dojo.hitch(this,dijit.typematic.stop),50);}})];},addListener:function(_d6,_d7,_d8,_d9,_da,_db,_dc,_dd){return this.addKeyListener(_d7,_d8,_d9,_da,_db,_dc,_dd).concat(this.addMouseListener(_d6,_d9,_da,_db,_dc,_dd));}};}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 _de=cs.backgroundImage;var _df=(cs.borderTopColor==cs.borderRightColor)||(_de!=null&&(_de=="none"||_de=="url(invalid-url:)"));dojo[_df?"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,{_XhtmlRoles:/banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,hasWaiRole:function(_e0,_e1){var _e2=this.getWaiRole(_e0);return _e1?(_e2.indexOf(_e1)>-1):(_e2.length>0);},getWaiRole:function(_e3){return dojo.trim((dojo.attr(_e3,"role")||"").replace(this._XhtmlRoles,"").replace("wairole:",""));},setWaiRole:function(_e4,_e5){var _e6=dojo.attr(_e4,"role")||"";if(!this._XhtmlRoles.test(_e6)){dojo.attr(_e4,"role",_e5);}else{if((" "+_e6+" ").indexOf(" "+_e5+" ")<0){var _e7=dojo.trim(_e6.replace(this._XhtmlRoles,""));var _e8=dojo.trim(_e6.replace(_e7,""));dojo.attr(_e4,"role",_e8+(_e8?" ":"")+_e5);}}},removeWaiRole:function(_e9,_ea){var _eb=dojo.attr(_e9,"role");if(!_eb){return;}if(_ea){var t=dojo.trim((" "+_eb+" ").replace(" "+_ea+" "," "));dojo.attr(_e9,"role",t);}else{_e9.removeAttribute("role");}},hasWaiState:function(_ec,_ed){return _ec.hasAttribute?_ec.hasAttribute("aria-"+_ed):!!_ec.getAttribute("aria-"+_ed);},getWaiState:function(_ee,_ef){return _ee.getAttribute("aria-"+_ef)||"";},setWaiState:function(_f0,_f1,_f2){_f0.setAttribute("aria-"+_f1,_f2);},removeWaiState:function(_f3,_f4){_f3.removeAttribute("aria-"+_f4);}});}if(!dojo._hasResource["dijit._base"]){dojo._hasResource["dijit._base"]=true;dojo.provide("dijit._base");}if(!dojo._hasResource["dojo.date.stamp"]){dojo._hasResource["dojo.date.stamp"]=true;dojo.provide("dojo.date.stamp");dojo.date.stamp.fromISOString=function(_f5,_f6){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 _f7=dojo.date.stamp._isoRegExp.exec(_f5),_f8=null;if(_f7){_f7.shift();if(_f7[1]){_f7[1]--;}if(_f7[6]){_f7[6]*=1000;}if(_f6){_f6=new Date(_f6);dojo.forEach(dojo.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(_f9){return _f6["get"+_f9]();}),function(_fa,_fb){_f7[_fb]=_f7[_fb]||_fa;});}_f8=new Date(_f7[0]||1970,_f7[1]||0,_f7[2]||1,_f7[3]||0,_f7[4]||0,_f7[5]||0,_f7[6]||0);if(_f7[0]<100){_f8.setFullYear(_f7[0]||1970);}var _fc=0,_fd=_f7[7]&&_f7[7].charAt(0);if(_fd!="Z"){_fc=((_f7[8]||0)*60)+(Number(_f7[9])||0);if(_fd!="-"){_fc*=-1;}}if(_fd){_fc-=_f8.getTimezoneOffset();}if(_fc){_f8.setTime(_f8.getTime()+_fc*60000);}}return _f8;};dojo.date.stamp.toISOString=function(_fe,_ff){var _100=function(n){return (n<10)?"0"+n:n;};_ff=_ff||{};var _101=[],_102=_ff.zulu?"getUTC":"get",date="";if(_ff.selector!="time"){var year=_fe[_102+"FullYear"]();date=["0000".substr((year+"").length)+year,_100(_fe[_102+"Month"]()+1),_100(_fe[_102+"Date"]())].join("-");}_101.push(date);if(_ff.selector!="date"){var time=[_100(_fe[_102+"Hours"]()),_100(_fe[_102+"Minutes"]()),_100(_fe[_102+"Seconds"]())].join(":");var _103=_fe[_102+"Milliseconds"]();if(_ff.milliseconds){time+="."+(_103<100?"0":"")+_100(_103);}if(_ff.zulu){time+="Z";}else{if(_ff.selector!="time"){var _104=_fe.getTimezoneOffset();var _105=Math.abs(_104);time+=(_104>0?"-":"+")+_100(Math.floor(_105/60))+":"+_100(_105%60);}}_101.push(time);}return _101.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;this._attrName=d._scopeName+"Type";this._query="["+this._attrName+"]";function _106(_107){if(d.isString(_107)){return "string";}if(typeof _107=="number"){return "number";}if(typeof _107=="boolean"){return "boolean";}if(d.isFunction(_107)){return "function";}if(d.isArray(_107)){return "array";}if(_107 instanceof Date){return "date";}if(_107 instanceof d._Url){return "url";}return "object";};function _108(_109,type){switch(type){case "string":return _109;case "number":return _109.length?Number(_109):NaN;case "boolean":return typeof _109=="boolean"?_109:!(_109.toLowerCase()=="false");case "function":if(d.isFunction(_109)){_109=_109.toString();_109=d.trim(_109.substring(_109.indexOf("{")+1,_109.length-1));}try{if(_109===""||_109.search(/[^\w\.]+/i)!=-1){return new Function(_109);}else{return d.getObject(_109,false)||new Function(_109);}}catch(e){return new Function();}case "array":return _109?_109.split(/\s*,\s*/):[];case "date":switch(_109){case "":return new Date("");case "now":return new Date();default:return d.date.stamp.fromISOString(_109);}case "url":return d.baseUrl+_109;default:return d.fromJson(_109);}};var _10a={};dojo.connect(dojo,"extend",function(){_10a={};});function _10b(_10c){if(!_10a[_10c]){var cls=d.getObject(_10c);if(!cls){return null;}var _10d=cls.prototype;var _10e={},_10f={};for(var name in _10d){if(name.charAt(0)=="_"){continue;}if(name in _10f){continue;}var _110=_10d[name];_10e[name]=_106(_110);}_10a[_10c]={cls:cls,params:_10e};}return _10a[_10c];};this._functionFromScript=function(_111){var _112="";var _113="";var _114=_111.getAttribute("args");if(_114){d.forEach(_114.split(/\s*,\s*/),function(part,idx){_112+="var "+part+" = arguments["+idx+"]; ";});}var _115=_111.getAttribute("with");if(_115&&_115.length){d.forEach(_115.split(/\s*,\s*/),function(part){_112+="with("+part+"){";_113+="}";});}return new Function(_112+_111.innerHTML+_113);};this.instantiate=function(_116,_117,args){var _118=[],dp=dojo.parser;_117=_117||{};args=args||{};d.forEach(_116,function(obj){if(!obj){return;}var node,type,_119,_11a,_11b;if(obj.node){node=obj.node;type=obj.type;_119=obj.clsInfo||(type&&_10b(type));_11a=_119&&_119.cls;_11b=obj.scripts;}else{node=obj;type=dp._attrName in _117?_117[dp._attrName]:node.getAttribute(dp._attrName);_119=type&&_10b(type);_11a=_119&&_119.cls;_11b=(_11a&&(_11a._noScript||_11a.prototype._noScript)?[]:d.query("> script[type^='dojo/']",node));}if(!_119){throw new Error("Could not load class '"+type);}var _11c={},_11d=node.attributes;if(args.defaults){dojo.mixin(_11c,args.defaults);}if(obj.inherited){dojo.mixin(_11c,obj.inherited);}for(var name in _119.params){var item=name in _117?{value:_117[name],specified:true}:_11d.getNamedItem(name);if(!item||(!item.specified&&(!dojo.isIE||name.toLowerCase()!="value"))){continue;}var _11e=item.value;switch(name){case "class":_11e="className" in _117?_117.className:node.className;break;case "style":_11e="style" in _117?_117.style:(node.style&&node.style.cssText);}var _11f=_119.params[name];if(typeof _11e=="string"){_11c[name]=_108(_11e,_11f);}else{_11c[name]=_11e;}}var _120=[],_121=[];d.forEach(_11b,function(_122){node.removeChild(_122);var _123=_122.getAttribute("event"),type=_122.getAttribute("type"),nf=d.parser._functionFromScript(_122);if(_123){if(type=="dojo/connect"){_120.push({event:_123,func:nf});}else{_11c[_123]=nf;}}else{_121.push(nf);}});var _124=_11a.markupFactory||_11a.prototype&&_11a.prototype.markupFactory;var _125=_124?_124(_11c,node,_11a):new _11a(_11c,node);_118.push(_125);var _126=node.getAttribute("jsId");if(_126){d.setObject(_126,_125);}d.forEach(_120,function(_127){d.connect(_125,_127.event,null,_127.func);});d.forEach(_121,function(func){func.call(_125);});});if(!_117._started){d.forEach(_118,function(_128){if(!args.noStart&&_128&&_128.startup&&!_128._started&&(!_128.getParent||!_128.getParent())){_128.startup();}});}return _118;};this.parse=function(_129,args){var root;if(!args&&_129&&_129.rootNode){args=_129;root=args.rootNode;}else{root=_129;}var _12a=this._attrName;function scan(_12b,list){var _12c=dojo.clone(_12b.inherited);dojo.forEach(["dir","lang"],function(name){var val=_12b.node.getAttribute(name);if(val){_12c[name]=val;}});var _12d=_12b.scripts;var _12e=!_12b.clsInfo||!_12b.clsInfo.cls.prototype.stopParser;for(var _12f=_12b.node.firstChild;_12f;_12f=_12f.nextSibling){if(_12f.nodeType==1){var type=_12e&&_12f.getAttribute(_12a);if(type){var _130={"type":type,clsInfo:_10b(type),node:_12f,scripts:[],inherited:_12c};list.push(_130);scan(_130,list);}else{if(_12d&&_12f.nodeName.toLowerCase()=="script"){type=_12f.getAttribute("type");if(type&&/^dojo\//i.test(type)){_12d.push(_12f);}}else{if(_12e){scan({node:_12f,inherited:_12c},list);}}}}}};var list=[];scan({node:root?dojo.byId(root):dojo.body(),inherited:(args&&args.inherited)||{dir:dojo._isBodyLtr()?"ltr":"rtl"}},list);return this.instantiate(list,null,args);};}();(function(){var _131=function(){if(dojo.config.parseOnLoad){dojo.parser.parse();}};if(dojo.exists("dijit.wai.onload")&&(dijit.wai.onload===dojo._loaders[0])){dojo._loaders.splice(1,0,_131);}else{dojo._loaders.unshift(_131);}})();}if(!dojo._hasResource["dijit._Widget"]){dojo._hasResource["dijit._Widget"]=true;dojo.provide("dijit._Widget");dojo.require("dijit._base");dojo.connect(dojo,"_connect",function(_132,_133){if(_132&&dojo.isFunction(_132._onConnect)){_132._onConnect(_133);}});dijit._connectOnUseEventHandler=function(_134){};dijit._lastKeyDownNode=null;if(dojo.isIE){(function(){var _135=function(evt){dijit._lastKeyDownNode=evt.srcElement;};dojo.doc.attachEvent("onkeydown",_135);dojo.addOnWindowUnload(function(){dojo.doc.detachEvent("onkeydown",_135);});})();}else{dojo.doc.addEventListener("keydown",function(evt){dijit._lastKeyDownNode=evt.target;},true);}(function(){var _136={},_137=function(_138){var dc=_138.declaredClass;if(!_136[dc]){var r=[],_139,_13a=_138.constructor.prototype;for(var _13b in _13a){if(dojo.isFunction(_13a[_13b])&&(_139=_13b.match(/^_set([a-zA-Z]*)Attr$/))&&_139[1]){r.push(_139[1].charAt(0).toLowerCase()+_139[1].substr(1));}}_136[dc]=r;}return _136[dc]||[];};dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_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,_blankGif:(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif")).toString(),postscript:function(_13c,_13d){this.create(_13c,_13d);},create:function(_13e,_13f){this.srcNodeRef=dojo.byId(_13f);this._connects=[];this._subscribes=[];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];}}if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_13e){this.params=_13e;dojo.mixin(this,_13e);}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 _140=this.srcNodeRef;if(_140&&_140.parentNode){_140.parentNode.replaceChild(this.domNode,_140);}for(attr in this.params){this._onConnect(attr);}}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 _141=function(attr,_142){if((_142.params&&attr in _142.params)||_142[attr]){_142.set(attr,_142[attr]);}};for(var attr in this.attributeMap){_141(attr,this);}dojo.forEach(_137(this),function(a){if(!(a in this.attributeMap)){_141(a,this);}},this);},postMixInProperties:function(){},buildRendering:function(){this.domNode=this.srcNodeRef||dojo.create("div");},postCreate:function(){if(this.baseClass){var _143=this.baseClass.split(" ");if(!this.isLeftToRight()){_143=_143.concat(dojo.map(_143,function(name){return name+"Rtl";}));}dojo.addClass(this.domNode,_143);}},startup:function(){this._started=true;},destroyRecursive:function(_144){this._beingDestroyed=true;this.destroyDescendants(_144);this.destroy(_144);},destroy:function(_145){this._beingDestroyed=true;this.uninitialize();var d=dojo,dfe=d.forEach,dun=d.unsubscribe;dfe(this._connects,function(_146){dfe(_146,d.disconnect);});dfe(this._subscribes,function(_147){dun(_147);});dfe(this._supportingWidgets||[],function(w){if(w.destroyRecursive){w.destroyRecursive();}else{if(w.destroy){w.destroy();}}});this.destroyRendering(_145);dijit.registry.remove(this.id);this._destroyed=true;},destroyRendering:function(_148){if(this.bgIframe){this.bgIframe.destroy(_148);delete this.bgIframe;}if(this.domNode){if(_148){dojo.removeAttr(this.domNode,"widgetId");}else{dojo.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_148){dojo.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_149){dojo.forEach(this.getChildren(),function(_14a){if(_14a.destroyRecursive){_14a.destroyRecursive(_149);}});},uninitialize:function(){return false;},onFocus:function(){},onBlur:function(){},_onFocus:function(e){this.onFocus();},_onBlur:function(){this.onBlur();},_onConnect:function(_14b){if(_14b in this._deferredConnects){var _14c=this[this._deferredConnects[_14b]||"domNode"];this.connect(_14c,_14b.toLowerCase(),_14b);delete this._deferredConnects[_14b];}},_setClassAttr:function(_14d){var _14e=this[this.attributeMap["class"]||"domNode"];dojo.removeClass(_14e,this["class"]);this["class"]=_14d;dojo.addClass(_14e,_14d);},_setStyleAttr:function(_14f){var _150=this[this.attributeMap.style||"domNode"];if(dojo.isObject(_14f)){dojo.style(_150,_14f);}else{if(_150.style.cssText){_150.style.cssText+="; "+_14f;}else{_150.style.cssText=_14f;}}this.style=_14f;},setAttribute:function(attr,_151){dojo.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");this.set(attr,_151);},_attrToDom:function(attr,_152){var _153=this.attributeMap[attr];dojo.forEach(dojo.isArray(_153)?_153:[_153],function(_154){var _155=this[_154.node||_154||"domNode"];var type=_154.type||"attribute";switch(type){case "attribute":if(dojo.isFunction(_152)){_152=dojo.hitch(this,_152);}var _156=_154.attribute?_154.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);dojo.attr(_155,_156,_152);break;case "innerText":_155.innerHTML="";_155.appendChild(dojo.doc.createTextNode(_152));break;case "innerHTML":_155.innerHTML=_152;break;case "class":dojo.removeClass(_155,this[attr]);dojo.addClass(_155,_152);break;}},this);this[attr]=_152;},attr:function(name,_157){if(dojo.config.isDebug){var _158=arguments.callee._ach||(arguments.callee._ach={}),_159=(arguments.callee.caller||"unknown caller").toString();if(!_158[_159]){dojo.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_159,"","2.0");_158[_159]=true;}}var args=arguments.length;if(args>=2||typeof name==="object"){return this.set.apply(this,arguments);}else{return this.get(name);}},get:function(name){var _15a=this._getAttrNames(name);return this[_15a.g]?this[_15a.g]():this[name];},set:function(name,_15b){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _15c=this._getAttrNames(name);if(this[_15c.s]){var _15d=this[_15c.s].apply(this,Array.prototype.slice.call(arguments,1));}else{if(name in this.attributeMap){this._attrToDom(name,_15b);}var _15e=this[name];this[name]=_15b;}return _15d||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"});},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):[];},nodesWithKeyClick:["input","button"],connect:function(obj,_15f,_160){var d=dojo,dc=d._connect,_161=[];if(_15f=="ondijitclick"){if(dojo.indexOf(this.nodesWithKeyClick,obj.nodeName.toLowerCase())==-1){var m=d.hitch(this,_160);_161.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;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);}}));}_15f="onclick";}_161.push(dc(obj,_15f,this,_160));this._connects.push(_161);return _161;},disconnect:function(_162){for(var i=0;i<this._connects.length;i++){if(this._connects[i]==_162){dojo.forEach(_162,dojo.disconnect);this._connects.splice(i,1);return;}}},subscribe:function(_163,_164){var d=dojo,_165=d.subscribe(_163,this,_164);this._subscribes.push(_165);return _165;},unsubscribe:function(_166){for(var i=0;i<this._subscribes.length;i++){if(this._subscribes[i]==_166){dojo.unsubscribe(_166);this._subscribes.splice(i,1);return;}}},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):dojo._isBodyLtr();},isFocusable:function(){return this.focus&&(dojo.style(this.domNode,"display")!="none");},placeAt:function(_167,_168){if(_167.declaredClass&&_167.addChild){_167.addChild(this,_168);}else{dojo.place(this.domNode,_167,_168);}return this;},_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.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(_169,map,_16a,_16b){_16b=_16b||dojo.global;_16a=_16a?dojo.hitch(_16b,_16a):function(v){return v;};return _169.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_16c,key,_16d){var _16e=dojo.getObject(key,false,map);if(_16d){_16e=dojo.getObject(_16d,false,_16b).call(_16b,_16e,key);}return _16a(_16e,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");(function(){var _16f={};dojo.cache=function(_170,url,_171){if(typeof _170=="string"){var _172=dojo.moduleUrl(_170,url);}else{_172=_170;_171=url;}var key=_172.toString();var val=_171;if(_171!=undefined&&!dojo.isString(_171)){val=("value" in _171?_171.value:undefined);}var _173=_171&&_171.sanitize?true:false;if(typeof val=="string"){val=_16f[key]=_173?dojo.cache._sanitize(val):val;}else{if(val===null){delete _16f[key];}else{if(!(key in _16f)){val=dojo._getText(key);_16f[key]=_173?dojo.cache._sanitize(val):val;}val=_16f[key];}}return val;};dojo.cache._sanitize=function(val){if(val){val=val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _174=val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_174){val=_174[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=[];},_stringRepl:function(tmpl){var _175=this.declaredClass,_176=this;return dojo.string.substitute(tmpl,this,function(_177,key){if(key.charAt(0)=="!"){_177=dojo.getObject(key.substr(1),false,_176);}if(typeof _177=="undefined"){throw new Error(_175+" template:"+key);}if(_177==null){return "";}return key.charAt(0)=="!"?_177:_177.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){var _178=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);var node;if(dojo.isString(_178)){node=dojo._toDom(this._stringRepl(_178));if(node.nodeType!=1){throw new Error("Invalid template: "+_178);}}else{node=_178.cloneNode(true);}this.domNode=node;this._attachTemplateNodes(node);if(this.widgetsInTemplate){var _179=dojo.parser,qry,attr;if(_179._query!="[dojoType]"){qry=_179._query;attr=_179._attrName;_179._query="[dojoType]";_179._attrName="dojoType";}var cw=(this._startupWidgets=dojo.parser.parse(node,{noStart:!this._earlyTemplatedStartup,inherited:{dir:this.dir,lang:this.lang}}));if(qry){_179._query=qry;_179._attrName=attr;}this._supportingWidgets=dijit.findWidgets(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}this._fillContent(this.srcNodeRef);},_fillContent:function(_17a){var dest=this.containerNode;if(_17a&&dest){while(_17a.hasChildNodes()){dest.appendChild(_17a.firstChild);}}},_attachTemplateNodes:function(_17b,_17c){_17c=_17c||function(n,p){return n.getAttribute(p);};var _17d=dojo.isArray(_17b)?_17b:(_17b.all||_17b.getElementsByTagName("*"));var x=dojo.isArray(_17b)?0:-1;for(;x<_17d.length;x++){var _17e=(x==-1)?_17b:_17d[x];if(this.widgetsInTemplate&&_17c(_17e,"dojoType")){continue;}var _17f=_17c(_17e,"dojoAttachPoint");if(_17f){var _180,_181=_17f.split(/\s*,\s*/);while((_180=_181.shift())){if(dojo.isArray(this[_180])){this[_180].push(_17e);}else{this[_180]=_17e;}this._attachPoints.push(_180);}}var _182=_17c(_17e,"dojoAttachEvent");if(_182){var _183,_184=_182.split(/\s*,\s*/);var trim=dojo.trim;while((_183=_184.shift())){if(_183){var _185=null;if(_183.indexOf(":")!=-1){var _186=_183.split(":");_183=trim(_186[0]);_185=trim(_186[1]);}else{_183=trim(_183);}if(!_185){_185=_183;}this.connect(_17e,_183,_185);}}}var role=_17c(_17e,"waiRole");if(role){dijit.setWaiRole(_17e,role);}var _187=_17c(_17e,"waiState");if(_187){dojo.forEach(_187.split(/\s*,\s*/),function(_188){if(_188.indexOf("-")!=-1){var pair=_188.split("-");dijit.setWaiState(_17e,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(_189){delete this[_189];},this);this._attachPoints=[];this.inherited(arguments);}});dijit._Templated._templateCache={};dijit._Templated.getCachedTemplate=function(_18a,_18b,_18c){var _18d=dijit._Templated._templateCache;var key=_18b||_18a;var _18e=_18d[key];if(_18e){try{if(!_18e.ownerDocument||_18e.ownerDocument==dojo.doc){return _18e;}}catch(e){}dojo.destroy(_18e);}if(!_18b){_18b=dojo.cache(_18a,{sanitize:true});}_18b=dojo.string.trim(_18b);if(_18c||_18b.match(/\$\{([^\}]+)\}/g)){return (_18d[key]=_18b);}else{var node=dojo._toDom(_18b);if(node.nodeType!=1){throw new Error("Invalid template: "+_18b);}return (_18d[key]=node);}};if(dojo.isIE){dojo.addOnWindowUnload(function(){var _18f=dijit._Templated._templateCache;for(var key in _18f){var _190=_18f[key];if(typeof _190=="object"){dojo.destroy(_190);}delete _18f[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(_191,_192){var _193=this.containerNode;if(_192&&typeof _192=="number"){var _194=this.getChildren();if(_194&&_194.length>=_192){_193=_194[_192-1].domNode;_192="after";}}dojo.place(_191.domNode,_193,_192);if(this._started&&!_191._started){_191.startup();}},removeChild:function(_195){if(typeof _195=="number"&&_195>0){_195=this.getChildren()[_195];}if(_195){var node=_195.domNode;if(node&&node.parentNode){node.parentNode.removeChild(node);}}},hasChildren:function(){return this.getChildren().length>0;},destroyDescendants:function(_196){dojo.forEach(this.getChildren(),function(_197){_197.destroyRecursive(_196);});},_getSiblingOfChild:function(_198,dir){var node=_198.domNode,_199=(dir>0?"nextSibling":"previousSibling");do{node=node[_199];}while(node&&(node.nodeType!=1||!dijit.byNode(node)));return node&&dijit.byNode(node);},getIndexOfChild:function(_19a){return dojo.indexOf(this.getChildren(),_19a);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_19b){_19b.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 _19c=dijit.getEnclosingWidget(this.domNode.parentNode);return _19c&&_19c.isContainer?_19c:null;},_getSibling:function(_19d){var node=this.domNode;do{node=node[_19d+"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,postCreate:function(){dojo.addClass(this.domNode,"dijitContainer");this.inherited(arguments);},startup:function(){if(this._started){return;}this.inherited(arguments);var _19e=this.getParent&&this.getParent();if(!(_19e&&_19e.isLayoutContainer)){this.resize();this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){this.resize();});}},resize:function(_19f,_1a0){var node=this.domNode;if(_19f){dojo.marginBox(node,_19f);if(_19f.t){node.style.top=_19f.t+"px";}if(_19f.l){node.style.left=_19f.l+"px";}}var mb=_1a0||{};dojo.mixin(mb,_19f||{});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(_1a1){dojo.addClass(_1a1.domNode,this.baseClass+"-child");if(_1a1.baseClass){dojo.addClass(_1a1.domNode,this.baseClass+"-"+_1a1.baseClass);}},addChild:function(_1a2,_1a3){this.inherited(arguments);if(this._started){this._setupChild(_1a2);}},removeChild:function(_1a4){dojo.removeClass(_1a4.domNode,this.baseClass+"-child");if(_1a4.baseClass){dojo.removeClass(_1a4.domNode,this.baseClass+"-"+_1a4.baseClass);}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 _1a5=function(word){return word.substring(0,1).toUpperCase()+word.substring(1);};var size=function(_1a6,dim){_1a6.resize?_1a6.resize(dim):dojo.marginBox(_1a6.domNode,dim);dojo.mixin(_1a6,dojo.marginBox(_1a6.domNode));dojo.mixin(_1a6,dim);};dijit.layout.layoutChildren=function(_1a7,dim,_1a8){dim=dojo.mixin({},dim);dojo.addClass(_1a7,"dijitLayoutContainer");_1a8=dojo.filter(_1a8,function(item){return item.layoutAlign!="client";}).concat(dojo.filter(_1a8,function(item){return item.layoutAlign=="client";}));dojo.forEach(_1a8,function(_1a9){var elm=_1a9.domNode,pos=_1a9.layoutAlign;var _1aa=elm.style;_1aa.left=dim.l+"px";_1aa.top=dim.t+"px";_1aa.bottom=_1aa.right="auto";dojo.addClass(elm,"dijitAlign"+_1a5(pos));if(pos=="top"||pos=="bottom"){size(_1a9,{w:dim.w});dim.h-=_1a9.h;if(pos=="top"){dim.t+=_1a9.h;}else{_1aa.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){size(_1a9,{h:dim.h});dim.w-=_1a9.w;if(pos=="left"){dim.l+=_1a9.w;}else{_1aa.left=dim.l+dim.w+"px";}}else{if(pos=="client"){size(_1a9,dim);}}}});};})();}if(!dojo._hasResource["dijit._CssStateMixin"]){dojo._hasResource["dijit._CssStateMixin"]=true;dojo.provide("dijit._CssStateMixin");dojo.declare("dijit._CssStateMixin",[],{cssStateNodes:{},postCreate:function(){this.inherited(arguments);dojo.forEach(["onmouseenter","onmouseleave","onmousedown"],function(e){this.connect(this.domNode,e,"_cssMouseEvent");},this);this.connect(this,"set",function(name,_1ab){if(arguments.length>=2&&{disabled:true,readOnly:true,checked:true,selected:true}[name]){this._setStateClass();}});dojo.forEach(["_onFocus","_onBlur"],function(ap){this.connect(this,ap,"_setStateClass");},this);for(var ap in this.cssStateNodes){this._trackMouseState(this[ap],this.cssStateNodes[ap]);}this._setStateClass();},_cssMouseEvent:function(_1ac){if(!this.disabled){switch(_1ac.type){case "mouseenter":case "mouseover":this._hovering=true;this._active=this._mouseDown;break;case "mouseleave":case "mouseout":this._hovering=false;this._active=false;break;case "mousedown":this._active=true;this._mouseDown=true;var _1ad=this.connect(dojo.body(),"onmouseup",function(){this._active=false;this._mouseDown=false;this._setStateClass();this.disconnect(_1ad);});break;}this._setStateClass();}},_setStateClass:function(){var _1ae=this.baseClass.split(" ");function _1af(_1b0){_1ae=_1ae.concat(dojo.map(_1ae,function(c){return c+_1b0;}),"dijit"+_1b0);};if(!this.isLeftToRight()){_1af("Rtl");}if(this.checked){_1af("Checked");}if(this.state){_1af(this.state);}if(this.selected){_1af("Selected");}if(this.disabled){_1af("Disabled");}else{if(this.readOnly){_1af("ReadOnly");}else{if(this._active){_1af("Active");}else{if(this._hovering){_1af("Hover");}}}}if(this._focused){_1af("Focused");}var tn=this.stateNode||this.domNode,_1b1={};dojo.forEach(tn.className.split(" "),function(c){_1b1[c]=true;});if("_stateClasses" in this){dojo.forEach(this._stateClasses,function(c){delete _1b1[c];});}dojo.forEach(_1ae,function(c){_1b1[c]=true;});var _1b2=[];for(var c in _1b1){_1b2.push(c);}tn.className=_1b2.join(" ");this._stateClasses=_1ae;},_trackMouseState:function(node,_1b3){var _1b4=false,_1b5=false,_1b6=false;var self=this,cn=dojo.hitch(this,"connect",node);function _1b7(){var _1b8=("disabled" in self&&self.disabled)||("readonly" in self&&self.readonly);dojo.toggleClass(node,_1b3+"Hover",_1b4&&!_1b5&&!_1b8);dojo.toggleClass(node,_1b3+"Active",_1b5&&!_1b8);dojo.toggleClass(node,_1b3+"Focused",_1b6&&!_1b8);};cn("onmouseenter",function(){_1b4=true;_1b7();});cn("onmouseleave",function(){_1b4=false;_1b5=false;_1b7();});cn("onmousedown",function(){_1b5=true;_1b7();});cn("onmouseup",function(){_1b5=false;_1b7();});cn("onfocus",function(){_1b6=true;_1b7();});cn("onblur",function(){_1b6=false;_1b7();});this.connect(this,"set",function(name,_1b9){if(name=="disabled"||name=="readOnly"){_1b7();}});}});}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(_1ba){this.disabled=_1ba;dojo.attr(this.focusNode,"disabled",_1ba);if(this.valueNode){dojo.attr(this.valueNode,"disabled",_1ba);}dijit.setWaiState(this.focusNode,"disabled",_1ba);if(_1ba){this._hovering=false;this._active=false;var _1bb="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:"focusNode";dojo.forEach(dojo.isArray(_1bb)?_1bb:[_1bb],function(_1bc){var node=this[_1bc];if(dojo.isWebKit||dijit.hasDefaultTabStop(node)){node.setAttribute("tabIndex","-1");}else{node.removeAttribute("tabIndex");}},this);}else{this.focusNode.setAttribute("tabIndex",this.tabIndex);}},setDisabled:function(_1bd){dojo.deprecated("setDisabled("+_1bd+") is deprecated. Use set('disabled',"+_1bd+") instead.","","2.0");this.set("disabled",_1bd);},_onFocus:function(e){if(this.scrollOnFocus){dojo.window.scrollIntoView(this.domNode);}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&!this.readOnly&&this.focusNode&&(dojo.style(this.domNode,"display")!="none");},focus:function(){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(_1be){},_onChangeActive:false,_handleOnChange:function(_1bf,_1c0){this._lastValue=_1bf;if(this._lastValueReported==undefined&&(_1c0===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_1bf;}if((this.intermediateChanges||_1c0||_1c0===undefined)&&((typeof _1bf!=typeof this._lastValueReported)||this.compare(_1bf,this._lastValueReported)!=0)){this._lastValueReported=_1bf;if(this._onChangeActive){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);}this._onChangeHandle=setTimeout(dojo.hitch(this,function(){this._onChangeHandle=null;this.onChange(_1bf);}),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(_1c1){dojo.deprecated("dijit.form._FormWidget:setValue("+_1c1+") is deprecated. Use set('value',"+_1c1+") instead.","","2.0");this.set("value",_1c1);},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&&this.isFocusable()){var _1c2=this.connect(dojo.body(),"onmouseup",function(){if(this.isFocusable()){this.focus();}this.disconnect(_1c2);});}}});dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"",readOnly:"focusNode"}),_setReadOnlyAttr:function(_1c3){this.readOnly=_1c3;dojo.attr(this.focusNode,"readOnly",_1c3);dijit.setWaiState(this.focusNode,"readonly",_1c3);},postCreate:function(){this.inherited(arguments);if(dojo.isIE){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._resetValue=this.value;}},_setValueAttr:function(_1c4,_1c5){this.value=_1c4;this._handleOnChange(_1c4,_1c5);},_getValueAttr:function(){return this._lastValue;},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 _1c6=this.domNode;var _1c7=_1c6.parentNode;var _1c8=_1c6.firstChild||_1c6;var _1c9=_1c8.style.filter;var _1ca=this;while(_1c7&&_1c7.clientHeight==0){(function ping(){var _1cb=_1ca.connect(_1c7,"onscroll",function(e){_1ca.disconnect(_1cb);_1c8.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_1c8.style.filter=_1c9;},0);});})();_1c7=_1c7.parentNode;}}}});}if(!dojo._hasResource["dijit.dijit"]){dojo._hasResource["dijit.dijit"]=true;dojo.provide("dijit.dijit");}
+}
diff --git a/lib/dijit/dijit.js.uncompressed.js b/lib/dijit/dijit.js.uncompressed.js
deleted file mode 100644
index 076a03208..000000000
--- a/lib/dijit/dijit.js.uncompressed.js
+++ /dev/null
@@ -1,5961 +0,0 @@
-/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-/*
- This is an optimized version of Dojo, built for deployment and not for
- development. To get sources and documentation, please visit:
-
- http://dojotoolkit.org
-*/
-
-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.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 = 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;
- }
-
- if(el != scrollRoot){ // body, html sizes already have the scrollbar removed
- var clientSize = el.clientWidth,
- scrollBarSize = elPos.w - clientSize;
- if(clientSize > 0 && scrollBarSize > 0){
- elPos.w = clientSize;
- if(isIE && rtl){ elPos.x += scrollBarSize; }
- }
- 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);
- nodePos.x += el.scrollLeft;
- el.scrollLeft += (isIE >= 8 && !backCompat && rtl)? -s : 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);
- }
-};
-
-}
-
-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){
- outAry.push(hash[widgetId]);
- }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.
- //TODO: feature detect "designMode" in elem.contentDocument?
- if(dojo.isMoz){
- try{
- return elem.contentDocument.designMode == "on";
- }catch(err){
- return false;
- }
- }else if(dojo.isWebKit){
- var doc = elem.contentDocument,
- body = doc && doc.body;
- return body && body.contentEditable == 'true';
- }else{
- // 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{
- doc = elem.contentWindow.document;
- body = doc && doc.body;
- return body && body.firstChild && body.firstChild.contentEditable == 'true';
- }catch(e){
- return false;
- }
- }
- 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;
- 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;
- }
- }
- }
- if(child.nodeName.toUpperCase() != 'SELECT'){
- walkTree(child);
- }
- });
- };
- if(shown(root)){ walkTree(root) }
- return { first: first, last: last, lowest: lowest, highest: 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;
-
-})();
-
-}
-
-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");
-
-
- // for dijit.isTabNavigable()
-
-// 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};
- }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){
- doc.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(){
- doc.detachEvent('onmousedown', mousedownListener);
- doc.detachEvent('onactivate', activateListener);
- doc.detachEvent('ondeactivate', deactivateListener);
- doc = null; // prevent memory leak (apparent circular reference via closure)
- };
- }else{
- doc.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.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._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;
- 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;
- })
- }
-});
-
-}
-
-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;
- }
-});
-
-}
-
-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");
-
-
-
-
-
-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, /* Array */ choices, /* Function */ layoutNode){
- // 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)
- // 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.
-
- // 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;
-
- // 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 tooltips size changes based on position, due to triangle)
- if(layoutNode){
- layoutNode(node, choice.aroundCorner, corner);
- }
-
- // 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
- };
- }
- return !overflow;
- });
-
- node.style.left = best.x + "px";
- node.style.top = best.y + "px";
- if(best.overflow && layoutNode){
- layoutNode(node, best.aroundCorner, best.corner);
- }
- 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 oldDisplay = aroundNode.style.display;
- aroundNode.style.display="";
- // #3172: use the slightly tighter border box instead of marginBox
- var aroundNodePos = dojo.position(aroundNode, true);
- aroundNode.style.display=oldDisplay;
-
- // 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);
-};
-
-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":
- // 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":
- 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;
-};
-
-}
-
-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");
-
-
-
-dijit.getDocumentWindow = function(doc){
- return dojo.window.get(doc);
-};
-
-}
-
-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");
-
-
-
-
-
-/*=====
-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,
-
- moveOffScreen: function(/*DomNode*/ node){
- // summary:
- // Initialization for nodes that will be used as popups
- //
- // description:
- // Puts node inside a wrapper <div>, and
- // positions wrapper div off screen, but not display:none, so that
- // the widget doesn't appear in the page flow and/or cause a blank
- // area at the bottom of the viewport (making scrollbar longer), but
- // initialization of contained widgets works correctly
-
- var wrapper = node.parentNode;
-
- // Create a wrapper widget for when this node (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
- if(!wrapper || !dojo.hasClass(wrapper, "dijitPopup")){
- wrapper = dojo.create("div",{
- "class":"dijitPopup",
- style:{
- visibility:"hidden",
- top: "-9999px"
- }
- }, dojo.body());
- dijit.setWaiRole(wrapper, "presentation");
- wrapper.appendChild(node);
- }
-
-
- var s = node.style;
- s.display = "";
- s.visibility = "";
- s.position = "";
- s.top = "0px";
-
- dojo.style(wrapper, {
- visibility: "hidden",
- // prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111)
- top: "-9999px"
- });
- },
-
- 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++);
-
-
- // The wrapper may have already been created, but in case it wasn't, create here
- var wrapper = widget.domNode.parentNode;
- if(!wrapper || !dojo.hasClass(wrapper, "dijitPopup")){
- this.moveOffScreen(widget.domNode);
- wrapper = widget.domNode.parentNode;
- }
-
- 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){
- var iframe = wrapper.childNodes[1];
- if(!iframe){
- iframe = 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.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({
- wrapper: wrapper,
- iframe: iframe,
- 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
-
- 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(dojo.some(stack, function(elem){return elem.widget == popup;})){
- var top = stack.pop(),
- wrapper = top.wrapper,
- iframe = top.iframe,
- 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);
-
- // Move the widget plus it's wrapper off screen, unless it has already been destroyed in above onClose() etc.
- if(widget && widget.domNode){
- this.moveOffScreen(widget.domNode);
- }else{
- dojo.destroy(wrapper);
- }
-
- if(onClose){
- onClose();
- }
- }
- }
-};
-
-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){
- 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 didnt 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 = dijit._frames.pop();
- node.appendChild(iframe);
- if(dojo.isIE<7){
- this.resize(node);
- this._conn = dojo.connect(node, 'onresize', this, function(){
- this.resize(node);
- });
- }else{
- dojo.style(iframe, {
- width: '100%',
- height: '100%'
- });
- }
- this.iframe = iframe;
- }
-};
-
-dojo.extend(dijit.BackgroundIframe, {
- resize: function(node){
- // summary:
- // resize the iframe so its the same size as node
- // description:
- // this function is a no-op in all browsers except
- // IE6, which does not support 100% width/height
- // of absolute positioned iframes
- if(this.iframe && dojo.isIE<7){
- 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;
- }
- }
-});
-
-}
-
-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");
-
-
-
-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);
-};
-
-}
-
-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_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);
- }
- });
-})();
-
-}
-
-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;
-// 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.
-
-dojo.provide("dijit._base.sniff");
-
-
-
-}
-
-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));
- }
-};
-
-}
-
-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, {
- _XhtmlRoles: /banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,
-
- hasWaiRole: function(/*Element*/ elem, /*String*/ role){
- // summary:
- // Determines if an element has a particular non-XHTML role.
- // returns:
- // True if elem has the specific non-XHTML role attribute and false if not.
- // For backwards compatibility if role parameter not provided,
- // returns true if has non XHTML role
- var waiRole = this.getWaiRole(elem);
- return role ? (waiRole.indexOf(role) > -1) : (waiRole.length > 0);
- },
-
- getWaiRole: function(/*Element*/ elem){
- // summary:
- // Gets the non-XHTML role for an element (which should be a wai role).
- // returns:
- // The non-XHTML role of elem or an empty string if elem
- // does not have a role.
- return dojo.trim((dojo.attr(elem, "role") || "").replace(this._XhtmlRoles,"").replace("wairole:",""));
- },
-
- setWaiRole: function(/*Element*/ elem, /*String*/ role){
- // summary:
- // Sets the role on an element.
- // description:
- // Replace existing role attribute with new role.
- // If elem already has an XHTML role, append this role to XHTML role
- // and remove other ARIA roles.
-
- var curRole = dojo.attr(elem, "role") || "";
- if(!this._XhtmlRoles.test(curRole)){
- dojo.attr(elem, "role", role);
- }else{
- if((" "+ curRole +" ").indexOf(" " + role + " ") < 0){
- var clearXhtml = dojo.trim(curRole.replace(this._XhtmlRoles, ""));
- var cleanRole = dojo.trim(curRole.replace(clearXhtml, ""));
- dojo.attr(elem, "role", cleanRole + (cleanRole ? ' ' : '') + role);
- }
- }
- },
-
- removeWaiRole: function(/*Element*/ elem, /*String*/ role){
- // summary:
- // Removes the specified non-XHTML 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);
- }
-});
-
-}
-
-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");
-
-
-
-
-
-
-
-
-
-
-
-}
-
-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");
-
-// 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
-}
-
-}
-
-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");
-
-
-new Date("X"); // workaround for #11279, new Date("") == NaN
-
-dojo.parser = new function(){
- // summary: The Dom/Widget parsing package
-
- var d = dojo;
- this._attrName = d._scopeName + "Type";
- this._query = "[" + this._attrName + "]";
-
- 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 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).
- dojo.connect(dojo, "extend", function(){
- instanceClasses = {};
- });
-
- function getClassInfo(/*String*/ className){
- // className:
- // fully qualified name (like "dijit.form.Button")
- // returns:
- // structure like
- // {
- // cls: dijit.Button,
- // params: { label: "string", disabled: "boolean"}
- // }
-
- if(!instanceClasses[className]){
- // get pointer to widget class
- var cls = d.getObject(className);
- if(!cls){ return null; } // class not defined [yet]
-
- var proto = cls.prototype;
-
- // get table of parameter names & types
- var params = {}, dummyClass = {};
- for(var name in proto){
- if(name.charAt(0)=="_"){ continue; } // skip internal properties
- if(name in dummyClass){ continue; } // skip "constructor" and "toString"
- var defVal = proto[name];
- params[name]=val2type(defVal);
- }
-
- instanceClasses[className] = { cls: cls, params: params };
- }
- return instanceClasses[className];
- }
-
- this._functionFromScript = function(script){
- var preamble = "";
- var suffix = "";
- var argsStr = 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.
- // Supports 'noStart' and inherited.
- var thelist = [], dp = dojo.parser;
- mixin = mixin||{};
- args = args||{};
-
- d.forEach(nodes, function(obj){
- if(!obj){ return; }
-
- // Get pointers to DOMNode, dojoType string, and clsInfo (metadata about the dojoType), etc.s
- var node, type, clsInfo, clazz, scripts;
- if(obj.node){
- // new format of nodes[] array, object w/lots of properties pre-computed for me
- node = obj.node;
- type = obj.type;
- clsInfo = obj.clsInfo || (type && getClassInfo(type));
- clazz = clsInfo && clsInfo.cls;
- scripts = obj.scripts;
- }else{
- // old (backwards compatible) format of nodes[] array, simple array of DOMNodes
- node = obj;
- type = dp._attrName in mixin ? mixin[dp._attrName] : node.getAttribute(dp._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 = {},
- attributes = node.attributes;
- if(args.defaults){
- // settings for the document itself (or whatever subtree is being parsed)
- dojo.mixin(params, args.defaults);
- }
- if(obj.inherited){
- // settings from dir=rtl or lang=... on a node above this node
- dojo.mixin(params, obj.inherited);
- }
-
- // read parameters (ie, attributes) specified on DOMNode
- // 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);
- var event = script.getAttribute("event"),
- type = script.getAttribute("type"),
- nf = d.parser._functionFromScript(script);
- 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
- var jsname = 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 &&
- instance.startup &&
- !instance._started &&
- (!instance.getParent || !instance.getParent())
- ){
- instance.startup();
- }
- });
- }
- return thelist;
- };
-
- this.parse = function(/*DomNode?*/ rootNode, /* Object? */ 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
- // dojoType="qualified.class.name"
- //
- // 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:
- // 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.
- // * 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
- //
- //
- // 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;
- }
-
- var attrName = this._attrName;
- 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){
- 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.scripts;
-
- // unless parent is a widget with the stopParser flag set, continue search for dojoType, recursively
- var recurse = !parent.clsInfo || !parent.clsInfo.cls.prototype.stopParser;
-
- // 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){
- var type = recurse && child.getAttribute(attrName);
- if(type){
- // if dojoType specified, add to output array of nodes to instantiate
- var params = {
- "type": type,
- clsInfo: getClassInfo(type), // 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\//i.test(type)) {
- scripts.push(child);
- }
- }else if(recurse){
- // Recurse, looking for grandchild nodes with dojoType specified
- scan({
- node: child,
- inherited: inherited
- }, list);
- }
- }
- }
- }
-
- // Make list of all nodes on page w/dojoType specified
- var list = [];
- scan({
- node: root ? dojo.byId(root) : dojo.body(),
- inherited: (args && args.inherited) || {
- dir: dojo._isBodyLtr() ? "ltr" : "rtl"
- }
- }, list);
-
- // go build the object instances
- return this.instantiate(list, null, 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.exists("dijit.wai.onload") && (dijit.wai.onload === dojo._loaders[0])){
- dojo._loaders.splice(1, 0, parseRunner);
- }else{
- dojo._loaders.unshift(parseRunner);
- }
-})();
-
-}
-
-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._base" );
-
-
-// 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){};
-
-// 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(){
-
-var _attrReg = {}, // cached results from getSetterAttributes
- getSetterAttributes = function(widget){
- // summary:
- // Returns list of attributes with custom setters for specified widget
- var dc = widget.declaredClass;
- if(!_attrReg[dc]){
- var r = [],
- attrs,
- proto = widget.constructor.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));
- }
- }
- _attrReg[dc] = r;
- }
- return _attrReg[dc] || []; // String[]
- };
-
-dojo.declare("dijit._Widget", null, {
- // summary:
- // Base class for all Dijit widgets.
-
- // 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 attr('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:""},
-
- // _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
- },
- =====*/
-
- // Constants used in templates
-
- // _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 = [];
-
- // 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
- }
- }
-
- //mixin 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.
- this._applyAttributes();
-
- var source = this.srcNodeRef;
- if(source && source.parentNode){
- source.parentNode.replaceChild(this.domNode, source);
- }
-
- // 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);
- }
- }
-
- if(this.domNode){
- 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(getSetterAttributes(this), function(a){
- if(!(a in this.attributeMap)){
- condAttrApply(a, this);
- }
- }, this);
- },
-
- 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
- this.domNode = this.srcNodeRef || dojo.create('div');
- },
-
- 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
-
- // baseClass is a single class name or occasionally a space-separated list of names.
- // Add those classes to the DOMNod. If RTL mode then also add with Rtl suffix.
- 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);
- }
- },
-
- 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;
- },
-
- ////////////////// MISCELLANEOUS METHODS ///////////////////
-
- 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();
- },
-
- _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];
- }
- },
-
- _setClassAttr: function(/*String*/ value){
- // summary:
- // Custom setter for the CSS "class" attribute
- // tags:
- // protected
- var mapNode = this[this.attributeMap["class"] || 'domNode'];
- dojo.removeClass(mapNode, this["class"])
- this["class"] = value;
- dojo.addClass(mapNode, value);
- },
-
- _setStyleAttr: function(/*String||Object*/ value){
- // summary:
- // Sets the style attribut 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.style = value;
- },
-
- 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);
- },
-
- _attrToDom: function(/*String*/ attr, /*String*/ value){
- // summary:
- // Reflect a widget attribute (title, tabIndex, duration etc.) to
- // the widget DOM, as specified in attributeMap.
- //
- // description:
- // Also sets this["attr"] to the new value.
- // 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.removeClass(mapNode, this[attr]);
- dojo.addClass(mapNode, value);
- break;
- }
- }, this);
- this[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);
- }
- },
-
- 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);
- }
- var oldValue = this[name];
- // FIXME: what about function assignments? Any way to connect() here?
- this[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"
- });
- },
-
- 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[]
- },
-
- // 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
- // 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 = [];
- 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(dojo.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;
- e.preventDefault(); // stop event to prevent scrolling on space key in IE
- }
- }),
- 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 &&
- !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);
- }
- })
- );
- }
- event = "onclick";
- }
- handles.push(dc(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 d = dojo,
- handle = d.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
- },
-
- 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");
- },
-
- 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;
- },
-
- _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
- }
-});
-
-})();
-
-}
-
-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.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;
- };
-
-}
-
-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`.
-};
-=====*/
-
-(function(){
- 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
- };
-})();
-
-}
-
-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.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: [],
- =====*/
-
- constructor: function(){
- this._attachPoints = [];
- },
-
- _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);
- },
-
- // method over-ride
- 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;
-
- // 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){
- // Make sure dojoType is used for parsing widgets in template.
- // The dojo.parser.query could be changed from multiversion support.
- var parser = dojo.parser, qry, attr;
- if(parser._query != "[dojoType]"){
- qry = parser._query;
- attr = parser._attrName;
- parser._query = "[dojoType]";
- parser._attrName = "dojoType";
- }
-
- // Store widgets that we need to start at a later point in time
- var cw = (this._startupWidgets = dojo.parser.parse(node, {
- noStart: !this._earlyTemplatedStartup,
- inherited: {dir: this.dir, lang: this.lang}
- }));
-
- // Restore the query.
- if(qry){
- parser._query = qry;
- parser._attrName = attr;
- }
-
- 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.
- // 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")){
- continue;
- }
- // Process dojoAttachPoint
- var attachPoint = getAttrFunc(baseNode, "dojoAttachPoint");
- 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");
- 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.connect(baseNode, event, thisFunc);
- }
- }
- }
-
- // waiRole, waiState
- 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 = [];
-
- 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:""
-});
-
-}
-
-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 > 0){
- 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);
- }
- }
-);
-
-}
-
-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
- }
- }
- );
-
-
-}
-
-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.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,
-
- postCreate: function(){
- dojo.addClass(this.domNode, "dijitContainer");
-
- this.inherited(arguments);
- },
-
- 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
-
- dojo.addClass(child.domNode, this.baseClass+"-child");
- if(child.baseClass){
- dojo.addClass(child.domNode, this.baseClass+"-"+child.baseClass);
- }
- },
-
- 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()
- dojo.removeClass(child.domNode, this.baseClass+"-child");
- if(child.baseClass){
- dojo.removeClass(child.domNode, this.baseClass+"-"+child.baseClass);
- }
- 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
- widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
-
- // record child's size, 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, /*Object[]*/ children){
- // 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 like [ {domNode: foo, layoutAlign: "bottom" }, {domNode: bar, layoutAlign: "client"} ]
-
- // 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.
- children = dojo.filter(children, function(item){ return item.layoutAlign != "client"; })
- .concat(dojo.filter(children, function(item){ return item.layoutAlign == "client"; }));
-
- // set positions/sizes
- dojo.forEach(children, function(child){
- var elm = child.domNode,
- pos = 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.bottom = elmStyle.right = "auto";
-
- dojo.addClass(elm, "dijitAlign" + capitalize(pos));
-
- // set size && adjust record of remaining space.
- // note that setting the width of a <div> may affect its height.
- if(pos == "top" || pos == "bottom"){
- size(child, { w: dim.w });
- 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"){
- size(child, { h: dim.h });
- dim.w -= child.w;
- if(pos == "left"){
- dim.l += child.w;
- }else{
- elmStyle.left = dim.l + dim.w + "px";
- }
- }else if(pos == "client"){
- size(child, dim);
- }
- });
- };
-
-})();
-
-}
-
-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: {},
-
- postCreate: function(){
- 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
- this.connect(this, "set", function(name, value){
- if(arguments.length >= 2 && {disabled: true, readOnly: true, checked:true, selected:true}[name]){
- this._setStateClass();
- }
- });
-
- // The widget coming in/out of the focus change affects it's state
- dojo.forEach(["_onFocus", "_onBlur"], function(ap){
- this.connect(this, ap, "_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 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,
- // then calls _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._hovering = true;
- this._active = this._mouseDown;
- break;
-
- case "mouseleave":
- case "mouseout": // generated on non-IE browsers even though we connected to mouseleave
- this._hovering = false;
- this._active = false;
- break;
-
- case "mousedown" :
- this._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._active = false;
- this._mouseDown = false;
- this._setStateClass();
- this.disconnect(mouseUpConnector);
- });
- break;
- }
- this._setStateClass();
- }
- },
-
- _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
- // - 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, 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.connect(this, "set", function(name, value){
- if(name == "disabled" || name == "readOnly"){
- setClass();
- }
- });
- }
-});
-
-}
-
-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.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: 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.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._hovering = false;
- this._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{
- 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.readOnly && this.focusNode && (dojo.style(this.domNode, "display") != "none");
- },
-
- focus: function(){
- // summary:
- // Put focus on this widget
- dijit.focus(this.focusNode);
- },
-
- compare: function(/*anything*/val1, /*anything*/val2){
- // summary:
- // Compare 2 values (as returned by attr('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==true,
- // onChange is only called form priorityChange=true events.
- // tags:
- // private
- this._lastValue = newValue;
- 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;
- }
- if((this.intermediateChanges || priorityChange || priorityChange === undefined) &&
- ((typeof newValue != typeof this._lastValueReported) ||
- this.compare(newValue, this._lastValueReported) != 0)){
- this._lastValueReported = newValue;
- 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 && 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){
- this.readOnly = value;
- dojo.attr(this.focusNode, 'readOnly', value);
- dijit.setWaiState(this.focusNode, "readonly", value);
- },
-
- postCreate: function(){
- this.inherited(arguments);
-
- if(dojo.isIE){ // 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._resetValue = this.value;
- }
- },
-
- _setValueAttr: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
- // summary:
- // Hook so attr('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.value = newValue;
- this._handleOnChange(newValue, priorityChange);
- },
-
- _getValueAttr: function(){
- // summary:
- // Hook so attr('value') works.
- return this._lastValue;
- },
-
- 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;
- }
- }
- }
-});
-
-}
-
-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");
-
-/*=====
-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
-
-
-
-
-
-
-
-}
-
diff --git a/lib/dijit/form/Button.js b/lib/dijit/form/Button.js
index 741062022..77846776f 100644
--- a/lib/dijit/form/Button.js
+++ b/lib/dijit/form/Button.js
@@ -1,127 +1,360 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.Button"]=true;
+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,{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\twaiRole=\"button\" waiState=\"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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"valueNode",iconClass:{node:"iconNode",type:"class"}}),_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 _1=this.domNode;_1.parentNode;_1=_1.parentNode){
-var _2=dijit.byNode(_1);
-if(_2&&typeof _2._onSubmit=="function"){
-_2._onSubmit(e);
-break;
-}
-}
-}else{
-if(this.valueNode){
-this.valueNode.click();
-e.preventDefault();
-}
-}
-}
-},_fillContent:function(_3){
-if(_3&&(!this.params||!("label" in this.params))){
-this.set("label",_3.innerHTML);
-}
-},postCreate:function(){
-dojo.setSelectable(this.focusNode,false);
-this.inherited(arguments);
-},_setShowLabelAttr:function(_4){
-if(this.containerNode){
-dojo.toggleClass(this.containerNode,"dijitDisplayNone",!_4);
-}
-this.showLabel=_4;
-},onClick:function(e){
-return true;
-},_clicked:function(e){
-},setLabel:function(_5){
-dojo.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");
-this.set("label",_5);
-},_setLabelAttr:function(_6){
-this.containerNode.innerHTML=this.label=_6;
-if(this.showLabel==false&&!this.params.title){
-this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");
-}
-}});
-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\twaiRole=\"button\" waiState=\"haspopup-true,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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),_fillContent:function(){
-if(this.srcNodeRef){
-var _7=dojo.query("*",this.srcNodeRef);
-dijit.form.DropDownButton.superclass._fillContent.call(this,_7[0]);
-this.dropDownContainer=this.srcNodeRef;
-}
-},startup:function(){
-if(this._started){
-return;
-}
-if(!this.dropDown){
-var _8=dojo.query("[widgetId]",this.dropDownContainer)[0];
-this.dropDown=dijit.byNode(_8);
-delete this.dropDownContainer;
-}
-dijit.popup.moveOffScreen(this.dropDown.domNode);
-this.inherited(arguments);
-},isLoaded:function(){
-var _9=this.dropDown;
-return (!_9.href||_9.isLoaded);
-},loadDropDown:function(){
-var _a=this.dropDown;
-if(!_a){
-return;
-}
-if(!this.isLoaded()){
-var _b=dojo.connect(_a,"onLoad",this,function(){
-dojo.disconnect(_b);
-this.openDropDown();
+
+
+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);
+ }
});
-_a.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' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"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\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"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\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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(_c){
-if(_c.charOrCode==dojo.keys[this.isLeftToRight()?"RIGHT_ARROW":"LEFT_ARROW"]){
-dijit.focus(this._popupStateNode);
-dojo.stopEvent(_c);
-}
-},_onArrowKeyPress:function(_d){
-if(_d.charOrCode==dojo.keys[this.isLeftToRight()?"LEFT_ARROW":"RIGHT_ARROW"]){
-dijit.focus(this.titleNode);
-dojo.stopEvent(_d);
-}
-},focus:function(_e){
-dijit.focus(_e=="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(_f){
-this.set("checked",!this.checked);
-},_setCheckedAttr:function(_10,_11){
-this.checked=_10;
-dojo.attr(this.focusNode||this.domNode,"checked",_10);
-dijit.setWaiState(this.focusNode||this.domNode,"pressed",_10);
-this._handleOnChange(_10,_11);
-},setChecked:function(_12){
-dojo.deprecated("setChecked("+_12+") is deprecated. Use set('checked',"+_12+") instead.","","2.0");
-this.set("checked",_12);
-},reset:function(){
-this._hasBeenBlurred=false;
-this.set("checked",this.params.checked||false);
-}});
+
+
+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);
+ }
+});
+
}
diff --git a/lib/dijit/form/CheckBox.js b/lib/dijit/form/CheckBox.js
index ea5cdd170..939f6e8bb 100644
--- a/lib/dijit/form/CheckBox.js
+++ b/lib/dijit/form/CheckBox.js
@@ -1,76 +1,204 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.CheckBox"]=true;
+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,{templateString:dojo.cache("dijit.form","templates/CheckBox.html","<div class=\"dijit dijitReset dijitInline\" waiRole=\"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(_1){
-this.readOnly=_1;
-dojo.attr(this.focusNode,"readOnly",_1);
-dijit.setWaiState(this.focusNode,"readonly",_1);
-},_setValueAttr:function(_2,_3){
-if(typeof _2=="string"){
-this.value=_2;
-dojo.attr(this.focusNode,"value",_2);
-_2=true;
-}
-if(this._created){
-this.set("checked",_2,_3);
-}
-},_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(_4){
-},reset:function(){
-this._hasBeenBlurred=false;
-this.set("checked",this.params.checked||false);
-this.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){
-return false;
-}
-return this.inherited(arguments);
-}});
-dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_setCheckedAttr:function(_5){
-this.inherited(arguments);
-if(!this._created){
-return;
-}
-if(_5){
-var _6=this;
-dojo.query("INPUT[type=radio]",this.focusNode.form||dojo.doc).forEach(function(_7){
-if(_7.name==_6.name&&_7!=_6.focusNode&&_7.form==_6.focusNode.form){
-var _8=dijit.getEnclosingWidget(_7);
-if(_8&&_8.checked){
-_8.set("checked",false);
-}
-}
-});
-}
-},_clicked:function(e){
-if(!this.checked){
-this.set("checked",true);
-}
-}});
+
+
+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);
+ }
+ }
+ }
+);
+
}
diff --git a/lib/dijit/form/ComboBox.js b/lib/dijit/form/ComboBox.js
index 694c43ed1..aecc5c4fc 100644
--- a/lib/dijit/form/ComboBox.js
+++ b/lib/dijit/form/ComboBox.js
@@ -1,12 +1,12 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.ComboBox"]=true;
+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");
@@ -15,601 +15,1217 @@ dojo.require("dojo.data.util.filter");
dojo.require("dijit._CssStateMixin");
dojo.require("dijit.form._FormWidget");
dojo.require("dijit.form.ValidationTextBox");
-dojo.requireLocalization("dijit.form","ComboBox",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.form.ComboBoxMixin",null,{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/ComboBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachPoint=\"comboNode\" waiRole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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\tdojoAttachEvent=\"onkeypress:_onKeyPress,compositionend\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t/></div\n></div>\n"),baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"downArrowNode":"dijitDownArrowButton"},_getCaretPos:function(_1){
-var _2=0;
-if(typeof (_1.selectionStart)=="number"){
-_2=_1.selectionStart;
-}else{
-if(dojo.isIE){
-var tr=dojo.doc.selection.createRange().duplicate();
-var _3=_1.createTextRange();
-tr.move("character",0);
-_3.move("character",0);
-try{
-_3.setEndPoint("EndToEnd",tr);
-_2=String(_3.text).replace(/\r/g,"").length;
-}
-catch(e){
-}
-}
-}
-return _2;
-},_setCaretPos:function(_4,_5){
-_5=parseInt(_5);
-dijit.selectInputText(_4,_5,_5);
-},_setDisabledAttr:function(_6){
-this.inherited(arguments);
-dijit.setWaiState(this.comboNode,"disabled",_6);
-},_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(_7){
-if(!this.searchTimer&&(_7.type=="paste"||_7.type=="input")&&this._lastInput!=this.textbox.value){
-this.searchTimer=setTimeout(dojo.hitch(this,function(){
-this._onKeyPress({charOrCode:229});
-}),100);
-}
-this.inherited(arguments);
-},_onKeyPress:function(_8){
-var _9=_8.charOrCode;
-if(_8.altKey||((_8.ctrlKey||_8.metaKey)&&(_9!="x"&&_9!="v"))||_9==dojo.keys.SHIFT){
-return;
-}
-var _a=false;
-var _b="_startSearchFromInput";
-var pw=this._popupWidget;
-var dk=dojo.keys;
-var _c=null;
-this._prev_key_backspace=false;
-this._abortQuery();
-if(this._isShowingNow){
-pw.handleKey(_9);
-_c=pw.getHighlightedOption();
-}
-switch(_9){
-case dk.PAGE_DOWN:
-case dk.DOWN_ARROW:
-case dk.PAGE_UP:
-case dk.UP_ARROW:
-if(!this._isShowingNow){
-_a=true;
-_b="_startSearchAll";
-}else{
-this._announceOption(_c);
-}
-dojo.stopEvent(_8);
-break;
-case dk.ENTER:
-if(_c){
-if(_c==pw.nextButton){
-this._nextSearch(1);
-dojo.stopEvent(_8);
-break;
-}else{
-if(_c==pw.previousButton){
-this._nextSearch(-1);
-dojo.stopEvent(_8);
-break;
-}
-}
-}else{
-this._setBlurValue();
-this._setCaretPos(this.focusNode,this.focusNode.value.length);
-}
-_8.preventDefault();
-case dk.TAB:
-var _d=this.get("displayedValue");
-if(pw&&(_d==pw._messages["previousMessage"]||_d==pw._messages["nextMessage"])){
-break;
-}
-if(_c){
-this._selectOption();
-}
-if(this._isShowingNow){
-this._lastQuery=null;
-this._hideResultList();
-}
-break;
-case " ":
-if(_c){
-dojo.stopEvent(_8);
-this._selectOption();
-this._hideResultList();
-}else{
-_a=true;
-}
-break;
-case dk.ESCAPE:
-if(this._isShowingNow){
-dojo.stopEvent(_8);
-this._hideResultList();
-}
-break;
-case dk.DELETE:
-case dk.BACKSPACE:
-this._prev_key_backspace=true;
-_a=true;
-break;
-default:
-_a=typeof _9=="string"||_9==229;
-}
-if(_a){
-this.item=undefined;
-this.searchTimer=setTimeout(dojo.hitch(this,_b),1);
-}
-},_autoCompleteText:function(_e){
-var fn=this.focusNode;
-dijit.selectInputText(fn,fn.value.length);
-var _f=this.ignoreCase?"toLowerCase":"substr";
-if(_e[_f](0).indexOf(this.focusNode.value[_f](0))==0){
-var _10=this._getCaretPos(fn);
-if((_10+1)>fn.value.length){
-fn.value=_e;
-dijit.selectInputText(fn,_10);
-}
-}else{
-fn.value=_e;
-dijit.selectInputText(fn);
-}
-},_openResultList:function(_11,_12){
-this._fetchHandle=null;
-if(this.disabled||this.readOnly||(_12.query[this.searchAttr]!=this._lastQuery)){
-return;
-}
-this._popupWidget.clearResultList();
-if(!_11.length&&!this._maxOptions){
-this._hideResultList();
-return;
-}
-_12._maxOptions=this._maxOptions;
-var _13=this._popupWidget.createOptions(_11,_12,dojo.hitch(this,"_getMenuLabelFromItem"));
-this._showResultList();
-if(_12.direction){
-if(1==_12.direction){
-this._popupWidget.highlightFirstOption();
-}else{
-if(-1==_12.direction){
-this._popupWidget.highlightLastOption();
-}
-}
-this._announceOption(this._popupWidget.getHighlightedOption());
-}else{
-if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_12.query[this.searchAttr])){
-this._announceOption(_13[1]);
-}
-}
-},_showResultList:function(){
-this._hideResultList();
-this.displayMessage("");
-dojo.style(this._popupWidget.domNode,{width:"",height:""});
-var _14=this.open();
-var _15=dojo.marginBox(this._popupWidget.domNode);
-this._popupWidget.domNode.style.overflow=((_14.h==_15.h)&&(_14.w==_15.w))?"hidden":"auto";
-var _16=_14.w;
-if(_14.h<this._popupWidget.domNode.scrollHeight){
-_16+=16;
-}
-dojo.marginBox(this._popupWidget.domNode,{h:_14.h,w:Math.max(_16,this.domNode.offsetWidth)});
-if(_16<this.domNode.offsetWidth){
-this._popupWidget.domNode.parentNode.style.left=dojo.position(this.domNode,true).x+"px";
-}
-dijit.setWaiState(this.comboNode,"expanded","true");
-},_hideResultList:function(){
-this._abortQuery();
-if(this._isShowingNow){
-dijit.popup.close(this._popupWidget);
-this._isShowingNow=false;
-dijit.setWaiState(this.comboNode,"expanded","false");
-dijit.removeWaiState(this.focusNode,"activedescendant");
-}
-},_setBlurValue:function(){
-var _17=this.get("displayedValue");
-var pw=this._popupWidget;
-if(pw&&(_17==pw._messages["previousMessage"]||_17==pw._messages["nextMessage"])){
-this._setValueAttr(this._lastValueReported,true);
-}else{
-if(typeof this.item=="undefined"){
-this.item=null;
-this.set("displayedValue",_17);
-}else{
-if(this.value!=this._lastValueReported){
-dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);
-}
-this._refreshState();
-}
-}
-},_onBlur:function(){
-this._hideResultList();
-this.inherited(arguments);
-},_setItemAttr:function(_18,_19,_1a){
-if(!_1a){
-_1a=this.labelFunc(_18,this.store);
-}
-this.value=this._getValueField()!=this.searchAttr?this.store.getIdentity(_18):_1a;
-this.item=_18;
-dijit.form.ComboBox.superclass._setValueAttr.call(this,this.value,_19,_1a);
-},_announceOption:function(_1b){
-if(!_1b){
-return;
-}
-var _1c;
-if(_1b==this._popupWidget.nextButton||_1b==this._popupWidget.previousButton){
-_1c=_1b.innerHTML;
-this.item=undefined;
-this.value="";
-}else{
-_1c=this.labelFunc(_1b.item,this.store);
-this.set("item",_1b.item,false,_1c);
-}
-this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);
-dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(_1b,"id"));
-this._autoCompleteText(_1c);
-},_selectOption:function(evt){
-if(evt){
-this._announceOption(evt.target);
-}
-this._hideResultList();
-this._setCaretPos(this.focusNode,this.focusNode.value.length);
-dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);
-},_onArrowMouseDown:function(evt){
-if(this.disabled||this.readOnly){
-return;
-}
-dojo.stopEvent(evt);
-this.focus();
-if(this._isShowingNow){
-this._hideResultList();
-}else{
-this._startSearchAll();
-}
-},_startSearchAll:function(){
-this._startSearch("");
-},_startSearchFromInput:function(){
-this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));
-},_getQueryString:function(_1d){
-return dojo.string.substitute(this.queryExpr,[_1d]);
-},_startSearch:function(key){
-if(!this._popupWidget){
-var _1e=this.id+"_popup";
-this._popupWidget=new dijit.form._ComboBoxMenu({onChange:dojo.hitch(this,this._selectOption),id:_1e,dir:this.dir});
-dijit.removeWaiState(this.focusNode,"activedescendant");
-dijit.setWaiState(this.textbox,"owns",_1e);
-}
-var _1f=dojo.clone(this.query);
-this._lastInput=key;
-this._lastQuery=_1f[this.searchAttr]=this._getQueryString(key);
-this.searchTimer=setTimeout(dojo.hitch(this,function(_20,_21){
-this.searchTimer=null;
-var _22={queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_20,onBegin:dojo.hitch(this,"_setMaxOptions"),onComplete:dojo.hitch(this,"_openResultList"),onError:function(_23){
-_21._fetchHandle=null;
-console.error("dijit.form.ComboBox: "+_23);
-dojo.hitch(_21,"_hideResultList")();
-},start:0,count:this.pageSize};
-dojo.mixin(_22,_21.fetchProperties);
-this._fetchHandle=_21.store.fetch(_22);
-var _24=function(_25,_26){
-_25.start+=_25.count*_26;
-_25.direction=_26;
-this._fetchHandle=this.store.fetch(_25);
-};
-this._nextSearch=this._popupWidget.onPage=dojo.hitch(this,_24,this._fetchHandle);
-},_1f,this),this.searchDelay);
-},_setMaxOptions:function(_27,_28){
-this._maxOptions=_27;
-},_getValueField:function(){
-return this.searchAttr;
-},compositionend:function(evt){
-this._onKeyPress({charOrCode:229});
-},constructor:function(){
-this.query={};
-this.fetchProperties={};
-},postMixInProperties:function(){
-if(!this.store){
-var _29=this.srcNodeRef;
-this.store=new dijit.form._ComboBoxDataStore(_29);
-if(!("value" in this.params)){
-var _2a=this.store.fetchSelectedItem();
-if(_2a){
-var _2b=this._getValueField();
-this.value=_2b!=this.searchAttr?this.store.getValue(_2a,_2b):this.labelFunc(_2a,this.store);
-}
-}
-}
-this.inherited(arguments);
-},postCreate:function(){
-if(!this.hasDownArrow){
-this.downArrowNode.style.display="none";
-}
-var _2c=dojo.query("label[for=\""+this.id+"\"]");
-if(_2c.length){
-_2c[0].id=(this.id+"_label");
-var cn=this.comboNode;
-dijit.setWaiState(cn,"labelledby",_2c[0].id);
-}
-this.inherited(arguments);
-},uninitialize:function(){
-if(this._popupWidget&&!this._popupWidget._destroyed){
-this._hideResultList();
-this._popupWidget.destroy();
-}
-this.inherited(arguments);
-},_getMenuLabelFromItem:function(_2d){
-var _2e=this.labelAttr?this.store.getValue(_2d,this.labelAttr):this.labelFunc(_2d,this.store);
-var _2f=this.labelType;
-if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){
-_2e=this.doHighlight(_2e,this._escapeHtml(this._lastInput));
-_2f="html";
-}
-return {html:_2f=="html",label:_2e};
-},doHighlight:function(_30,_31){
-var _32="i"+(this.highlightMatch=="all"?"g":"");
-var _33=this._escapeHtml(_30);
-_31=dojo.regexp.escapeString(_31);
-var ret=_33.replace(new RegExp("(^|\\s)("+_31+")",_32),"$1<span class=\"dijitComboBoxHighlightMatch\">$2</span>");
-return ret;
-},_escapeHtml:function(str){
-str=String(str).replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");
-return str;
-},open:function(){
-this._isShowingNow=true;
-return dijit.popup.open({popup:this._popupWidget,around:this.domNode,parent:this});
-},reset:function(){
-this.item=null;
-this.inherited(arguments);
-},labelFunc:function(_34,_35){
-return _35.getValue(_34,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' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRole='option'></li>"+"</ul>",_messages:null,baseClass:"dijitComboBoxMenu",postMixInProperties:function(){
-this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang);
-this.inherited(arguments);
-},_setValueAttr:function(_36){
-this.value=_36;
-this.onChange(_36);
-},onChange:function(_37){
-},onPage:function(_38){
-},postCreate:function(){
-this.previousButton.innerHTML=this._messages["previousMessage"];
-this.nextButton.innerHTML=this._messages["nextMessage"];
-this.inherited(arguments);
-},onClose:function(){
-this._blurOptionNode();
-},_createOption:function(_39,_3a){
-var _3b=_3a(_39);
-var _3c=dojo.doc.createElement("li");
-dijit.setWaiRole(_3c,"option");
-if(_3b.html){
-_3c.innerHTML=_3b.label;
-}else{
-_3c.appendChild(dojo.doc.createTextNode(_3b.label));
-}
-if(_3c.innerHTML==""){
-_3c.innerHTML="&nbsp;";
-}
-_3c.item=_39;
-return _3c;
-},createOptions:function(_3d,_3e,_3f){
-this.previousButton.style.display=(_3e.start==0)?"none":"";
-dojo.attr(this.previousButton,"id",this.id+"_prev");
-dojo.forEach(_3d,function(_40,i){
-var _41=this._createOption(_40,_3f);
-_41.className="dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl");
-dojo.attr(_41,"id",this.id+i);
-this.domNode.insertBefore(_41,this.nextButton);
-},this);
-var _42=false;
-if(_3e._maxOptions&&_3e._maxOptions!=-1){
-if((_3e.start+_3e.count)<_3e._maxOptions){
-_42=true;
-}else{
-if((_3e.start+_3e.count)>_3e._maxOptions&&_3e.count==_3d.length){
-_42=true;
-}
-}
-}else{
-if(_3e.count==_3d.length){
-_42=true;
-}
-}
-this.nextButton.style.display=_42?"":"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]);
-}
-},_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.onPage(-1);
-}else{
-if(evt.target==this.nextButton){
-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(_43){
-if(this._highlighted_option!=_43){
-this._blurOptionNode();
-this._highlighted_option=_43;
-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 _44=this.domNode.firstChild;
-var _45=_44.nextSibling;
-this._focusOptionNode(_45.style.display=="none"?_44:_45);
-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 _46=0;
-var _47=this.domNode.scrollTop;
-var _48=dojo.style(this.domNode,"height");
-if(!this.getHighlightedOption()){
-this._highlightNextOption();
-}
-while(_46<_48){
-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 _49=this.domNode.scrollTop;
-_46+=(_49-_47)*(up?-1:1);
-_47=_49;
-}
-},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(key){
-switch(key){
-case dojo.keys.DOWN_ARROW:
-this._highlightNextOption();
-break;
-case dojo.keys.PAGE_DOWN:
-this.pageDown();
-break;
-case dojo.keys.UP_ARROW:
-this._highlightPrevOption();
-break;
-case dojo.keys.PAGE_UP:
-this.pageUp();
-break;
-}
-}});
-dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{_setValueAttr:function(_4a,_4b,_4c){
-this.item=null;
-if(!_4a){
-_4a="";
-}
-dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_4a,_4b,_4c);
-}});
-dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(_4d){
-this.root=_4d;
-if(_4d.tagName!="SELECT"&&_4d.firstChild){
-_4d=dojo.query("select",_4d);
-if(_4d.length>0){
-_4d=_4d[0];
-}else{
-this.root.innerHTML="<SELECT>"+this.root.innerHTML+"</SELECT>";
-_4d=this.root.firstChild;
-}
-this.root=_4d;
-}
-dojo.query("> option",_4d).forEach(function(_4e){
-_4e.innerHTML=dojo.trim(_4e.innerHTML);
-});
-},getValue:function(_4f,_50,_51){
-return (_50=="value")?_4f.value:(_4f.innerText||_4f.textContent||"");
-},isItemLoaded:function(_52){
-return true;
-},getFeatures:function(){
-return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
-},_fetchItems:function(_53,_54,_55){
-if(!_53.query){
-_53.query={};
-}
-if(!_53.query.name){
-_53.query.name="";
-}
-if(!_53.queryOptions){
-_53.queryOptions={};
-}
-var _56=dojo.data.util.filter.patternToRegExp(_53.query.name,_53.queryOptions.ignoreCase),_57=dojo.query("> option",this.root).filter(function(_58){
-return (_58.innerText||_58.textContent||"").match(_56);
+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
+ }
});
-if(_53.sort){
-_57.sort(dojo.data.util.sorter.createSortFunction(_53.sort,this));
-}
-_54(_57,_53);
-},close:function(_59){
-return;
-},getLabel:function(_5a){
-return _5a.innerHTML;
-},getIdentity:function(_5b){
-return dojo.attr(_5b,"value");
-},fetchItemByIdentity:function(_5c){
-var _5d=dojo.query("> option[value='"+_5c.identity+"']",this.root)[0];
-_5c.onItem(_5d);
-},fetchSelectedItem:function(){
-var _5e=this.root,si=_5e.selectedIndex;
-return typeof si=="number"?dojo.query("> option:nth-child("+(si!=-1?si+1:1)+")",_5e)[0]:null;
-}});
+//Mix in the simple fetch implementation to this class.
dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);
+
}
diff --git a/lib/dijit/form/ComboButton.js b/lib/dijit/form/ComboButton.js
index db2d04aea..d311582ac 100644
--- a/lib/dijit/form/ComboButton.js
+++ b/lib/dijit/form/ComboButton.js
@@ -1,12 +1,15 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.ComboButton"]=true;
+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");
+
+
+
}
diff --git a/lib/dijit/form/CurrencyTextBox.js b/lib/dijit/form/CurrencyTextBox.js
index a6519b2a7..cd0d389a0 100644
--- a/lib/dijit/form/CurrencyTextBox.js
+++ b/lib/dijit/form/CurrencyTextBox.js
@@ -1,27 +1,96 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.CurrencyTextBox"]=true;
+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",dijit.form.NumberTextBox,{currency:"",baseClass:"dijitTextBox dijitCurrencyTextBox",regExpGen:function(_1){
-return "("+(this._focused?this.inherited(arguments,[dojo.mixin({},_1,this.editOptions)])+"|":"")+dojo.currency.regexp(_1)+")";
-},_formatter:dojo.currency.format,parse:function(_2,_3){
-var v=dojo.currency.parse(_2,_3);
-if(isNaN(v)&&/\d+/.test(_2)){
-return this.inherited(arguments,[_2,dojo.mixin({},_3,this.editOptions)]);
-}
-return v;
-},_setConstraintsAttr:function(_4){
-if(!_4.currency&&this.currency){
-_4.currency=this.currency;
-}
-this.inherited(arguments,[dojo.currency._mixInDefaults(dojo.mixin(_4,{exponent:false}))]);
-}});
+
+
+/*=====
+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
+ }
+ }
+);
+
}
diff --git a/lib/dijit/form/DateTextBox.js b/lib/dijit/form/DateTextBox.js
index d040be5f8..3d929ae76 100644
--- a/lib/dijit/form/DateTextBox.js
+++ b/lib/dijit/form/DateTextBox.js
@@ -1,14 +1,40 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.DateTextBox"]=true;
+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,{baseClass:"dijitTextBox dijitDateTextBox",popupClass:"dijit.Calendar",_selector:"date",value:new Date("")});
+
+
+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"
+ }
+);
+
}
diff --git a/lib/dijit/form/DropDownButton.js b/lib/dijit/form/DropDownButton.js
index 53f66278e..2489a4cdf 100644
--- a/lib/dijit/form/DropDownButton.js
+++ b/lib/dijit/form/DropDownButton.js
@@ -1,12 +1,15 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.DropDownButton"]=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");
dojo.require("dijit.form.Button");
+
+
+
}
diff --git a/lib/dijit/form/FilteringSelect.js b/lib/dijit/form/FilteringSelect.js
index 08703226c..81b44ff3b 100644
--- a/lib/dijit/form/FilteringSelect.js
+++ b/lib/dijit/form/FilteringSelect.js
@@ -1,92 +1,227 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.FilteringSelect"]=true;
+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],{_isvalid:true,required:true,_lastDisplayedValue:"",isValid:function(){
-return this._isvalid||(!this.required&&this.get("displayedValue")=="");
-},_refreshState:function(){
-if(!this.searchTimer){
-this.inherited(arguments);
-}
-},_callbackSetLabel:function(_1,_2,_3){
-if((_2&&_2.query[this.searchAttr]!=this._lastQuery)||(!_2&&_1.length&&this.store.getIdentity(_1[0])!=this._lastQuery)){
-return;
-}
-if(!_1.length){
-this.valueNode.value="";
-dijit.form.TextBox.superclass._setValueAttr.call(this,"",_3||(_3===undefined&&!this._focused));
-this._isvalid=false;
-this.validate(this._focused);
-this.item=null;
-}else{
-this.set("item",_1[0],_3);
-}
-},_openResultList:function(_4,_5){
-if(_5.query[this.searchAttr]!=this._lastQuery){
-return;
-}
-if(this.item===undefined){
-this._isvalid=_4.length!=0||this._maxOptions!=0;
-this.validate(true);
-}
-dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);
-},_getValueAttr:function(){
-return this.valueNode.value;
-},_getValueField:function(){
-return "value";
-},_setValueAttr:function(_6,_7){
-if(!this._onChangeActive){
-_7=null;
-}
-this._lastQuery=_6;
-if(_6===null||_6===""){
-this._setDisplayedValueAttr("",_7);
-return;
-}
-var _8=this;
-this.store.fetchItemByIdentity({identity:_6,onItem:function(_9){
-_8._callbackSetLabel(_9?[_9]:[],undefined,_7);
-}});
-},_setItemAttr:function(_a,_b,_c){
-this._isvalid=true;
-this.inherited(arguments);
-this.valueNode.value=this.value;
-this._lastDisplayedValue=this.textbox.value;
-},_getDisplayQueryString:function(_d){
-return _d.replace(/([\\\*\?])/g,"\\$1");
-},_setDisplayedValueAttr:function(_e,_f){
-if(!this._created){
-_f=false;
-}
-if(this.store){
-this._hideResultList();
-var _10=dojo.clone(this.query);
-this._lastQuery=_10[this.searchAttr]=this._getDisplayQueryString(_e);
-this.textbox.value=_e;
-this._lastDisplayedValue=_e;
-var _11=this;
-var _12={query:_10,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_13,_14){
-_11._fetchHandle=null;
-dojo.hitch(_11,"_callbackSetLabel")(_13,_14,_f);
-},onError:function(_15){
-_11._fetchHandle=null;
-console.error("dijit.form.FilteringSelect: "+_15);
-dojo.hitch(_11,"_callbackSetLabel")([],undefined,false);
-}};
-dojo.mixin(_12,this.fetchProperties);
-this._fetchHandle=this.store.fetch(_12);
-}
-},postMixInProperties:function(){
-this.inherited(arguments);
-this._isvalid=!this.required;
-},undo:function(){
-this.set("displayedValue",this._lastDisplayedValue);
-}});
+
+
+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);
+ }
+ }
+);
+
}
diff --git a/lib/dijit/form/Form.js b/lib/dijit/form/Form.js
index 618700b5d..8eba470b9 100644
--- a/lib/dijit/form/Form.js
+++ b/lib/dijit/form/Form.js
@@ -1,64 +1,189 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.Form"]=true;
+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.declare("dijit.form.Form",[dijit._Widget,dijit._Templated,dijit.form._FormMixin],{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(_1){
-},onExecute:function(){
-},_setEncTypeAttr:function(_2){
-this.encType=_2;
-dojo.attr(this.domNode,"encType",_2);
-if(dojo.isIE){
-this.domNode.encoding=_2;
-}
-},postCreate:function(){
-if(dojo.isIE&&this.srcNodeRef&&this.srcNodeRef.attributes){
-var _3=this.srcNodeRef.attributes.getNamedItem("encType");
-if(_3&&!_3.specified&&(typeof _3.value=="string")){
-this.set("encType",_3.value);
-}
-}
-this.inherited(arguments);
-},reset:function(e){
-var _4={returnValue:true,preventDefault:function(){
-this.returnValue=false;
-},stopPropagation:function(){
-},currentTarget:e?e.target:this.domNode,target:e?e.target:this.domNode};
-if(!(this.onReset(_4)===false)&&_4.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();
-}
-}});
+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();
+ }
+ }
+ }
+);
+
}
diff --git a/lib/dijit/form/HorizontalRule.js b/lib/dijit/form/HorizontalRule.js
index 944282d80..e81805e6e 100644
--- a/lib/dijit/form/HorizontalRule.js
+++ b/lib/dijit/form/HorizontalRule.js
@@ -1,38 +1,74 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.HorizontalRule"]=true;
+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],{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH\"></div>",count:3,container:"containerNode",ruleStyle:"",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkH\" style=\"left:",_positionSuffix:"%;",_suffix:"\"></div>",_genHTML:function(_1,_2){
-return this._positionPrefix+_1+this._positionSuffix+this.ruleStyle+this._suffix;
-},_isHorizontal:true,postCreate:function(){
-var _3;
-if(this.count==1){
-_3=this._genHTML(50,0);
-}else{
-var i;
-var _4=100/(this.count-1);
-if(!this._isHorizontal||this.isLeftToRight()){
-_3=this._genHTML(0,0);
-for(i=1;i<this.count-1;i++){
-_3+=this._genHTML(_4*i,i);
-}
-_3+=this._genHTML(100,this.count-1);
-}else{
-_3=this._genHTML(100,0);
-for(i=1;i<this.count-1;i++){
-_3+=this._genHTML(100-_4*i,i);
-}
-_3+=this._genHTML(0,this.count-1);
-}
-}
-this.domNode.innerHTML=_3;
-}});
+
+
+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;
+ }
+});
+
}
diff --git a/lib/dijit/form/HorizontalRuleLabels.js b/lib/dijit/form/HorizontalRuleLabels.js
index 6cf6742c5..d923e8081 100644
--- a/lib/dijit/form/HorizontalRuleLabels.js
+++ b/lib/dijit/form/HorizontalRuleLabels.js
@@ -1,38 +1,97 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.HorizontalRuleLabels"]=true;
+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,{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(_1){
-return _1;
-},_genHTML:function(_2,_3){
-return this._positionPrefix+this._calcPosition(_2)+this._positionSuffix+this.labelStyle+this._labelPrefix+this.labels[_3]+this._suffix;
-},getLabels:function(){
-var _4=this.labels;
-if(!_4.length){
-_4=dojo.query("> li",this.srcNodeRef).map(function(_5){
-return String(_5.innerHTML);
+
+
+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;
+ }
});
-}
-this.srcNodeRef.innerHTML="";
-if(!_4.length&&this.count>1){
-var _6=this.minimum;
-var _7=(this.maximum-_6)/(this.count-1);
-for(var i=0;i<this.count;i++){
-_4.push((i<this.numericMargin||i>=(this.count-this.numericMargin))?"":dojo.number.format(_6,this.constraints));
-_6+=_7;
-}
-}
-return _4;
-},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 a0cb8cf2b..93dc4a0c2 100644
--- a/lib/dijit/form/HorizontalSlider.js
+++ b/lib/dijit/form/HorizontalSlider.js
@@ -1,209 +1,343 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.HorizontalSlider"]=true;
+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.require("dojo._base.fx");
-dojo.declare("dijit.form.HorizontalSlider",[dijit.form._FormValueWidget,dijit._Container],{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\" tabIndex=\"-1\" 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\" waiRole=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"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\" waiRole=\"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 waiRole=\"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\" tabIndex=\"-1\" 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"),value:0,showButtons:true,minimum:0,maximum:100,discreteValues:Infinity,pageIncrement:2,clickSelect:true,slideDuration:dijit.defaultDuration,widgetsInTemplate:true,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{id:""}),baseClass:"dijitSlider",cssStateNodes:{incrementButton:"dijitSliderIncrementButton",decrementButton:"dijitSliderDecrementButton",focusNode:"dijitSliderThumb"},_mousePixelCoord:"pageX",_pixelCount:"w",_startingPixelCoord:"x",_startingPixelCount:"l",_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 dojo.keys.HOME:
-this._setValueAttr(this.minimum,false);
-break;
-case dojo.keys.END:
-this._setValueAttr(this.maximum,false);
-break;
-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){
-dijit.focus(this.sliderHandle);
-}
-dojo.stopEvent(e);
-},_isReversed:function(){
-return !this.isLeftToRight();
-},_onBarClick:function(e){
-if(this.disabled||this.readOnly||!this.clickSelect){
-return;
-}
-dijit.focus(this.sliderHandle);
-dojo.stopEvent(e);
-var _1=dojo.position(this.sliderBarContainer,true);
-var _2=e[this._mousePixelCoord]-_1[this._startingPixelCoord];
-this._setPixelValue(this._isReversed()?(_1[this._pixelCount]-_2):_2,_1[this._pixelCount],true);
-this._movable.onMouseDown(e);
-},_setPixelValue:function(_3,_4,_5){
-if(this.disabled||this.readOnly){
-return;
-}
-_3=_3<0?0:_4<_3?_4:_3;
-var _6=this.discreteValues;
-if(_6<=1||_6==Infinity){
-_6=_4;
-}
-_6--;
-var _7=_4/_6;
-var _8=Math.round(_3/_7);
-this._setValueAttr((this.maximum-this.minimum)*_8/_6+this.minimum,_5);
-},_setValueAttr:function(_9,_a){
-this.valueNode.value=this.value=_9;
-dijit.setWaiState(this.focusNode,"valuenow",_9);
-this.inherited(arguments);
-var _b=(_9-this.minimum)/(this.maximum-this.minimum);
-var _c=(this._descending===false)?this.remainingBar:this.progressBar;
-var _d=(this._descending===false)?this.progressBar:this.remainingBar;
-if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){
-this._inProgressAnim.stop(true);
-}
-if(_a&&this.slideDuration>0&&_c.style[this._progressPixelSize]){
-var _e=this;
-var _f={};
-var _10=parseFloat(_c.style[this._progressPixelSize]);
-var _11=this.slideDuration*(_b-_10/100);
-if(_11==0){
-return;
-}
-if(_11<0){
-_11=0-_11;
-}
-_f[this._progressPixelSize]={start:_10,end:_b*100,units:"%"};
-this._inProgressAnim=dojo.animateProperty({node:_c,duration:_11,onAnimate:function(v){
-_d.style[_e._progressPixelSize]=(100-parseFloat(v[_e._progressPixelSize]))+"%";
-},onEnd:function(){
-delete _e._inProgressAnim;
-},properties:_f});
-this._inProgressAnim.play();
-}else{
-_c.style[this._progressPixelSize]=(_b*100)+"%";
-_d.style[this._progressPixelSize]=((1-_b)*100)+"%";
-}
-},_bumpValue:function(_12,_13){
-if(this.disabled||this.readOnly){
-return;
-}
-var s=dojo.getComputedStyle(this.sliderBarContainer);
-var c=dojo._getContentBox(this.sliderBarContainer,s);
-var _14=this.discreteValues;
-if(_14<=1||_14==Infinity){
-_14=c[this._pixelCount];
-}
-_14--;
-var _15=(this.value-this.minimum)*_14/(this.maximum-this.minimum)+_12;
-if(_15<0){
-_15=0;
-}
-if(_15>_14){
-_15=_14;
-}
-_15=_15*(this.maximum-this.minimum)/_14+this.minimum;
-this._setValueAttr(_15,_13);
-},_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==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);
-},increment:function(e){
-this._bumpValue(e.charOrCode==dojo.keys.PAGE_UP?this.pageIncrement:1);
-},_mouseWheeled:function(evt){
-dojo.stopEvent(evt);
-var _16=!dojo.isMozilla;
-var _17=evt[(_16?"wheelDelta":"detail")]*(_16?1:-1);
-this._bumpValue(_17<0?-1:1,true);
-},startup:function(){
-if(this._started){
-return;
-}
-dojo.forEach(this.getChildren(),function(_18){
-if(this[_18.container]!=this.containerNode){
-this[_18.container].appendChild(_18.domNode);
-}
-},this);
-this.inherited(arguments);
-},_typematicCallback:function(_19,_1a,e){
-if(_19==-1){
-this._setValueAttr(this.value,true);
-}else{
-this[(_1a==(this._descending?this.incrementButton:this.decrementButton))?"decrement":"increment"](e);
-}
-},postCreate:function(){
-if(this.showButtons){
-this.incrementButton.style.display="";
-this.decrementButton.style.display="";
-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");
-var _1b=dojo.declare(dijit.form._SliderMover,{widget:this});
-this._movable=new dojo.dnd.Moveable(this.sliderHandle,{mover:_1b});
-var _1c=dojo.query("label[for=\""+this.id+"\"]");
-if(_1c.length){
-_1c[0].id=(this.id+"_label");
-dijit.setWaiState(this.focusNode,"labelledby",_1c[0].id);
-}
-dijit.setWaiState(this.focusNode,"valuemin",this.minimum);
-dijit.setWaiState(this.focusNode,"valuemax",this.maximum);
-this.inherited(arguments);
-this._layoutHackIE7();
-},destroy:function(){
-this._movable.destroy();
-if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){
-this._inProgressAnim.stop(true);
-}
-this._supportingWidgets=dijit.findWidgets(this.domNode);
-this.inherited(arguments);
-}});
-dojo.declare("dijit.form._SliderMover",dojo.dnd.Mover,{onMouseMove:function(e){
-var _1d=this.widget;
-var _1e=_1d._abspos;
-if(!_1e){
-_1e=_1d._abspos=dojo.position(_1d.sliderBarContainer,true);
-_1d._setPixelValue_=dojo.hitch(_1d,"_setPixelValue");
-_1d._isReversed_=_1d._isReversed();
-}
-var _1f=e[_1d._mousePixelCoord]-_1e[_1d._startingPixelCoord];
-_1d._setPixelValue_(_1d._isReversed_?(_1e[_1d._pixelCount]-_1f):_1f,_1e[_1d._pixelCount],false);
-},destroy:function(e){
-dojo.dnd.Mover.prototype.destroy.apply(this,arguments);
-var _20=this.widget;
-_20._abspos=null;
-_20._setValueAttr(_20.value,true);
-}});
+
+
+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);
+ }
+});
+
}
diff --git a/lib/dijit/form/MappedTextBox.js b/lib/dijit/form/MappedTextBox.js
index e7dd213c0..ebdaaf15b 100644
--- a/lib/dijit/form/MappedTextBox.js
+++ b/lib/dijit/form/MappedTextBox.js
@@ -1,12 +1,15 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.MappedTextBox"]=true;
+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");
+
+
+
}
diff --git a/lib/dijit/form/MultiSelect.js b/lib/dijit/form/MultiSelect.js
index 8aacb4148..12f3b40e7 100644
--- a/lib/dijit/form/MultiSelect.js
+++ b/lib/dijit/form/MultiSelect.js
@@ -1,49 +1,119 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.MultiSelect"]=true;
+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,{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(){
-this._hasBeenBlurred=false;
-this._setValueAttr(this._resetValue,true);
-},addSelected:function(_1){
-_1.getSelected().forEach(function(n){
-this.containerNode.appendChild(n);
-this.domNode.scrollTop=this.domNode.offsetHeight;
-var _2=_1.domNode.scrollTop;
-_1.domNode.scrollTop=0;
-_1.domNode.scrollTop=_2;
-},this);
-},getSelected:function(){
-return dojo.query("option",this.containerNode).filter(function(n){
-return n.selected;
-});
-},_getValueAttr:function(){
-return this.getSelected().map(function(n){
-return n.value;
-});
-},multiple:true,_setValueAttr:function(_3){
-dojo.query("option",this.containerNode).forEach(function(n){
-n.selected=(dojo.indexOf(_3,n.value)!=-1);
-});
-},invertSelection:function(_4){
-dojo.query("option",this.containerNode).forEach(function(n){
-n.selected=!n.selected;
+
+
+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();
+ }
});
-this._handleOnChange(this.get("value"),_4==true);
-},_onChange:function(e){
-this._handleOnChange(this.get("value"),true);
-},resize:function(_5){
-if(_5){
-dojo.marginBox(this.domNode,_5);
-}
-},postCreate:function(){
-this._onChange();
-}});
+
}
diff --git a/lib/dijit/form/NumberSpinner.js b/lib/dijit/form/NumberSpinner.js
index 82a3c4024..ba5a782f5 100644
--- a/lib/dijit/form/NumberSpinner.js
+++ b/lib/dijit/form/NumberSpinner.js
@@ -1,38 +1,71 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.NumberSpinner"]=true;
+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],{adjust:function(_1,_2){
-var tc=this.constraints,v=isNaN(_1),_3=!isNaN(tc.max),_4=!isNaN(tc.min);
-if(v&&_2!=0){
-_1=(_2>0)?_4?tc.min:_3?tc.max:0:_3?this.constraints.max:_4?tc.min:0;
-}
-var _5=_1+_2;
-if(v||isNaN(_5)){
-return _1;
-}
-if(_3&&(_5>tc.max)){
-_5=tc.max;
-}
-if(_4&&(_5<tc.min)){
-_5=tc.min;
-}
-return _5;
-},_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"){
-var _6=this.constraints[(e.charOrCode==dojo.keys.HOME?"min":"max")];
-if(typeof _6=="number"){
-this._setValueAttr(_6,false);
-}
-dojo.stopEvent(e);
-}
-}});
+
+
+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);
+ }
+ }
+});
+
}
diff --git a/lib/dijit/form/NumberTextBox.js b/lib/dijit/form/NumberTextBox.js
index d477d1ba9..4d0d64f99 100644
--- a/lib/dijit/form/NumberTextBox.js
+++ b/lib/dijit/form/NumberTextBox.js
@@ -1,112 +1,278 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.NumberTextBox"]=true;
+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.NumberTextBoxMixin",null,{regExpGen:dojo.number.regexp,value:NaN,editOptions:{pattern:"#.######"},_formatter:dojo.number.format,_setConstraintsAttr:function(_1){
-var _2=typeof _1.places=="number"?_1.places:0;
-if(_2){
-_2++;
-}
-if(typeof _1.max!="number"){
-_1.max=9*Math.pow(10,15-_2);
-}
-if(typeof _1.min!="number"){
-_1.min=-9*Math.pow(10,15-_2);
-}
-this.inherited(arguments,[_1]);
-if(this.focusNode&&this.focusNode.value&&!isNaN(this.value)){
-this.set("value",this.value);
-}
-},_onFocus:function(){
-if(this.disabled){
-return;
-}
-var _3=this.get("value");
-if(typeof _3=="number"&&!isNaN(_3)){
-var _4=this.format(_3,this.constraints);
-if(_4!==undefined){
-this.textbox.value=_4;
-}
-}
-this.inherited(arguments);
-},format:function(_5,_6){
-var _7=String(_5);
-if(typeof _5!="number"){
-return _7;
-}
-if(isNaN(_5)){
-return "";
-}
-if(!("rangeCheck" in this&&this.rangeCheck(_5,_6))&&_6.exponent!==false&&/\de[-+]?\d/i.test(_7)){
-return _7;
-}
-if(this.editOptions&&this._focused){
-_6=dojo.mixin({},_6,this.editOptions);
-}
-return this._formatter(_5,_6);
-},parse:dojo.number.parse,_getDisplayedValueAttr:function(){
-var v=this.inherited(arguments);
-return isNaN(v)?this.textbox.value:v;
-},filter:function(_8){
-return (_8===null||_8===""||_8===undefined)?NaN:this.inherited(arguments);
-},serialize:function(_9,_a){
-return (typeof _9!="number"||isNaN(_9))?"":this.inherited(arguments);
-},_setValueAttr:function(_b,_c,_d){
-if(_b!==undefined&&_d===undefined){
-_d=String(_b);
-if(typeof _b=="number"){
-if(isNaN(_b)){
-_d="";
-}else{
-if(("rangeCheck" in this&&this.rangeCheck(_b,this.constraints))||this.constraints.exponent===false||!/\de[-+]?\d/i.test(_d)){
-_d=undefined;
-}
-}
-}else{
-if(!_b){
-_d="";
-_b=NaN;
-}else{
-_b=undefined;
-}
-}
-}
-this.inherited(arguments,[_b,_c,_d]);
-},_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("^"+dojo.number._realNumberRegexp(dojo.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(_e){
-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;
-}
-}
-}});
-dojo.declare("dijit.form.NumberTextBox",[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],{});
+
+
+/*=====
+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"
+ }
+);
+
}
diff --git a/lib/dijit/form/RadioButton.js b/lib/dijit/form/RadioButton.js
index 154bdd4bc..295ec5ffd 100644
--- a/lib/dijit/form/RadioButton.js
+++ b/lib/dijit/form/RadioButton.js
@@ -1,12 +1,16 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.RadioButton"]=true;
+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
+
}
diff --git a/lib/dijit/form/RangeBoundTextBox.js b/lib/dijit/form/RangeBoundTextBox.js
index b2e2f4ca9..589967f25 100644
--- a/lib/dijit/form/RangeBoundTextBox.js
+++ b/lib/dijit/form/RangeBoundTextBox.js
@@ -1,12 +1,15 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.RangeBoundTextBox"]=true;
+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");
+
+
+
}
diff --git a/lib/dijit/form/Select.js b/lib/dijit/form/Select.js
index 7caf553f2..a681cdf89 100644
--- a/lib/dijit/form/Select.js
+++ b/lib/dijit/form/Select.js
@@ -1,140 +1,305 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.Select"]=true;
+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,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-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);
-},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\twaiRole=\"combobox\" waiState=\"haspopup-true\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" waiRole=\"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}\" waiState=\"hidden-true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"titleNode\" waiRole=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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:"",tooltipPosition:[],emptyLabel:"",_isLoaded:false,_childrenLoaded:false,_fillContent:function(){
-this.inherited(arguments);
-if(this.options.length&&!this.value&&this.srcNodeRef){
-var si=this.srcNodeRef.selectedIndex;
-this.value=this.options[si!=-1?si:0].value;
-}
-this.dropDown=new dijit.form._SelectMenu({id:this.id+"_menu"});
-dojo.addClass(this.dropDown.domNode,this.baseClass+"Menu");
-},_getMenuItemForOption:function(_1){
-if(!_1.value){
-return new dijit.MenuSeparator();
-}else{
-var _2=dojo.hitch(this,"_setValueAttr",_1);
-var _3=new dijit.MenuItem({option:_1,label:_1.label,onClick:_2,disabled:_1.disabled||false});
-dijit.setWaiRole(_3.focusNode,"listitem");
-return _3;
-}
-},_addOptionItem:function(_4){
-if(this.dropDown){
-this.dropDown.addChild(this._getMenuItemForOption(_4));
-}
-},_getChildren:function(){
-if(!this.dropDown){
-return [];
-}
-return this.dropDown.getChildren();
-},_loadChildren:function(_5){
-if(_5===true){
-if(this.dropDown){
-delete this.dropDown.focusedChild;
-}
-if(this.options.length){
-this.inherited(arguments);
-}else{
-dojo.forEach(this._getChildren(),function(_6){
-_6.destroyRecursive();
+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%";
+ }
+ }
+ }
});
-var _7=new dijit.MenuItem({label:"&nbsp;"});
-this.dropDown.addChild(_7);
-}
-}else{
-this._updateSelection();
-}
-var _8=this.options.length;
-this._isLoaded=false;
-this._childrenLoaded=true;
-if(!this._loadingStore){
-this._setValueAttr(this.value);
-}
-},_setValueAttr:function(_9){
-this.inherited(arguments);
-dojo.attr(this.valueNode,"value",this.get("value"));
-},_setDisplay:function(_a){
-this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+(_a||this.emptyLabel||"&nbsp;")+"</span>";
-dijit.setWaiState(this.focusNode,"valuetext",(_a||this.emptyLabel||"&nbsp;"));
-},validate:function(_b){
-var _c=this.isValid(_b);
-this.state=_c?"":"Error";
-this._setStateClass();
-dijit.setWaiState(this.focusNode,"invalid",_c?"false":"true");
-var _d=_c?"":this._missingMsg;
-if(this._message!==_d){
-this._message=_d;
-dijit.hideTooltip(this.domNode);
-if(_d){
-dijit.showTooltip(_d,this.domNode,this.tooltipPosition,!this.isLeftToRight());
-}
-}
-return _c;
-},isValid:function(_e){
-return (!this.required||!(/^\s*$/.test(this.value)));
-},reset:function(){
-this.inherited(arguments);
-dijit.hideTooltip(this.domNode);
-this.state="";
-this._setStateClass();
-delete this._message;
-},postMixInProperties:function(){
-this.inherited(arguments);
-this._missingMsg=dojo.i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;
-},postCreate:function(){
-this.inherited(arguments);
-if(this.tableNode.style.width){
-dojo.addClass(this.domNode,this.baseClass+"FixedWidth");
-}
-},isLoaded:function(){
-return this._isLoaded;
-},loadDropDown:function(_f){
-this._loadChildren(true);
-this._isLoaded=true;
-_f();
-},closeDropDown:function(){
-this.inherited(arguments);
-if(this.dropDown&&this.dropDown.menuTableNode){
-this.dropDown.menuTableNode.style.width="";
-}
-},uninitialize:function(_10){
-if(this.dropDown&&!this.dropDown._destroyed){
-this.dropDown.destroyRecursive(_10);
-delete this.dropDown;
-}
-this.inherited(arguments);
-}});
+
+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);
+ }
+});
+
}
diff --git a/lib/dijit/form/SimpleTextarea.js b/lib/dijit/form/SimpleTextarea.js
index b4824c74e..6ff823105 100644
--- a/lib/dijit/form/SimpleTextarea.js
+++ b/lib/dijit/form/SimpleTextarea.js
@@ -1,59 +1,103 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.SimpleTextarea"]=true;
+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,{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);
-},filter:function(_1){
-if(_1){
-_1=_1.replace(/\r/g,"");
-}
-return this.inherited(arguments);
-},postCreate:function(){
-this.inherited(arguments);
-if(dojo.isIE&&this.cols){
-dojo.addClass(this.textbox,"dijitTextAreaCols");
-}
-},_previousValue:"",_onInput:function(e){
-if(this.maxLength){
-var _2=parseInt(this.maxLength);
-var _3=this.textbox.value.replace(/\r/g,"");
-var _4=_3.length-_2;
-if(_4>0){
-if(e){
-dojo.stopEvent(e);
-}
-var _5=this.textbox;
-if(_5.selectionStart){
-var _6=_5.selectionStart;
-var cr=0;
-if(dojo.isOpera){
-cr=(this.textbox.value.substring(0,_6).match(/\r/g)||[]).length;
-}
-this.textbox.value=_3.substring(0,_6-_4-cr)+_3.substring(_6-cr);
-_5.setSelectionRange(_6-_4,_6-_4);
-}else{
-if(dojo.doc.selection){
-_5.focus();
-var _7=dojo.doc.selection.createRange();
-_7.moveStart("character",-_4);
-_7.text="";
-_7.select();
-}
-}
-}
-this._previousValue=this.textbox.value;
-}
-this.inherited(arguments);
-}});
+
+
+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);
+ }
+});
+
}
diff --git a/lib/dijit/form/Slider.js b/lib/dijit/form/Slider.js
index 051d57929..80d4cfa98 100644
--- a/lib/dijit/form/Slider.js
+++ b/lib/dijit/form/Slider.js
@@ -1,18 +1,23 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.Slider"]=true;
+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.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself","","2.0");
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
+
}
diff --git a/lib/dijit/form/TextBox.js b/lib/dijit/form/TextBox.js
index 81c9b2a04..38a9c09d4 100644
--- a/lib/dijit/form/TextBox.js
+++ b/lib/dijit/form/TextBox.js
@@ -1,209 +1,427 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.TextBox"]=true;
+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,{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}\" waiRole=\"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 _1=this.type.toLowerCase();
-if(this.templateString.toLowerCase()=="input"||((_1=="hidden"||_1=="file")&&this.templateString==dijit.form.TextBox.prototype.templateString)){
-this.templateString=this._singleNodeTemplate;
-}
-this.inherited(arguments);
-},_setPlaceHolderAttr:function(v){
-this.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(_2,_3,_4){
-var _5;
-if(_2!==undefined){
-_5=this.filter(_2);
-if(typeof _4!="string"){
-if(_5!==null&&((typeof _5!="number")||!isNaN(_5))){
-_4=this.filter(this.format(_5,this.constraints));
-}else{
-_4="";
-}
-}
-}
-if(_4!=null&&_4!=undefined&&((typeof _4)!="number"||!isNaN(_4))&&this.textbox.value!=_4){
-this.textbox.value=_4;
-}
-this._updatePlaceHolder();
-this.inherited(arguments,[_5,_3]);
-},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(_6){
-dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");
-this.set("displayedValue",_6);
-},_setDisplayedValueAttr:function(_7){
-if(_7===null||_7===undefined){
-_7="";
-}else{
-if(typeof _7!="string"){
-_7=String(_7);
-}
-}
-this.textbox.value=_7;
-this._setValueAttr(this.get("value"),undefined,_7);
-},format:function(_8,_9){
-return ((_8==null||_8==undefined)?"":(_8.toString?_8.toString():_8));
-},parse:function(_a,_b){
-return _a;
-},_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 _c=this;
-setTimeout(function(){
-_c._handleOnChange(_c.get("value"),false);
-},0);
-}
-this._refreshState();
-},postCreate:function(){
-if(dojo.isIE){
-var s=dojo.getComputedStyle(this.domNode);
-if(s){
-var ff=s.fontFamily;
-if(ff){
-var _d=this.domNode.getElementsByTagName("INPUT");
-if(_d){
-for(var i=0;i<_d.length;i++){
-_d[i].style.fontFamily=ff;
-}
-}
-}
-}
-}
-this.textbox.setAttribute("value",this.textbox.value);
-this.inherited(arguments);
-if(dojo.isMoz||dojo.isOpera){
-this.connect(this.textbox,"oninput",this._onInput);
-}else{
-this.connect(this.textbox,"onkeydown",this._onInput);
-this.connect(this.textbox,"onkeyup",this._onInput);
-this.connect(this.textbox,"onpaste",this._onInput);
-this.connect(this.textbox,"oncut",this._onInput);
-}
-},_blankValue:"",filter:function(_e){
-if(_e===null){
-return this._blankValue;
-}
-if(typeof _e!="string"){
-return _e;
-}
-if(this.trim){
-_e=dojo.trim(_e);
-}
-if(this.uppercase){
-_e=_e.toUpperCase();
-}
-if(this.lowercase){
-_e=_e.toLowerCase();
-}
-if(this.propercase){
-_e=_e.replace(/[^\s]+/g,function(_f){
-return _f.substring(0,1).toUpperCase()+_f.substring(1);
-});
-}
-return _e;
-},_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 _10;
-if(dojo.isIE){
-var _11=dojo.doc.selection.createRange();
-var _12=_11.parentElement();
-_10=_12==this.textbox&&_11.text.length==0;
-}else{
-_10=this.textbox.selectionStart==this.textbox.selectionEnd;
-}
-if(_10){
-dijit.selectInputText(this.textbox);
-}
-});
-}
-this._updatePlaceHolder();
-this._refreshState();
-this.inherited(arguments);
-},reset:function(){
-this.textbox.value="";
-this.inherited(arguments);
-}});
-dijit.selectInputText=function(_13,_14,_15){
-var _16=dojo.global;
-var _17=dojo.doc;
-_13=dojo.byId(_13);
-if(isNaN(_14)){
-_14=0;
-}
-if(isNaN(_15)){
-_15=_13.value?_13.value.length:0;
-}
-dijit.focus(_13);
-if(_17["selection"]&&dojo.body()["createTextRange"]){
-if(_13.createTextRange){
-var _18=_13.createTextRange();
-with(_18){
-collapse(true);
-moveStart("character",-99999);
-moveStart("character",_14);
-moveEnd("character",_15-_14);
-select();
-}
-}
-}else{
-if(_16["getSelection"]){
-if(_13.setSelectionRange){
-_13.setSelectionRange(_14,_15);
-}
-}
-}
+
+
+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);
+ }
+ }
};
+
}
diff --git a/lib/dijit/form/Textarea.js b/lib/dijit/form/Textarea.js
index 4dd9cd928..cc1ec917e 100644
--- a/lib/dijit/form/Textarea.js
+++ b/lib/dijit/form/Textarea.js
@@ -1,103 +1,167 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.Textarea"]=true;
+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,{cols:"",_previousNewlines:0,_strictMode:(dojo.doc.compatMode!="BackCompat"),_getHeight:function(_1){
-var _2=_1.scrollHeight;
-if(dojo.isIE){
-_2+=_1.offsetHeight-_1.clientHeight-((dojo.isIE<8&&this._strictMode)?dojo._getPadBorderExtents(_1).h:0);
-}else{
-if(dojo.isMoz){
-_2+=_1.offsetHeight-_1.clientHeight;
-}else{
-if(dojo.isWebKit&&!(dojo.isSafari<4)){
-_2+=dojo._getBorderExtents(_1).h;
-}else{
-_2+=dojo._getPadBorderExtents(_1).h;
-}
-}
-}
-return _2;
-},_estimateHeight:function(_3){
-_3.style.maxHeight="";
-_3.style.height="auto";
-_3.rows=(_3.value.match(/\n/g)||[]).length+1;
-},_needsHelpShrinking:dojo.isMoz||dojo.isWebKit,_onInput:function(){
-this.inherited(arguments);
-if(this._busyResizing){
-return;
-}
-this._busyResizing=true;
-var _4=this.textbox;
-if(_4.scrollHeight&&_4.offsetHeight&&_4.clientHeight){
-var _5=this._getHeight(_4)+"px";
-if(_4.style.height!=_5){
-_4.style.maxHeight=_4.style.height=_5;
-}
-if(this._needsHelpShrinking){
-if(this._setTimeoutHandle){
-clearTimeout(this._setTimeoutHandle);
-}
-this._setTimeoutHandle=setTimeout(dojo.hitch(this,"_shrink"),0);
-}
-}else{
-this._estimateHeight(_4);
-}
-this._busyResizing=false;
-},_busyResizing:false,_shrink:function(){
-this._setTimeoutHandle=null;
-if(this._needsHelpShrinking&&!this._busyResizing){
-this._busyResizing=true;
-var _6=this.textbox;
-var _7=false;
-if(_6.value==""){
-_6.value=" ";
-_7=true;
-}
-var _8=_6.scrollHeight;
-if(!_8){
-this._estimateHeight(_6);
-}else{
-var _9=_6.style.paddingBottom;
-var _a=dojo._getPadExtents(_6);
-_a=_a.h-_a.t;
-_6.style.paddingBottom=_a+1+"px";
-var _b=this._getHeight(_6)-1+"px";
-if(_6.style.maxHeight!=_b){
-_6.style.paddingBottom=_a+_8+"px";
-_6.scrollTop=0;
-_6.style.maxHeight=this._getHeight(_6)-_8+"px";
-}
-_6.style.paddingBottom=_9;
-}
-if(_7){
-_6.value="";
-}
-this._busyResizing=false;
-}
-},resize:function(){
-this._onInput();
-},_setValueAttr:function(){
-this.inherited(arguments);
-this.resize();
-},postCreate:function(){
-this.inherited(arguments);
-dojo.style(this.textbox,{overflowY:"hidden",overflowX:"auto",boxSizing:"border-box",MsBoxSizing:"border-box",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box"});
-this.connect(this.textbox,"onscroll",this._onInput);
-this.connect(this.textbox,"onresize",this._onInput);
-this.connect(this.textbox,"onfocus",this._onInput);
-this._setTimeoutHandle=setTimeout(dojo.hitch(this,"resize"),0);
-},uninitialize:function(){
-if(this._setTimeoutHandle){
-clearTimeout(this._setTimeoutHandle);
-}
-this.inherited(arguments);
-}});
+
+
+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);
+ }
+});
+
}
diff --git a/lib/dijit/form/TimeTextBox.js b/lib/dijit/form/TimeTextBox.js
index f5e7f99e3..81949c4a1 100644
--- a/lib/dijit/form/TimeTextBox.js
+++ b/lib/dijit/form/TimeTextBox.js
@@ -1,14 +1,87 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.TimeTextBox"]=true;
+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",dijit.form._DateTimeTextBox,{baseClass:"dijitTextBox dijitTimeTextBox",popupClass:"dijit._TimePicker",_selector:"time",value:new Date("")});
+
+
+/*=====
+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);
+ }
+ }
+ }
+);
+
}
diff --git a/lib/dijit/form/ToggleButton.js b/lib/dijit/form/ToggleButton.js
index f67dd0880..27b836fbd 100644
--- a/lib/dijit/form/ToggleButton.js
+++ b/lib/dijit/form/ToggleButton.js
@@ -1,12 +1,15 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.ToggleButton"]=true;
+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");
+
+
+
}
diff --git a/lib/dijit/form/ValidationTextBox.js b/lib/dijit/form/ValidationTextBox.js
index 2e0f17317..ee4292441 100644
--- a/lib/dijit/form/ValidationTextBox.js
+++ b/lib/dijit/form/ValidationTextBox.js
@@ -1,211 +1,486 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.ValidationTextBox"]=true;
+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,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-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}\" waiRole=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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_$",constraints:{},regExp:".*",regExpGen:function(_1){
-return this.regExp;
-},state:"",tooltipPosition:[],_setValueAttr:function(){
-this.inherited(arguments);
-this.validate(this._focused);
-},validator:function(_2,_3){
-return (new RegExp("^(?:"+this.regExpGen(_3)+")"+(this.required?"":"?")+"$")).test(_2)&&(!this.required||!this._isEmpty(_2))&&(this._isEmpty(_2)||this.parse(_2,_3)!==undefined);
-},_isValidSubset:function(){
-return this.textbox.value.search(this._partialre)==0;
-},isValid:function(_4){
-return this.validator(this.textbox.value,this.constraints);
-},_isEmpty:function(_5){
-return /^\s*$/.test(_5);
-},getErrorMessage:function(_6){
-return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;
-},getPromptMessage:function(_7){
-return this.promptMessage;
-},_maskValidSubsetError:true,validate:function(_8){
-var _9="";
-var _a=this.disabled||this.isValid(_8);
-if(_a){
-this._maskValidSubsetError=true;
-}
-var _b=this._isEmpty(this.textbox.value);
-var _c=!_a&&!_b&&_8&&this._isValidSubset();
-this.state=((_a||((!this._hasBeenBlurred||_8)&&_b)||_c)&&this._maskValidSubsetError)?"":"Error";
-if(this.state=="Error"){
-this._maskValidSubsetError=_8;
-}
-this._setStateClass();
-dijit.setWaiState(this.focusNode,"invalid",_a?"false":"true");
-if(_8){
-if(this.state=="Error"){
-_9=this.getErrorMessage(true);
-}else{
-_9=this.getPromptMessage(true);
-}
-this._maskValidSubsetError=true;
-}
-this.displayMessage(_9);
-return _a;
-},_message:"",displayMessage:function(_d){
-if(this._message==_d){
-return;
-}
-this._message=_d;
-dijit.hideTooltip(this.domNode);
-if(_d){
-dijit.showTooltip(_d,this.domNode,this.tooltipPosition,!this.isLeftToRight());
-}
-},_refreshState:function(){
-this.validate(this._focused);
-this.inherited(arguments);
-},constructor:function(){
-this.constraints={};
-},_setConstraintsAttr:function(_e){
-if(!_e.locale&&this.lang){
-_e.locale=this.lang;
-}
-this.constraints=_e;
-this._computePartialRE();
-},_computePartialRE:function(){
-var p=this.regExpGen(this.constraints);
-this.regExp=p;
-var _f="";
-if(p!=".*"){
-this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){
-switch(re.charAt(0)){
-case "{":
-case "+":
-case "?":
-case "*":
-case "^":
-case "$":
-case "|":
-case "(":
-_f+=re;
-break;
-case ")":
-_f+="|$)";
-break;
-default:
-_f+="(?:"+re+"|$)";
-break;
-}
-});
-}
-try{
-"".search(_f);
-}
-catch(e){
-_f=this.regExp;
-console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);
-}
-this._partialre="^(?:"+_f+")$";
-},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(_10){
-this.inherited(arguments);
-this._refreshState();
-},_setRequiredAttr:function(_11){
-this.required=_11;
-dijit.setWaiState(this.focusNode,"required",_11);
-this._refreshState();
-},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,_12){
-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+"'":"")+">",this.textbox,"after");
-},reset:function(){
-this.valueNode.value="";
-this.inherited(arguments);
-}});
-dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",rangeCheck:function(_13,_14){
-return ("min" in _14?(this.compare(_13,_14.min)>=0):true)&&("max" in _14?(this.compare(_13,_14.max)<=0):true);
-},isInRange:function(_15){
-return this.rangeCheck(this.get("value"),this.constraints);
-},_isDefinitelyOutOfRange:function(){
-var val=this.get("value");
-var _16=false;
-var _17=false;
-if("min" in this.constraints){
-var min=this.constraints.min;
-min=this.compare(val,((typeof min=="number")&&min>=0&&val!=0)?0:min);
-_16=(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);
-_17=(typeof max=="number")&&max>0;
-}
-return _16||_17;
-},_isValidSubset:function(){
-return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();
-},isValid:function(_18){
-return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_18));
-},getErrorMessage:function(_19){
-var v=this.get("value");
-if(v!==null&&v!==""&&v!==undefined&&(typeof v!="number"||!isNaN(v))&&!this.isInRange(_19)){
-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(_1a){
-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(_1b,_1c){
-dijit.setWaiState(this.focusNode,"valuenow",_1b);
-this.inherited(arguments);
-}});
+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);
+ }
+ }
+);
+
}
diff --git a/lib/dijit/form/VerticalRule.js b/lib/dijit/form/VerticalRule.js
index 13576277f..98f612cf0 100644
--- a/lib/dijit/form/VerticalRule.js
+++ b/lib/dijit/form/VerticalRule.js
@@ -1,13 +1,35 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.VerticalRule"]=true;
+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,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkV\" style=\"top:",_isHorizontal:false});
+
+
+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
+
+});
+
}
diff --git a/lib/dijit/form/VerticalRuleLabels.js b/lib/dijit/form/VerticalRuleLabels.js
index 9adac9056..57caba8b5 100644
--- a/lib/dijit/form/VerticalRuleLabels.js
+++ b/lib/dijit/form/VerticalRuleLabels.js
@@ -1,15 +1,33 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.VerticalRuleLabels"]=true;
+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,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerV\" style=\"top:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelV\">",_calcPosition:function(_1){
-return 100-_1;
-},_isHorizontal:false});
+
+
+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
+});
+
}
diff --git a/lib/dijit/form/VerticalSlider.js b/lib/dijit/form/VerticalSlider.js
index 9e98cbe0f..f074c7cd1 100644
--- a/lib/dijit/form/VerticalSlider.js
+++ b/lib/dijit/form/VerticalSlider.js
@@ -1,15 +1,42 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form.VerticalSlider"]=true;
+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,{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\" tabIndex=\"-1\" 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\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" waiRole=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"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\" waiRole=\"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\" tabIndex=\"-1\" 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:true,_isReversed:function(){
-return this._descending;
-}});
+
+
+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;
+ }
+});
+
}
diff --git a/lib/dijit/form/_DateTimeTextBox.js b/lib/dijit/form/_DateTimeTextBox.js
index 72898e406..9d5c004c8 100644
--- a/lib/dijit/form/_DateTimeTextBox.js
+++ b/lib/dijit/form/_DateTimeTextBox.js
@@ -1,148 +1,250 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form._DateTimeTextBox"]=true;
+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");
-new Date("X");
-dojo.declare("dijit.form._DateTimeTextBox",dijit.form.RangeBoundTextBox,{regExpGen:dojo.date.locale.regexp,datePackage:"dojo.date",compare:dojo.date.compare,format:function(_1,_2){
-if(!_1){
-return "";
-}
-return this.dateLocaleModule.format(_1,_2);
-},parse:function(_3,_4){
-return this.dateLocaleModule.parse(_3,_4)||(this._isEmpty(_3)?null:undefined);
-},serialize:function(_5,_6){
-if(_5.toGregorian){
-_5=_5.toGregorian();
-}
-return dojo.date.stamp.toISOString(_5,_6);
-},value:new Date(""),_blankValue:null,popupClass:"",_selector:"",constructor:function(_7){
-var _8=_7.datePackage?_7.datePackage+".Date":"Date";
-this.dateClassObj=dojo.getObject(_8,false);
-this.value=new this.dateClassObj("");
-this.datePackage=_7.datePackage||this.datePackage;
-this.dateLocaleModule=dojo.getObject(this.datePackage+".locale",false);
-this.regExpGen=this.dateLocaleModule.regexp;
-},_setConstraintsAttr:function(_9){
-_9.selector=this._selector;
-_9.fullYear=true;
-var _a=dojo.date.stamp.fromISOString;
-if(typeof _9.min=="string"){
-_9.min=_a(_9.min);
-}
-if(typeof _9.max=="string"){
-_9.max=_a(_9.max);
-}
-this.inherited(arguments,[_9]);
-},_onFocus:function(_b){
-this._open();
-this.inherited(arguments);
-},_setValueAttr:function(_c,_d,_e){
-if(_c!==undefined){
-if(!_c||_c.toString()==dijit.form._DateTimeTextBox.prototype.value.toString()){
-_c=null;
-}
-if(_c instanceof Date&&!(this.dateClassObj instanceof Date)){
-_c=new this.dateClassObj(_c);
-}
-}
-this.inherited(arguments,[_c,_d,_e]);
-if(this._picker){
-if(!_c){
-_c=new this.dateClassObj();
-}
-this._picker.set("value",_c);
-}
-},_open:function(){
-if(this.disabled||this.readOnly||!this.popupClass){
-return;
-}
-var _f=this;
-if(!this._picker){
-var _10=dojo.getObject(this.popupClass,false);
-this._picker=new _10({onValueSelected:function(_11){
-if(_f._tabbingAway){
-delete _f._tabbingAway;
-}else{
-_f.focus();
-}
-setTimeout(dojo.hitch(_f,"_close"),1);
-dijit.form._DateTimeTextBox.superclass._setValueAttr.call(_f,_11,true);
-},id:this.id+"_popup",dir:_f.dir,lang:_f.lang,value:this.get("value")||new this.dateClassObj(),constraints:_f.constraints,datePackage:_f.datePackage,isDisabledDate:function(_12){
-var _13=dojo.date.compare;
-var _14=_f.constraints;
-return _14&&((_14.min&&_13(_14.min,_12,_f._selector)>0)||(_14.max&&_13(_14.max,_12,_f._selector)<0));
-}});
-}
-if(!this._opened){
-dijit.popup.open({parent:this,popup:this._picker,orient:{"BL":"TL","TL":"BL"},around:this.domNode,onCancel:dojo.hitch(this,this._close),onClose:function(){
-_f._opened=false;
-}});
-this._opened=true;
-}
-dojo.marginBox(this._picker.domNode,{w:this.domNode.offsetWidth});
-},_close:function(){
-if(this._opened){
-dijit.popup.close(this._picker);
-this._opened=false;
-}
-},_onBlur:function(){
-this._close();
-if(this._picker){
-this._picker.destroy();
-delete this._picker;
-}
-this.inherited(arguments);
-},_getDisplayedValueAttr:function(){
-return this.textbox.value;
-},_setDisplayedValueAttr:function(_15,_16){
-this._setValueAttr(this.parse(_15,this.constraints),_16,_15);
-},destroy:function(){
-if(this._picker){
-this._picker.destroy();
-delete this._picker;
-}
-this.inherited(arguments);
-},postCreate:function(){
-this.inherited(arguments);
-this.connect(this.focusNode,"onkeypress",this._onKeyPress);
-this.connect(this.focusNode,"onclick",this._open);
-},_onKeyPress:function(e){
-var p=this._picker,dk=dojo.keys;
-if(p&&this._opened&&p.handleKey){
-if(p.handleKey(e)===false){
-return;
-}
-}
-if(this._opened&&e.charOrCode==dk.ESCAPE&&!(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey)){
-this._close();
-dojo.stopEvent(e);
-}else{
-if(!this._opened&&e.charOrCode==dk.DOWN_ARROW){
-this._open();
-dojo.stopEvent(e);
-}else{
-if(e.charOrCode===dk.TAB){
-this._tabbingAway=true;
-}else{
-if(this._opened&&(e.keyChar||e.charOrCode===dk.BACKSPACE||e.charOrCode==dk.DELETE)){
-setTimeout(dojo.hitch(this,function(){
-if(this._picker&&this._opened){
-dijit.placeOnScreenAroundElement(p.domNode.parentNode,this.domNode,{"BL":"TL","TL":"BL"},p.orient?dojo.hitch(p,"orient"):null);
-}
-}),1);
-}
-}
-}
-}
-}});
+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);
+ }
+ }
+);
+
}
diff --git a/lib/dijit/form/_FormMixin.js b/lib/dijit/form/_FormMixin.js
index 4c52ed9e2..e42702d31 100644
--- a/lib/dijit/form/_FormMixin.js
+++ b/lib/dijit/form/_FormMixin.js
@@ -1,158 +1,461 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form._FormMixin"]=true;
+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,{reset:function(){
-dojo.forEach(this.getDescendants(),function(_1){
-if(_1.reset){
-_1.reset();
-}
-});
-},validate:function(){
-var _2=false;
-return dojo.every(dojo.map(this.getDescendants(),function(_3){
-_3._hasBeenBlurred=true;
-var _4=_3.disabled||!_3.validate||_3.validate();
-if(!_4&&!_2){
-dojo.window.scrollIntoView(_3.containerNode||_3.domNode);
-_3.focus();
-_2=true;
-}
-return _4;
-}),function(_5){
-return _5;
-});
-},setValues:function(_6){
-dojo.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.","","2.0");
-return this.set("value",_6);
-},_setValueAttr:function(_7){
-var _8={};
-dojo.forEach(this.getDescendants(),function(_9){
-if(!_9.name){
-return;
-}
-var _a=_8[_9.name]||(_8[_9.name]=[]);
-_a.push(_9);
-});
-for(var _b in _8){
-if(!_8.hasOwnProperty(_b)){
-continue;
-}
-var _c=_8[_b],_d=dojo.getObject(_b,false,_7);
-if(_d===undefined){
-continue;
-}
-if(!dojo.isArray(_d)){
-_d=[_d];
-}
-if(typeof _c[0].checked=="boolean"){
-dojo.forEach(_c,function(w,i){
-w.set("value",dojo.indexOf(_d,w.value)!=-1);
-});
-}else{
-if(_c[0].multiple){
-_c[0].set("value",_d);
-}else{
-dojo.forEach(_c,function(w,i){
-w.set("value",_d[i]);
-});
-}
-}
-}
-},getValues:function(){
-dojo.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.","","2.0");
-return this.get("value");
-},_getValueAttr:function(){
-var _e={};
-dojo.forEach(this.getDescendants(),function(_f){
-var _10=_f.name;
-if(!_10||_f.disabled){
-return;
-}
-var _11=_f.get("value");
-if(typeof _f.checked=="boolean"){
-if(/Radio/.test(_f.declaredClass)){
-if(_11!==false){
-dojo.setObject(_10,_11,_e);
-}else{
-_11=dojo.getObject(_10,false,_e);
-if(_11===undefined){
-dojo.setObject(_10,null,_e);
-}
-}
-}else{
-var ary=dojo.getObject(_10,false,_e);
-if(!ary){
-ary=[];
-dojo.setObject(_10,ary,_e);
-}
-if(_11!==false){
-ary.push(_11);
-}
-}
-}else{
-var _12=dojo.getObject(_10,false,_e);
-if(typeof _12!="undefined"){
-if(dojo.isArray(_12)){
-_12.push(_11);
-}else{
-dojo.setObject(_10,[_12,_11],_e);
-}
-}else{
-dojo.setObject(_10,_11,_e);
-}
-}
-});
-return _e;
-},isValid:function(){
-this._invalidWidgets=dojo.filter(this.getDescendants(),function(_13){
-return !_13.disabled&&_13.isValid&&!_13.isValid();
-});
-return !this._invalidWidgets.length;
-},onValidStateChange:function(_14){
-},_widgetChange:function(_15){
-var _16=this._lastValidState;
-if(!_15||this._lastValidState===undefined){
-_16=this.isValid();
-if(this._lastValidState===undefined){
-this._lastValidState=_16;
-}
-}else{
-if(_15.isValid){
-this._invalidWidgets=dojo.filter(this._invalidWidgets||[],function(w){
-return (w!=_15);
-},this);
-if(!_15.isValid()&&!_15.get("disabled")){
-this._invalidWidgets.push(_15);
-}
-_16=(this._invalidWidgets.length===0);
-}
-}
-if(_16!==this._lastValidState){
-this._lastValidState=_16;
-this.onValidStateChange(_16);
-}
-},connectChildren:function(){
-dojo.forEach(this._changeConnections,dojo.hitch(this,"disconnect"));
-var _17=this;
-var _18=(this._changeConnections=[]);
-dojo.forEach(dojo.filter(this.getDescendants(),function(_19){
-return _19.validate;
-}),function(_1a){
-_18.push(_17.connect(_1a,"validate",dojo.hitch(_17,"_widgetChange",_1a)));
-_18.push(_17.connect(_1a,"_setDisabledAttr",dojo.hitch(_17,"_widgetChange",_1a)));
-});
-this._widgetChange(null);
-},startup:function(){
-this.inherited(arguments);
-this._changeConnections=[];
-this.connectChildren();
-}});
+
+
+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);
+ }
+
+ });
+
}
diff --git a/lib/dijit/form/_FormSelectWidget.js b/lib/dijit/form/_FormSelectWidget.js
index 5905c0aef..fbbf7226b 100644
--- a/lib/dijit/form/_FormSelectWidget.js
+++ b/lib/dijit/form/_FormSelectWidget.js
@@ -1,307 +1,582 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form._FormSelectWidget"]=true;
+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");
-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(_1){
-var _2=_1,_3=this.options||[],l=_3.length;
-if(_2===undefined){
-return _3;
-}
-if(dojo.isArray(_2)){
-return dojo.map(_2,"return this.getOptions(item);",this);
-}
-if(dojo.isObject(_1)){
-if(!dojo.some(this.options,function(o,_4){
-if(o===_2||(o.value&&o.value===_2.value)){
-_2=_4;
-return true;
-}
-return false;
-})){
-_2=-1;
-}
-}
-if(typeof _2=="string"){
-for(var i=0;i<l;i++){
-if(_3[i].value===_2){
-_2=i;
-break;
-}
-}
-}
-if(typeof _2=="number"&&_2>=0&&_2<l){
-return this.options[_2];
-}
-return null;
-},addOption:function(_5){
-if(!dojo.isArray(_5)){
-_5=[_5];
-}
-dojo.forEach(_5,function(i){
-if(i&&dojo.isObject(i)){
-this.options.push(i);
-}
-},this);
-this._loadChildren();
-},removeOption:function(_6){
-if(!dojo.isArray(_6)){
-_6=[_6];
-}
-var _7=this.getOptions(_6);
-dojo.forEach(_7,function(i){
-if(i){
-this.options=dojo.filter(this.options,function(_8,_9){
-return (_8.value!==i.value);
-});
-this._removeOptionItem(i);
-}
-},this);
-this._loadChildren();
-},updateOption:function(_a){
-if(!dojo.isArray(_a)){
-_a=[_a];
-}
-dojo.forEach(_a,function(i){
-var _b=this.getOptions(i),k;
-if(_b){
-for(k in i){
-_b[k]=i[k];
-}
-}
-},this);
-this._loadChildren();
-},setStore:function(_c,_d,_e){
-var _f=this.store;
-_e=_e||{};
-if(_f!==_c){
-dojo.forEach(this._notifyConnections||[],dojo.disconnect);
-delete this._notifyConnections;
-if(_c&&_c.getFeatures()["dojo.data.api.Notification"]){
-this._notifyConnections=[dojo.connect(_c,"onNew",this,"_onNewItem"),dojo.connect(_c,"onDelete",this,"_onDeleteItem"),dojo.connect(_c,"onSet",this,"_onSetItem")];
-}
-this.store=_c;
-}
-this._onChangeActive=false;
-if(this.options&&this.options.length){
-this.removeOption(this.options);
-}
-if(_c){
-var cb=function(_10){
-if(this.sortByLabel&&!_e.sort&&_10.length){
-_10.sort(dojo.data.util.sorter.createSortFunction([{attribute:_c.getLabelAttributes(_10[0])[0]}],_c));
-}
-if(_e.onFetch){
-_10=_e.onFetch(_10);
-}
-dojo.forEach(_10,function(i){
-this._addOptionForItem(i);
-},this);
-this._loadingStore=false;
-this.set("value",(("_pendingValue" in this)?this._pendingValue:_d));
-delete this._pendingValue;
-if(!this.loadChildrenOnOpen){
-this._loadChildren();
-}else{
-this._pseudoLoadChildren(_10);
-}
-this._fetchedWith=_11;
-this._lastValueReported=this.multiple?[]:null;
-this._onChangeActive=true;
-this.onSetStore();
-this._handleOnChange(this.value);
-};
-var _11=dojo.mixin({onComplete:cb,scope:this},_e);
-this._loadingStore=true;
-_c.fetch(_11);
-}else{
-delete this._fetchedWith;
-}
-return _f;
-},_setValueAttr:function(_12,_13){
-if(this._loadingStore){
-this._pendingValue=_12;
-return;
-}
-var _14=this.getOptions()||[];
-if(!dojo.isArray(_12)){
-_12=[_12];
-}
-dojo.forEach(_12,function(i,idx){
-if(!dojo.isObject(i)){
-i=i+"";
-}
-if(typeof i==="string"){
-_12[idx]=dojo.filter(_14,function(_15){
-return _15.value===i;
-})[0]||{value:"",label:""};
-}
-},this);
-_12=dojo.filter(_12,function(i){
-return i&&i.value;
-});
-if(!this.multiple&&(!_12[0]||!_12[0].value)&&_14.length){
-_12[0]=_14[0];
-}
-dojo.forEach(_14,function(i){
-i.selected=dojo.some(_12,function(v){
-return v.value===i.value;
-});
-});
-var val=dojo.map(_12,function(i){
-return i.value;
-}),_16=dojo.map(_12,function(i){
-return i.label;
-});
-this.value=this.multiple?val:val[0];
-this._setDisplay(this.multiple?_16:_16[0]);
-this._updateSelection();
-this._handleOnChange(this.value,_13);
-},_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];
-},_getValueDeprecated:false,getValue:function(){
-return this._lastValue;
-},undo:function(){
-this._setValueAttr(this._lastValueReported,false);
-},_loadChildren:function(){
-if(this._loadingStore){
-return;
-}
-dojo.forEach(this._getChildren(),function(_17){
-_17.destroyRecursive();
-});
-dojo.forEach(this.options,this._addOptionItem,this);
-this._updateSelection();
-},_updateSelection:function(){
-this.value=this._getValueFromOpts();
-var val=this.value;
-if(!dojo.isArray(val)){
-val=[val];
-}
-if(val&&val[0]){
-dojo.forEach(this._getChildren(),function(_18){
-var _19=dojo.some(val,function(v){
-return _18.option&&(v===_18.option.value);
+
+
+/*=====
+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
+ }
});
-dojo.toggleClass(_18.domNode,this.baseClass+"SelectedOption",_19);
-dijit.setWaiState(_18.domNode,"selected",_19);
-},this);
-}
-this._handleOnChange(this.value);
-},_getValueFromOpts:function(){
-var _1a=this.getOptions()||[];
-if(!this.multiple&&_1a.length){
-var opt=dojo.filter(_1a,function(i){
-return i.selected;
-})[0];
-if(opt&&opt.value){
-return opt.value;
-}else{
-_1a[0].selected=true;
-return _1a[0].value;
-}
-}else{
-if(this.multiple){
-return dojo.map(dojo.filter(_1a,function(i){
-return i.selected;
-}),function(i){
-return i.value;
-})||[];
-}
-}
-return "";
-},_onNewItem:function(_1b,_1c){
-if(!_1c||!_1c.parent){
-this._addOptionForItem(_1b);
-}
-},_onDeleteItem:function(_1d){
-var _1e=this.store;
-this.removeOption(_1e.getIdentity(_1d));
-},_onSetItem:function(_1f){
-this.updateOption(this._getOptionObjForItem(_1f));
-},_getOptionObjForItem:function(_20){
-var _21=this.store,_22=_21.getLabel(_20),_23=(_22?_21.getIdentity(_20):null);
-return {value:_23,label:_22,item:_20};
-},_addOptionForItem:function(_24){
-var _25=this.store;
-if(!_25.isItemLoaded(_24)){
-_25.loadItem({item:_24,onComplete:function(i){
-this._addOptionForItem(_24);
-},scope:this});
-return;
-}
-var _26=this._getOptionObjForItem(_24);
-this.addOption(_26);
-},constructor:function(_27){
-this._oValue=(_27||{}).value||null;
-},_fillContent:function(){
-var _28=this.options;
-if(!_28){
-_28=this.options=this.srcNodeRef?dojo.query(">",this.srcNodeRef).map(function(_29){
-if(_29.getAttribute("type")==="separator"){
-return {value:"",label:"",selected:false,disabled:false};
-}
-return {value:_29.getAttribute("value"),label:String(_29.innerHTML),selected:_29.getAttribute("selected")||false,disabled:_29.getAttribute("disabled")||false};
-},this):[];
-}
-if(!this.value){
-this.value=this._getValueFromOpts();
-}else{
-if(this.multiple&&typeof this.value=="string"){
-this.value=this.value.split(",");
-}
-}
-},postCreate:function(){
-dojo.setSelectable(this.focusNode,false);
-this.inherited(arguments);
-this.connect(this,"onChange","_updateSelection");
-this.connect(this,"startup","_loadChildren");
-this._setValueAttr(this.value,null);
-},startup:function(){
-this.inherited(arguments);
-var _2a=this.store,_2b={};
-dojo.forEach(["query","queryOptions","onFetch"],function(i){
-if(this[i]){
-_2b[i]=this[i];
-}
-delete this[i];
-},this);
-if(_2a&&_2a.getFeatures()["dojo.data.api.Identity"]){
-this.store=null;
-this.setStore(_2a,this._oValue,_2b);
-}
-},destroy:function(){
-dojo.forEach(this._notifyConnections||[],dojo.disconnect);
-this.inherited(arguments);
-},_addOptionItem:function(_2c){
-},_removeOptionItem:function(_2d){
-},_setDisplay:function(_2e){
-},_getChildren:function(){
-return [];
-},_getSelectedOptionsAttr:function(){
-return this.getOptions(this.get("value"));
-},_pseudoLoadChildren:function(_2f){
-},onSetStore:function(){
-}});
+
}
diff --git a/lib/dijit/form/_FormWidget.js b/lib/dijit/form/_FormWidget.js
index eb80ca06b..ebd1cfb18 100644
--- a/lib/dijit/form/_FormWidget.js
+++ b/lib/dijit/form/_FormWidget.js
@@ -1,166 +1,377 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form._FormWidget"]=true;
+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],{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(_1){
-this.disabled=_1;
-dojo.attr(this.focusNode,"disabled",_1);
-if(this.valueNode){
-dojo.attr(this.valueNode,"disabled",_1);
-}
-dijit.setWaiState(this.focusNode,"disabled",_1);
-if(_1){
-this._hovering=false;
-this._active=false;
-var _2="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:"focusNode";
-dojo.forEach(dojo.isArray(_2)?_2:[_2],function(_3){
-var _4=this[_3];
-if(dojo.isWebKit||dijit.hasDefaultTabStop(_4)){
-_4.setAttribute("tabIndex","-1");
-}else{
-_4.removeAttribute("tabIndex");
-}
-},this);
-}else{
-this.focusNode.setAttribute("tabIndex",this.tabIndex);
-}
-},setDisabled:function(_5){
-dojo.deprecated("setDisabled("+_5+") is deprecated. Use set('disabled',"+_5+") instead.","","2.0");
-this.set("disabled",_5);
-},_onFocus:function(e){
-if(this.scrollOnFocus){
-dojo.window.scrollIntoView(this.domNode);
-}
-this.inherited(arguments);
-},isFocusable:function(){
-return !this.disabled&&!this.readOnly&&this.focusNode&&(dojo.style(this.domNode,"display")!="none");
-},focus:function(){
-dijit.focus(this.focusNode);
-},compare:function(_6,_7){
-if(typeof _6=="number"&&typeof _7=="number"){
-return (isNaN(_6)&&isNaN(_7))?0:_6-_7;
-}else{
-if(_6>_7){
-return 1;
-}else{
-if(_6<_7){
-return -1;
-}else{
-return 0;
-}
-}
-}
-},onChange:function(_8){
-},_onChangeActive:false,_handleOnChange:function(_9,_a){
-this._lastValue=_9;
-if(this._lastValueReported==undefined&&(_a===null||!this._onChangeActive)){
-this._resetValue=this._lastValueReported=_9;
-}
-if((this.intermediateChanges||_a||_a===undefined)&&((typeof _9!=typeof this._lastValueReported)||this.compare(_9,this._lastValueReported)!=0)){
-this._lastValueReported=_9;
-if(this._onChangeActive){
-if(this._onChangeHandle){
-clearTimeout(this._onChangeHandle);
-}
-this._onChangeHandle=setTimeout(dojo.hitch(this,function(){
-this._onChangeHandle=null;
-this.onChange(_9);
-}),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(_b){
-dojo.deprecated("dijit.form._FormWidget:setValue("+_b+") is deprecated. Use set('value',"+_b+") instead.","","2.0");
-this.set("value",_b);
-},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&&this.isFocusable()){
-var _c=this.connect(dojo.body(),"onmouseup",function(){
-if(this.isFocusable()){
-this.focus();
-}
-this.disconnect(_c);
+
+
+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,{readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"",readOnly:"focusNode"}),_setReadOnlyAttr:function(_d){
-this.readOnly=_d;
-dojo.attr(this.focusNode,"readOnly",_d);
-dijit.setWaiState(this.focusNode,"readonly",_d);
-},postCreate:function(){
-this.inherited(arguments);
-if(dojo.isIE){
-this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);
-}
-if(this._resetValue===undefined){
-this._resetValue=this.value;
-}
-},_setValueAttr:function(_e,_f){
-this.value=_e;
-this._handleOnChange(_e,_f);
-},_getValueAttr:function(){
-return this._lastValue;
-},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 _10=this.domNode;
-var _11=_10.parentNode;
-var _12=_10.firstChild||_10;
-var _13=_12.style.filter;
-var _14=this;
-while(_11&&_11.clientHeight==0){
-(function ping(){
-var _15=_14.connect(_11,"onscroll",function(e){
-_14.disconnect(_15);
-_12.style.filter=(new Date()).getMilliseconds();
-setTimeout(function(){
-_12.style.filter=_13;
-},0);
+
+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;
+ }
+ }
+ }
});
-})();
-_11=_11.parentNode;
-}
-}
-}});
+
}
diff --git a/lib/dijit/form/_Spinner.js b/lib/dijit/form/_Spinner.js
index 772f667dc..37750ffb7 100644
--- a/lib/dijit/form/_Spinner.js
+++ b/lib/dijit/form/_Spinner.js
@@ -1,57 +1,128 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.form._Spinner"]=true;
+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,{defaultTimeout:500,minimumTimeout:10,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:dojo.cache("dijit.form","templates/Spinner.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\" waiRole=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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 waiRole=\"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 waiRole=\"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=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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\twaiRole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"),baseClass:"dijitTextBox dijitSpinner",cssStateNodes:{"upArrowNode":"dijitUpArrowButton","downArrowNode":"dijitDownArrowButton"},adjust:function(_1,_2){
-return _1;
-},_arrowPressed:function(_3,_4,_5){
-if(this.disabled||this.readOnly){
-return;
-}
-this._setValueAttr(this.adjust(this.get("value"),_4*_5),false);
-dijit.selectInputText(this.textbox,this.textbox.value.length);
-},_arrowReleased:function(_6){
-this._wheelTimer=null;
-if(this.disabled||this.readOnly){
-return;
-}
-},_typematicCallback:function(_7,_8,_9){
-var _a=this.smallDelta;
-if(_8==this.textbox){
-var k=dojo.keys;
-var _b=_9.charOrCode;
-_a=(_b==k.PAGE_UP||_b==k.PAGE_DOWN)?this.largeDelta:this.smallDelta;
-_8=(_b==k.UP_ARROW||_b==k.PAGE_UP)?this.upArrowNode:this.downArrowNode;
-}
-if(_7==-1){
-this._arrowReleased(_8);
-}else{
-this._arrowPressed(_8,(_8==this.upArrowNode)?1:-1,_a);
-}
-},_wheelTimer:null,_mouseWheeled:function(_c){
-dojo.stopEvent(_c);
-var _d=_c.detail?(_c.detail*-1):(_c.wheelDelta/120);
-if(_d!==0){
-var _e=this[(_d>0?"upArrowNode":"downArrowNode")];
-this._arrowPressed(_e,_d,this.smallDelta);
-if(!this._wheelTimer){
-clearTimeout(this._wheelTimer);
-}
-this._wheelTimer=setTimeout(dojo.hitch(this,"_arrowReleased",_e),50);
-}
-},postCreate:function(){
-this.inherited(arguments);
-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));
-}});
+
+
+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));
+ }
+});
+
}
diff --git a/lib/dijit/form/nls/da/validate.js b/lib/dijit/form/nls/da/validate.js
index 2874dd890..b42a99d39 100644
--- a/lib/dijit/form/nls/da/validate.js
+++ b/lib/dijit/form/nls/da/validate.js
@@ -1 +1 @@
-({"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ugyldig.","missingMessage":"Værdien er påkrævet."}) \ No newline at end of file
+({"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
diff --git a/lib/dijit/form/nls/kk/ComboBox.js b/lib/dijit/form/nls/kk/ComboBox.js
new file mode 100644
index 000000000..edb918a9c
--- /dev/null
+++ b/lib/dijit/form/nls/kk/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Алдыңғы нұсқалар","nextMessage":"Басқа нұсқалар"}) \ No newline at end of file
diff --git a/lib/dijit/form/nls/kk/Textarea.js b/lib/dijit/form/nls/kk/Textarea.js
new file mode 100644
index 000000000..617fcb91e
--- /dev/null
+++ b/lib/dijit/form/nls/kk/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"өңдеу аумағы","iframeFocusTitle":"өңдеу аумағының жақтауы"}) \ No newline at end of file
diff --git a/lib/dijit/form/nls/kk/validate.js b/lib/dijit/form/nls/kk/validate.js
new file mode 100644
index 000000000..d67612119
--- /dev/null
+++ b/lib/dijit/form/nls/kk/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Бұл мән ауқымнан тыс.","invalidMessage":"Енгізілген мән жарамды емес.","missingMessage":"Бұл мән міндетті."}) \ No newline at end of file
diff --git a/lib/dijit/form/nls/pl/Textarea.js b/lib/dijit/form/nls/pl/Textarea.js
index d918f59e0..33b050a1d 100644
--- a/lib/dijit/form/nls/pl/Textarea.js
+++ b/lib/dijit/form/nls/pl/Textarea.js
@@ -1 +1 @@
-({"iframeEditTitle":"Obszar edycji","iframeFocusTitle":"Ramka obszaru edycji"}) \ No newline at end of file
+({"iframeEditTitle":"edycja obszaru","iframeFocusTitle":"edycja ramki obszaru"}) \ No newline at end of file
diff --git a/lib/dijit/form/nls/sl/ComboBox.js b/lib/dijit/form/nls/sl/ComboBox.js
index e9556880c..61d4469c6 100644
--- a/lib/dijit/form/nls/sl/ComboBox.js
+++ b/lib/dijit/form/nls/sl/ComboBox.js
@@ -1 +1 @@
-({"previousMessage":"Prejšnje možnosti","nextMessage":"Dodatne možnosti"}) \ No newline at end of file
+({"previousMessage":"Prejšnje izbire","nextMessage":"Dodatne izbire"}) \ No newline at end of file
diff --git a/lib/dijit/form/nls/sl/Textarea.js b/lib/dijit/form/nls/sl/Textarea.js
index 912ee3962..0e0d51175 100644
--- a/lib/dijit/form/nls/sl/Textarea.js
+++ b/lib/dijit/form/nls/sl/Textarea.js
@@ -1 +1 @@
-({"iframeEditTitle":"urejanje področja","iframeFocusTitle":"urejanje področja okvirja"}) \ No newline at end of file
+({"iframeEditTitle":"urejevalno področje","iframeFocusTitle":"okvir urejevalnega področja"}) \ No newline at end of file
diff --git a/lib/dijit/form/nls/sl/validate.js b/lib/dijit/form/nls/sl/validate.js
index 763572486..b84b35350 100644
--- a/lib/dijit/form/nls/sl/validate.js
+++ b/lib/dijit/form/nls/sl/validate.js
@@ -1 +1 @@
-({"rangeMessage":"Ta vrednost je zunaj obsega. ","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."}) \ No newline at end of file
+({"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."}) \ No newline at end of file
diff --git a/lib/dijit/icons/commonIcons.css b/lib/dijit/icons/commonIcons.css
index 373752a81..6f2749240 100644
--- a/lib/dijit/icons/commonIcons.css
+++ b/lib/dijit/icons/commonIcons.css
@@ -1,3 +1,10 @@
+/* Dijit widget common icons*/
+
+/*commonIcons.css is located in dijit/icons
+
+commonIconsRtl.css is TBD. This needs to be reviewed to determine in Rtl is reqd.
+
+The 16 x 16px icons in these sprites are action and object type images which can be used in the following widgets: accordionContainer, menu, tab, titlepane, tree, and all button widgets and error validation contexts. */
.dijitIconSave,
.dijitIconPrint,
@@ -34,10 +41,11 @@
.dijitFolderOpened,
.dijitIconFolderOpen,
.dijitIconError {
- background-image: url('images/commonIconsObjActEnabled.png');
+ background-image: url('images/commonIconsObjActEnabled.png'); /* Contains both object and action icons in a sprite image for the enabled state. */
width: 16px;
height: 16px;
}
+
.dj_ie6 .dijitIconSave,
.dj_ie6 .dijitIconPrint,
.dj_ie6 .dijitIconCut,
@@ -75,6 +83,7 @@
.dj_ie6 .dijitIconError {
background-image: url('images/commonIconsObjActEnabled8bit.png');
}
+
.dijitDisabled .dijitIconSave,
.dijitDisabled .dijitIconPrint,
.dijitDisabled .dijitIconCut,
@@ -110,8 +119,10 @@
.dijitDisabled .dijitFolderOpened,
.dijitDisabled .dijitIconFolderOpen,
.dijitDisabled .dijitIconError {
- background-image: url('images/commonIconsObjActDisabled.png');
+ background-image: url('images/commonIconsObjActDisabled.png'); /* Contains both object and action icons as a sprite image for the disabled state. These would be used by buttons and menus. */
}
+
+/*Action icons*/
.dijitIconSave { background-position: 0px; }
.dijitIconPrint { background-position: -16px; }
.dijitIconCut { background-position: -32px; }
@@ -128,6 +139,9 @@
.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; }
.dijitIconBookmark { background-position: -256px; }
.dijitIconChart { background-position: -272px; }
@@ -142,5 +156,9 @@
.dijitIconSample { background-position: -416px; }
.dijitIconTable { background-position: -432px; }
.dijitIconUsers { background-position: -448px; }
+
+
+/*Tree folder icons*/
.dijitIconFolderClosed, .dijitFolderClosed { background-position: -464px; }
.dijitIconFolderOpen, .dijitFolderOpened { background-position: -480px; }
+
diff --git a/lib/dijit/icons/commonIcons_rtl.css b/lib/dijit/icons/commonIcons_rtl.css
index 347f3b792..4d4c26f2d 100644
--- a/lib/dijit/icons/commonIcons_rtl.css
+++ b/lib/dijit/icons/commonIcons_rtl.css
@@ -1,3 +1,8 @@
+/* Dijit widget common icons*/
+
+/*commonIcons_rtl.css is located in dijit/icons
+
+The 16 x 16px icons in these sprites are action and object type images which can be used in the following widgets: accordionContainer, menu, tab, titlepane, tree, and all button widgets and error validation contexts. */
.dijitRtl .dijitIconSave,
.dijitRtl .dijitIconPrint,
@@ -34,10 +39,11 @@
.dijitRtl .dijitFolderOpened,
.dijitRtl .dijitIconFolderOpen,
.dijitRtl .dijitIconError, .dijitRtl .dijitContentPaneError {
- background-image: url('images/commonIconsObjActEnabled_rtl.png');
+ 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;
}
+
.dj_ie6 .dijitRtl .dijitIconSave,
.dj_ie6 .dijitRtl .dijitIconPrint,
.dj_ie6 .dijitRtl .dijitIconCut,
@@ -75,6 +81,7 @@
.dj_ie6 .dijitRtl .dijitIconError, .dj_ie6 .dijitRtl .dijitContentPaneError {
background-image: url('images/commonIconsObjActEnabled8bit_rtl.png');
}
+
.dijitRtl .dijitDisabled .dijitIconSave,
.dijitRtl .dijitDisabled .dijitIconPrint,
.dijitRtl .dijitDisabled .dijitIconCut,
@@ -110,8 +117,11 @@
.dijitRtl .dijitDisabled .dijitFolderOpened,
.dijitRtl .dijitDisabled .dijitIconFolderOpen,
.dijitRtl .dijitDisabled .dijitIconError, .dijitRtl .dijitDisabled .dijitContentPaneError {
- background-image: url('images/commonIconsObjActDisabled_rtl.png');
+ 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 90ee97e20..8c667ac7d 100644
--- a/lib/dijit/icons/editorIcons.css
+++ b/lib/dijit/icons/editorIcons.css
@@ -1,14 +1,24 @@
+/* Dijit Editor icons*/
+
+/*editorIcons.css is located in dijit/images
+
+editorIcons.css contains references to the dijit editor widget icons. There are 46 icons used to map to the related editor funtionality in the editor's toolbar.
+
+*/
+
.dijitEditorIcon {
- background-image: url('images/editorIconsEnabled.png');
+ background-image: url('images/editorIconsEnabled.png'); /* editor icons sprite image for the enabled state */
background-repeat: no-repeat;
width: 18px;
height: 18px;
text-align: center;
}
.dijitDisabled .dijitEditorIcon {
- background-image: url('images/editorIconsDisabled.png');
+ background-image: url('images/editorIconsDisabled.png'); /* editor icons sprite image for the disabled state */
}
+
+
.dijitEditorIconSep { background-position: 0px; }
.dijitEditorIconSave { background-position: -18px; }
.dijitEditorIconPrint { background-position: -36px; }
@@ -55,3 +65,14 @@
.dijitEditorIconRemoveFormat { background-position: -774px; }
.dijitEditorIconFullScreen { background-position: -792px; }
.dijitEditorIconWikiword { background-position: -810px; }
+/* .dijitEditorIconToggleDir { background-position: -540px; ;} - 03172010: This icon was not in dijit.editor but is in dojox.editor. */
+
+/* no longer in the editor toolbar: .dijitEditorIconToggleDir { background-position: -540px; padding: 0; margin: 0; color:#555555;
+ font-family:verdana,arial,sans-serif; font-weight: 800; font-size: 70%; */
+
+
+
+
+
+
+
diff --git a/lib/dijit/icons/editorIcons_rtl.css b/lib/dijit/icons/editorIcons_rtl.css
index 8dcdd7370..4d8cb7198 100644
--- a/lib/dijit/icons/editorIcons_rtl.css
+++ b/lib/dijit/icons/editorIcons_rtl.css
@@ -1,10 +1,23 @@
+/* Dijit Editor RTL icons*/
+/*editorIcons_rtl.css is located in dijit/images
+
+editorIcons_rtl.css contains references to the dijit editor widget icons. There are 46 icons used to map to the related editor funtionality in the editor's toolbar.
+
+*/
+
+
+/* Editor */
.dijitEditorRtl .dijitEditorIcon {
- background-image: url('images/editorIconsEnabled_rtl.png');
+ background-image: url('images/editorIconsEnabled_rtl.png'); /* editor icons sprite image for the enabled right to left state */
}
.dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url('images/editorIconsDisabled_rtl.png');
+ background-image: url('images/editorIconsDisabled_rtl.png'); /* editor icons sprite image for the disabled right to left state */
}
+
+/* Toolbar */
.dijitToolbarRtl .dijitToolbarSeparator {
background-image: url('images/editorIconsEnabled_rtl.png');
}
+
+/* took this information above from editorRtl.css - good or bad? */ \ No newline at end of file
diff --git a/lib/dijit/layout/AccordionContainer.js b/lib/dijit/layout/AccordionContainer.js
index 5bad370f5..6177583ba 100644
--- a/lib/dijit/layout/AccordionContainer.js
+++ b/lib/dijit/layout/AccordionContainer.js
@@ -1,220 +1,498 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.AccordionContainer"]=true;
+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("dojo.fx");
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.declare("dijit.layout.AccordionContainer",dijit.layout.StackContainer,{duration:dijit.defaultDuration,buttonWidget:"dijit.layout._AccordionButton",_verticalSpace:0,baseClass:"dijitAccordionContainer",postCreate:function(){
-this.domNode.style.overflow="hidden";
-this.inherited(arguments);
-dijit.setWaiRole(this.domNode,"tablist");
-},startup:function(){
-if(this._started){
-return;
-}
-this.inherited(arguments);
-if(this.selectedChildWidget){
-var _1=this.selectedChildWidget.containerNode.style;
-_1.display="";
-_1.overflow="auto";
-this.selectedChildWidget._wrapperWidget.set("selected",true);
-}
-},_getTargetHeight:function(_2){
-var cs=dojo.getComputedStyle(_2);
-return Math.max(this._verticalSpace-dojo._getPadBorderExtents(_2,cs).h-dojo._getMarginExtents(_2,cs).h,0);
-},layout:function(){
-var _3=this.selectedChildWidget;
-if(!_3){
-return;
-}
-var _4=_3._wrapperWidget.domNode,_5=dojo._getMarginExtents(_4),_6=dojo._getPadBorderExtents(_4),_7=this._contentBox;
-var _8=0;
-dojo.forEach(this.getChildren(),function(_9){
-if(_9!=_3){
-_8+=dojo.marginBox(_9._wrapperWidget.domNode).h;
-}
-});
-this._verticalSpace=_7.h-_8-_5.h-_6.h-_3._buttonWidget.getTitleHeight();
-this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_5.w-_6.w};
-if(_3){
-_3.resize(this._containerContentBox);
-}
-},_setupChild:function(_a){
-_a._wrapperWidget=new dijit.layout._AccordionInnerContainer({contentWidget:_a,buttonWidget:this.buttonWidget,id:_a.id+"_wrapper",dir:_a.dir,lang:_a.lang,parent:this});
-this.inherited(arguments);
-},addChild:function(_b,_c){
-if(this._started){
-dojo.place(_b.domNode,this.containerNode,_c);
-if(!_b._started){
-_b.startup();
-}
-this._setupChild(_b);
-dojo.publish(this.id+"-addChild",[_b,_c]);
-this.layout();
-if(!this.selectedChildWidget){
-this.selectChild(_b);
-}
-}else{
-this.inherited(arguments);
-}
-},removeChild:function(_d){
-_d._wrapperWidget.destroy();
-delete _d._wrapperWidget;
-dojo.removeClass(_d.domNode,"dijitHidden");
-this.inherited(arguments);
-},getChildren:function(){
-return dojo.map(this.inherited(arguments),function(_e){
-return _e.declaredClass=="dijit.layout._AccordionInnerContainer"?_e.contentWidget:_e;
-},this);
-},destroy:function(){
-dojo.forEach(this.getChildren(),function(_f){
-_f._wrapperWidget.destroy();
+
+
+//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();
+ }
});
-this.inherited(arguments);
-},_transition:function(_10,_11,_12){
-if(this._inTransition){
-return;
-}
-var _13=[];
-var _14=this._verticalSpace;
-if(_10){
-_10._wrapperWidget.set("selected",true);
-this._showChild(_10);
-if(this.doLayout&&_10.resize){
-_10.resize(this._containerContentBox);
-}
-var _15=_10.domNode;
-dojo.addClass(_15,"dijitVisible");
-dojo.removeClass(_15,"dijitHidden");
-if(_12){
-var _16=_15.style.overflow;
-_15.style.overflow="hidden";
-_13.push(dojo.animateProperty({node:_15,duration:this.duration,properties:{height:{start:1,end:this._getTargetHeight(_15)}},onEnd:function(){
-_15.style.overflow=_16;
-if(dojo.isIE){
-setTimeout(function(){
-dojo.removeClass(_15.parentNode,"dijitAccordionInnerContainerFocused");
-setTimeout(function(){
-dojo.addClass(_15.parentNode,"dijitAccordionInnerContainerFocused");
-},0);
-},0);
-}
-}}));
-}
-}
-if(_11){
-_11._wrapperWidget.set("selected",false);
-var _17=_11.domNode;
-if(_12){
-var _18=_17.style.overflow;
-_17.style.overflow="hidden";
-_13.push(dojo.animateProperty({node:_17,duration:this.duration,properties:{height:{start:this._getTargetHeight(_17),end:1}},onEnd:function(){
-dojo.addClass(_17,"dijitHidden");
-dojo.removeClass(_17,"dijitVisible");
-_17.style.overflow=_18;
-if(_11.onHide){
-_11.onHide();
-}
-}}));
-}else{
-dojo.addClass(_17,"dijitHidden");
-dojo.removeClass(_17,"dijitVisible");
-if(_11.onHide){
-_11.onHide();
-}
-}
-}
-if(_12){
-this._inTransition=true;
-var _19=dojo.fx.combine(_13);
-_19.onEnd=dojo.hitch(this,function(){
-delete this._inTransition;
+
+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");
+ }
});
-_19.play();
-}
-},_onKeyPress:function(e,_1a){
-if(this._inTransition||this.disabled||e.altKey||!(_1a||e.ctrlKey)){
-if(this._inTransition){
-dojo.stopEvent(e);
-}
-return;
-}
-var k=dojo.keys,c=e.charOrCode;
-if((_1a&&(c==k.LEFT_ARROW||c==k.UP_ARROW))||(e.ctrlKey&&c==k.PAGE_UP)){
-this._adjacent(false)._buttonWidget._onTitleClick();
-dojo.stopEvent(e);
-}else{
-if((_1a&&(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 _1b=this.contentWidget,cls=dojo.getObject(this.buttonWidget);
-this.button=_1b._buttonWidget=(new cls({contentWidget:_1b,label:_1b.title,title:_1b.tooltip,dir:_1b.dir,lang:_1b.lang,iconClass:_1b.iconClass,id:_1b.id+"_button",parent:this.parent})).placeAt(this.domNode);
-dojo.place(this.contentWidget.domNode,this.domNode);
-},postCreate:function(){
-this.inherited(arguments);
-this.connect(this.contentWidget,"set",function(_1c,_1d){
-var _1e={title:"label",tooltip:"title",iconClass:"iconClass"}[_1c];
-if(_1e){
-this.button.set(_1e,_1d);
-}
-},this);
-},_setSelectedAttr:function(_1f){
-this.selected=_1f;
-this.button.set("selected",_1f);
-if(_1f){
-var cw=this.contentWidget;
-if(cw.onSelected){
-cw.onSelected();
-}
-}
-},startup:function(){
-this.contentWidget.startup();
-},destroy:function(){
-this.button.destroyRecursive();
-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' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowTextUp' waiRole=\"presentation\">+</span\n\t\t><span class='arrowTextDown' waiRole=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" waiRole=\"presentation\"/>\n\t\t<span waiRole=\"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;
-},postCreate:function(){
-this.inherited(arguments);
-dojo.setSelectable(this.domNode,false);
-var _20=dojo.attr(this.domNode,"id").replace(" ","_");
-dojo.attr(this.titleTextNode,"id",_20+"_title");
-dijit.setWaiState(this.focusNode,"labelledby",dojo.attr(this.titleTextNode,"id"));
-},getTitleHeight:function(){
-return dojo.marginBox(this.domNode).h;
-},_onTitleClick:function(){
-var _21=this.getParent();
-if(!_21._inTransition){
-_21.selectChild(this.contentWidget,true);
-dijit.focus(this.focusNode);
-}
-},_onTitleKeyPress:function(evt){
-return this.getParent()._onKeyPress(evt,this.contentWidget);
-},_setSelectedAttr:function(_22){
-this.selected=_22;
-dijit.setWaiState(this.focusNode,"expanded",_22);
-dijit.setWaiState(this.focusNode,"selected",_22);
-this.focusNode.setAttribute("tabIndex",_22?"0":"-1");
-}});
+
}
diff --git a/lib/dijit/layout/AccordionPane.js b/lib/dijit/layout/AccordionPane.js
index 98b92f8e8..394ba346c 100644
--- a/lib/dijit/layout/AccordionPane.js
+++ b/lib/dijit/layout/AccordionPane.js
@@ -1,16 +1,30 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.AccordionPane"]=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");
dojo.require("dijit.layout.ContentPane");
-dojo.declare("dijit.layout.AccordionPane",dijit.layout.ContentPane,{constructor:function(){
-dojo.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead","","2.0");
-},onSelected:function(){
-}});
+
+
+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
+ }
+});
+
}
diff --git a/lib/dijit/layout/BorderContainer.js b/lib/dijit/layout/BorderContainer.js
index 426a66216..c053256d4 100644
--- a/lib/dijit/layout/BorderContainer.js
+++ b/lib/dijit/layout/BorderContainer.js
@@ -1,327 +1,527 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.BorderContainer"]=true;
+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.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);
-},postCreate:function(){
-this.inherited(arguments);
-this._splitters={};
-this._splitterThickness={};
-},startup:function(){
-if(this._started){
-return;
-}
-dojo.forEach(this.getChildren(),this._setupChild,this);
-this.inherited(arguments);
-},_setupChild:function(_1){
-var _2=_1.region;
-if(_2){
-this.inherited(arguments);
-dojo.addClass(_1.domNode,this.baseClass+"Pane");
-var _3=this.isLeftToRight();
-if(_2=="leading"){
-_2=_3?"left":"right";
-}
-if(_2=="trailing"){
-_2=_3?"right":"left";
-}
-this["_"+_2]=_1.domNode;
-this["_"+_2+"Widget"]=_1;
-if((_1.splitter||this.gutters)&&!this._splitters[_2]){
-var _4=dojo.getObject(_1.splitter?this._splitterClass:"dijit.layout._Gutter");
-var _5=new _4({id:_1.id+"_splitter",container:this,child:_1,region:_2,live:this.liveSplitters});
-_5.isSplitter=true;
-this._splitters[_2]=_5.domNode;
-dojo.place(this._splitters[_2],_1.domNode,"after");
-_5.startup();
-}
-_1.region=_2;
-}
-},_computeSplitterThickness:function(_6){
-this._splitterThickness[_6]=this._splitterThickness[_6]||dojo.marginBox(this._splitters[_6])[(/top|bottom/.test(_6)?"h":"w")];
-},layout:function(){
-for(var _7 in this._splitters){
-this._computeSplitterThickness(_7);
-}
-this._layoutChildren();
-},addChild:function(_8,_9){
-this.inherited(arguments);
-if(this._started){
-this.layout();
-}
-},removeChild:function(_a){
-var _b=_a.region;
-var _c=this._splitters[_b];
-if(_c){
-dijit.byNode(_c).destroy();
-delete this._splitters[_b];
-delete this._splitterThickness[_b];
-}
-this.inherited(arguments);
-delete this["_"+_b];
-delete this["_"+_b+"Widget"];
-if(this._started){
-this._layoutChildren();
-}
-dojo.removeClass(_a.domNode,this.baseClass+"Pane");
-},getChildren:function(){
-return dojo.filter(this.inherited(arguments),function(_d){
-return !_d.isSplitter;
+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);
+ }
});
-},getSplitter:function(_e){
-var _f=this._splitters[_e];
-return _f?dijit.byNode(_f):null;
-},resize:function(_10,_11){
-if(!this.cs||!this.pe){
-var _12=this.domNode;
-this.cs=dojo.getComputedStyle(_12);
-this.pe=dojo._getPadExtents(_12,this.cs);
-this.pe.r=dojo._toPixelValue(_12,this.cs.paddingRight);
-this.pe.b=dojo._toPixelValue(_12,this.cs.paddingBottom);
-dojo.style(_12,"padding","0px");
-}
-this.inherited(arguments);
-},_layoutChildren:function(_13,_14){
-if(!this._borderBox||!this._borderBox.h){
-return;
-}
-var _15=(this.design=="sidebar");
-var _16=0,_17=0,_18=0,_19=0;
-var _1a={},_1b={},_1c={},_1d={},_1e=(this._center&&this._center.style)||{};
-var _1f=/left|right/.test(_13);
-var _20=!_13||(!_1f&&!_15);
-var _21=!_13||(_1f&&_15);
-if(this._top){
-_1a=(_13=="top"||_21)&&this._top.style;
-_16=_13=="top"?_14:dojo.marginBox(this._top).h;
-}
-if(this._left){
-_1b=(_13=="left"||_20)&&this._left.style;
-_18=_13=="left"?_14:dojo.marginBox(this._left).w;
-}
-if(this._right){
-_1c=(_13=="right"||_20)&&this._right.style;
-_19=_13=="right"?_14:dojo.marginBox(this._right).w;
-}
-if(this._bottom){
-_1d=(_13=="bottom"||_21)&&this._bottom.style;
-_17=_13=="bottom"?_14:dojo.marginBox(this._bottom).h;
-}
-var _22=this._splitters;
-var _23=_22.top,_24=_22.bottom,_25=_22.left,_26=_22.right;
-var _27=this._splitterThickness;
-var _28=_27.top||0,_29=_27.left||0,_2a=_27.right||0,_2b=_27.bottom||0;
-if(_29>50||_2a>50){
-setTimeout(dojo.hitch(this,function(){
-this._splitterThickness={};
-for(var _2c in this._splitters){
-this._computeSplitterThickness(_2c);
-}
-this._layoutChildren();
-}),50);
-return false;
-}
-var pe=this.pe;
-var _2d={left:(_15?_18+_29:0)+pe.l+"px",right:(_15?_19+_2a:0)+pe.r+"px"};
-if(_23){
-dojo.mixin(_23.style,_2d);
-_23.style.top=_16+pe.t+"px";
-}
-if(_24){
-dojo.mixin(_24.style,_2d);
-_24.style.bottom=_17+pe.b+"px";
-}
-_2d={top:(_15?0:_16+_28)+pe.t+"px",bottom:(_15?0:_17+_2b)+pe.b+"px"};
-if(_25){
-dojo.mixin(_25.style,_2d);
-_25.style.left=_18+pe.l+"px";
-}
-if(_26){
-dojo.mixin(_26.style,_2d);
-_26.style.right=_19+pe.r+"px";
-}
-dojo.mixin(_1e,{top:pe.t+_16+_28+"px",left:pe.l+_18+_29+"px",right:pe.r+_19+_2a+"px",bottom:pe.b+_17+_2b+"px"});
-var _2e={top:_15?pe.t+"px":_1e.top,bottom:_15?pe.b+"px":_1e.bottom};
-dojo.mixin(_1b,_2e);
-dojo.mixin(_1c,_2e);
-_1b.left=pe.l+"px";
-_1c.right=pe.r+"px";
-_1a.top=pe.t+"px";
-_1d.bottom=pe.b+"px";
-if(_15){
-_1a.left=_1d.left=_18+_29+pe.l+"px";
-_1a.right=_1d.right=_19+_2a+pe.r+"px";
-}else{
-_1a.left=_1d.left=pe.l+"px";
-_1a.right=_1d.right=pe.r+"px";
-}
-var _2f=this._borderBox.h-pe.t-pe.b,_30=_2f-(_16+_28+_17+_2b),_31=_15?_2f:_30;
-var _32=this._borderBox.w-pe.l-pe.r,_33=_32-(_18+_29+_19+_2a),_34=_15?_33:_32;
-var dim={top:{w:_34,h:_16},bottom:{w:_34,h:_17},left:{w:_18,h:_31},right:{w:_19,h:_31},center:{h:_30,w:_33}};
-if(_13){
-var _35=this["_"+_13+"Widget"],mb={};
-mb[/top|bottom/.test(_13)?"h":"w"]=_14;
-_35.resize?_35.resize(mb,dim[_35.region]):dojo.marginBox(_35.domNode,mb);
-}
-var _36=dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.some(this.getChildren(),function(_37){
-return _37.domNode.tagName=="TEXTAREA"||_37.domNode.tagName=="INPUT";
+
+// 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
});
-if(_36){
-var _38=function(_39,_3a,_3b){
-if(_39){
-(_39.resize?_39.resize(_3a,_3b):dojo.marginBox(_39.domNode,_3a));
-}
-};
-if(_25){
-_25.style.height=_31;
-}
-if(_26){
-_26.style.height=_31;
-}
-_38(this._leftWidget,{h:_31},dim.left);
-_38(this._rightWidget,{h:_31},dim.right);
-if(_23){
-_23.style.width=_34;
-}
-if(_24){
-_24.style.width=_34;
-}
-_38(this._topWidget,{w:_34},dim.top);
-_38(this._bottomWidget,{w:_34},dim.bottom);
-_38(this._centerWidget,dim.center);
-}else{
-var _3c=!_13||(/top|bottom/.test(_13)&&this.design!="sidebar"),_3d=!_13||(/left|right/.test(_13)&&this.design=="sidebar"),_3e={center:true,left:_3c,right:_3c,top:_3d,bottom:_3d};
-dojo.forEach(this.getChildren(),function(_3f){
-if(_3f.resize&&_3e[_3f.region]){
-_3f.resize(null,dim[_3f.region]);
-}
-},this);
-}
-},destroy:function(){
-for(var _40 in this._splitters){
-var _41=this._splitters[_40];
-dijit.byNode(_41).destroy();
-dojo.destroy(_41);
-}
-delete this._splitters;
-delete this._splitterThickness;
-this.inherited(arguments);
-}});
-dojo.extend(dijit._Widget,{region:"",splitter:false,minSize:0,maxSize:Infinity});
-dojo.require("dijit._Templated");
-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\" waiRole=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",postCreate:function(){
-this.inherited(arguments);
-this.horizontal=/top|bottom/.test(this.region);
-dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));
-this._factor=/top|left/.test(this.region)?1:-1;
-this._cookieName=this.container.id+"_"+this.region;
-if(this.container.persist){
-var _42=dojo.cookie(this._cookieName);
-if(_42){
-this.child.domNode.style[this.horizontal?"height":"width"]=_42;
-}
-}
-},_computeMaxSize:function(){
-var dim=this.horizontal?"h":"w",_43=this.container._splitterThickness[this.region];
-var _44={left:"right",right:"left",top:"bottom",bottom:"top",leading:"trailing",trailing:"leading"},_45=this.container["_"+_44[this.region]];
-var _46=dojo.contentBox(this.container.domNode)[dim]-(_45?dojo.marginBox(_45)[dim]:0)-20-_43*2;
-return Math.min(this.child.maxSize,_46);
-},_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");
-dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");
-if(this.fake){
-dojo.removeClass(this.fake,"dijitSplitterHover");
-dojo.removeClass(this.fake,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover");
-}
-var _47=this._factor,max=this._computeMaxSize(),min=this.child.minSize||20,_48=this.horizontal,_49=_48?"pageY":"pageX",_4a=e[_49],_4b=this.domNode.style,dim=_48?"h":"w",_4c=dojo.marginBox(this.child.domNode)[dim],_4d=this.region,_4e=parseInt(this.domNode.style[_4d],10),_4f=this._resize,_50=this.child.domNode,_51=dojo.hitch(this.container,this.container._layoutChildren),de=dojo.doc;
-this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_52){
-var _53=e[_49]-_4a,_54=_47*_53+_4c,_55=Math.max(Math.min(_54,max),min);
-if(_4f||_52){
-_51(_4d,_55);
-}
-_4b[_4d]=_47*_53+_4e+(_55-_54)+"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");
-dojo.removeClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");
-dojo.removeClass(this.domNode,"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 _56=this.horizontal;
-var _57=1;
-var dk=dojo.keys;
-switch(e.charOrCode){
-case _56?dk.UP_ARROW:dk.LEFT_ARROW:
-_57*=-1;
-case _56?dk.DOWN_ARROW:dk.RIGHT_ARROW:
-break;
-default:
-return;
-}
-var _58=dojo.marginBox(this.child.domNode)[_56?"h":"w"]+this._factor*_57;
-this.container._layoutChildren(this.region,Math.max(Math.min(_58,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\" waiRole=\"presentation\"></div>",postCreate:function(){
-this.horizontal=/top|bottom/.test(this.region);
-dojo.addClass(this.domNode,"dijitGutter"+(this.horizontal?"H":"V"));
-}});
+
+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"));
+ }
+});
+
}
diff --git a/lib/dijit/layout/ContentPane.js b/lib/dijit/layout/ContentPane.js
index 56952800a..399ec1bc9 100644
--- a/lib/dijit/layout/ContentPane.js
+++ b/lib/dijit/layout/ContentPane.js
@@ -1,291 +1,593 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.ContentPane"]=true;
+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._Contained");
-dojo.require("dijit.layout._LayoutWidget");
-dojo.require("dojo.parser");
+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,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.layout.ContentPane",dijit._Widget,{href:"",extractContent:false,parseOnLoad:true,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",doLayout:true,ioArgs:{},isContainer:true,isLayoutContainer:true,onLoadDeferred:null,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{title:[]}),postMixInProperties:function(){
-this.inherited(arguments);
-var _1=dojo.i18n.getLocalization("dijit","loading",this.lang);
-this.loadingMessage=dojo.string.substitute(this.loadingMessage,_1);
-this.errorMessage=dojo.string.substitute(this.errorMessage,_1);
-if(!this.href&&this.srcNodeRef&&this.srcNodeRef.innerHTML){
-this.isLoaded=true;
-}
-},buildRendering:function(){
-this.inherited(arguments);
-if(!this.containerNode){
-this.containerNode=this.domNode;
-}
-},postCreate:function(){
-this.domNode.title="";
-if(!dojo.attr(this.domNode,"role")){
-dijit.setWaiRole(this.domNode,"group");
-}
-dojo.addClass(this.domNode,this.baseClass);
-},startup:function(){
-if(this._started){
-return;
-}
-var _2=dijit._Contained.prototype.getParent.call(this);
-this._childOfLayoutWidget=_2&&_2.isLayoutContainer;
-this._needLayout=!this._childOfLayoutWidget;
-if(this.isLoaded){
-dojo.forEach(this.getChildren(),function(_3){
-_3.startup();
-});
-}
-if(this._isShown()||this.preload){
-this._onShow();
-}
-this.inherited(arguments);
-},_checkIfSingleChild:function(){
-var _4=dojo.query("> *",this.containerNode).filter(function(_5){
-return _5.tagName!=="SCRIPT";
-}),_6=_4.filter(function(_7){
-return dojo.hasAttr(_7,"dojoType")||dojo.hasAttr(_7,"widgetId");
-}),_8=dojo.filter(_6.map(dijit.byNode),function(_9){
-return _9&&_9.domNode&&_9.resize;
-});
-if(_4.length==_6.length&&_8.length==1){
-this._singleChild=_8[0];
-}else{
-delete this._singleChild;
-}
-dojo.toggleClass(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);
-},setHref:function(_a){
-dojo.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");
-return this.set("href",_a);
-},_setHrefAttr:function(_b){
-this.cancel();
-this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));
-this.href=_b;
-if(this._created&&(this.preload||this._isShown())){
-this._load();
-}else{
-this._hrefChanged=true;
-}
-return this.onLoadDeferred;
-},setContent:function(_c){
-dojo.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");
-this.set("content",_c);
-},_setContentAttr:function(_d){
-this.href="";
-this.cancel();
-this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));
-this._setContent(_d||"");
-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(_e){
-if(this._beingDestroyed){
-return;
-}
-this.inherited(arguments);
-},resize:function(_f,_10){
-if(!this._wasShown){
-this._onShow();
-}
-this._resizeCalled=true;
-if(_f){
-dojo.marginBox(this.domNode,_f);
-}
-var cn=this.containerNode;
-if(cn===this.domNode){
-var mb=_10||{};
-dojo.mixin(mb,_f||{});
-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();
-},_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 _11=this.domNode;
-return (_11.style.display!="none")&&(_11.style.visibility!="hidden")&&!dojo.hasClass(_11,"dijitHidden");
-}
-}
-},_onShow:function(){
-if(this.href){
-if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){
-this.refresh();
-}
-}else{
-if(!this._childOfLayoutWidget&&this._needLayout){
-this._layoutChildren();
-}
-}
-this.inherited(arguments);
-this._wasShown=true;
-},refresh:function(){
-this.cancel();
-this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));
-this._load();
-return this.onLoadDeferred;
-},_load:function(){
-this._setContent(this.onDownloadStart(),true);
-var _12=this;
-var _13={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};
-if(dojo.isObject(this.ioArgs)){
-dojo.mixin(_13,this.ioArgs);
-}
-var _14=(this._xhrDfd=(this.ioMethod||dojo.xhrGet)(_13));
-_14.addCallback(function(_15){
-try{
-_12._isDownloaded=true;
-_12._setContent(_15,false);
-_12.onDownloadEnd();
-}
-catch(err){
-_12._onError("Content",err);
-}
-delete _12._xhrDfd;
-return _15;
-});
-_14.addErrback(function(err){
-if(!_14.canceled){
-_12._onError("Download",err);
-}
-delete _12._xhrDfd;
-return err;
-});
-delete this._hrefChanged;
-},_onLoadHandler:function(_16){
-this.isLoaded=true;
-try{
-this.onLoadDeferred.callback(_16);
-this.onLoad(_16);
-}
-catch(e){
-console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);
-}
-},_onUnloadHandler:function(){
-this.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 _17=this._contentSetter;
-dojo.forEach(this.getChildren(),function(_18){
-if(_18.destroyRecursive){
-_18.destroyRecursive();
-}
-});
-if(_17){
-dojo.forEach(_17.parseResults,function(_19){
-if(_19.destroyRecursive&&_19.domNode&&_19.domNode.parentNode==dojo.body()){
-_19.destroyRecursive();
-}
-});
-delete _17.parseResults;
-}
-dojo.html._emptyNode(this.containerNode);
-delete this._singleChild;
-},_setContent:function(_1a,_1b){
-this.destroyDescendants();
-var _1c=this._contentSetter;
-if(!(_1c&&_1c instanceof dojo.html._ContentSetter)){
-_1c=this._contentSetter=new dojo.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){
-var _1d=this.onContentError(e);
-try{
-this.containerNode.innerHTML=_1d;
-}
-catch(e){
-console.error("Fatal "+this.id+" could not change content due to "+e.message,e);
-}
-})});
-}
-var _1e=dojo.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:this.parseOnLoad,dir:this.dir,lang:this.lang},this._contentSetterParams||{});
-dojo.mixin(_1c,_1e);
-_1c.set((dojo.isObject(_1a)&&_1a.domNode)?_1a.domNode:_1a);
-delete this._contentSetterParams;
-if(!_1b){
-dojo.forEach(this.getChildren(),function(_1f){
-if(!this.parseOnLoad||_1f.getParent){
-_1f.startup();
-}
-},this);
-this._scheduleLayout();
-this._onLoadHandler(_1a);
-}
-},_onError:function(_20,err,_21){
-this.onLoadDeferred.errback(err);
-var _22=this["on"+_20+"Error"].call(this,err);
-if(_21){
-console.error(_21,err);
-}else{
-if(_22){
-this._setContent(_22,true);
-}
-}
-},_scheduleLayout:function(){
-if(this._isShown()){
-this._layoutChildren();
-}else{
-this._needLayout=true;
-}
-},_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(_23){
-if(_23.resize){
-_23.resize();
-}
+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
+ }
});
-}
-delete this._needLayout;
-},onLoad:function(_24){
-},onUnload:function(){
-},onDownloadStart:function(){
-return this.loadingMessage;
-},onContentError:function(_25){
-},onDownloadError:function(_26){
-return this.errorMessage;
-},onDownloadEnd:function(){
-}});
+
}
diff --git a/lib/dijit/layout/LayoutContainer.js b/lib/dijit/layout/LayoutContainer.js
index 9d9fdc6a4..11204346f 100644
--- a/lib/dijit/layout/LayoutContainer.js
+++ b/lib/dijit/layout/LayoutContainer.js
@@ -1,28 +1,86 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.LayoutContainer"]=true;
+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,{baseClass:"dijitLayoutContainer",constructor:function(){
-dojo.deprecated("dijit.layout.LayoutContainer is deprecated","use BorderContainer instead",2);
-},layout:function(){
-dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());
-},addChild:function(_1,_2){
-this.inherited(arguments);
-if(this._started){
-dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());
-}
-},removeChild:function(_3){
-this.inherited(arguments);
-if(this._started){
-dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());
-}
-}});
-dojo.extend(dijit._Widget,{layoutAlign:"none"});
+
+
+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'
+});
+
}
diff --git a/lib/dijit/layout/LinkPane.js b/lib/dijit/layout/LinkPane.js
index 38e6567e7..34e2d92bb 100644
--- a/lib/dijit/layout/LinkPane.js
+++ b/lib/dijit/layout/LinkPane.js
@@ -1,20 +1,51 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.LinkPane"]=true;
+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],{templateString:"<div class=\"dijitLinkPane\" dojoAttachPoint=\"containerNode\"></div>",postMixInProperties:function(){
-if(this.srcNodeRef){
-this.title+=this.srcNodeRef.innerHTML;
-}
-this.inherited(arguments);
-},_fillContent:function(_1){
-}});
+
+
+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
+ }
+});
+
}
diff --git a/lib/dijit/layout/ScrollingTabController.js b/lib/dijit/layout/ScrollingTabController.js
index 4ee0bd16e..a91c526de 100644
--- a/lib/dijit/layout/ScrollingTabController.js
+++ b/lib/dijit/layout/ScrollingTabController.js
@@ -1,199 +1,483 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.ScrollingTabController"]=true;
+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.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._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\" iconClass=\"dijitTabStripMenuIcon\"\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 wairole='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"}),postCreate: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(_1,_2){
-this.inherited(arguments);
-var _3;
-if(this.useMenu){
-var _4=this.containerId;
-_3=new dijit.MenuItem({id:_1.id+"_stcMi",label:_1.title,dir:_1.dir,lang:_1.lang,onClick:dojo.hitch(this,function(){
-var _5=dijit.byId(_4);
-_5.selectChild(_1);
-})});
-this._menuChildren[_1.id]=_3;
-this._menu.addChild(_3,_2);
-}
-this.pane2handles[_1.id].push(this.connect(this.pane2button[_1.id],"set",function(_6,_7){
-if(this._postStartup){
-if(_6=="label"){
-if(_3){
-_3.set(_6,_7);
-}
-if(this._dim){
-this.resize(this._dim);
-}
-}
-}
-}));
-dojo.style(this.containerNode,"width",(dojo.style(this.containerNode,"width")+200)+"px");
-},onRemoveChild:function(_8,_9){
-var _a=this.pane2button[_8.id];
-if(this._selectedTab===_a.domNode){
-this._selectedTab=null;
-}
-if(this.useMenu&&_8&&_8.id&&this._menuChildren[_8.id]){
-this._menu.removeChild(this._menuChildren[_8.id]);
-this._menuChildren[_8.id].destroy();
-delete this._menuChildren[_8.id];
-}
-this.inherited(arguments);
-},_initButtons:function(){
-this._menuChildren={};
-this._btnWidth=0;
-this._buttons=dojo.query("> .tabStripButton",this.domNode).filter(function(_b){
-if((this.useMenu&&_b==this._menuBtn.domNode)||(this.useSlider&&(_b==this._rightBtn.domNode||_b==this._leftBtn.domNode))){
-this._btnWidth+=dojo.marginBox(_b).w;
-return true;
-}else{
-dojo.style(_b,"display","none");
-return false;
-}
-},this);
-if(this.useMenu){
-this._menu=new dijit.Menu({id:this.id+"_menu",dir:this.dir,lang:this.lang,targetNodeIds:[this._menuBtn.domNode],leftClickToOpen:true,refocus:false});
-this._supportingWidgets.push(this._menu);
-}
-},_getTabsWidth:function(){
-var _c=this.getChildren();
-if(_c.length){
-var _d=_c[this.isLeftToRight()?0:_c.length-1].domNode,_e=_c[this.isLeftToRight()?_c.length-1:0].domNode;
-return _e.offsetLeft+dojo.style(_e,"width")-_d.offsetLeft;
-}else{
-return 0;
-}
-},_enableBtn:function(_f){
-var _10=this._getTabsWidth();
-_f=_f||dojo.style(this.scrollNode,"width");
-return _10>0&&_f<_10;
-},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 _11=this._enableBtn(this._contentBox.w);
-this._buttons.style("display",_11?"":"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;
-},_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 _12=dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width");
-return (dojo.isIE==8?-1:1)*(val-_12);
-}
-},onSelectChild:function(_13){
-var tab=this.pane2button[_13.id];
-if(!tab||!_13){
-return;
-}
-var _14=tab.domNode;
-if(this._postResize&&_14!=this._selectedTab){
-this._selectedTab=_14;
-var sl=this._getScroll();
-if(sl>_14.offsetLeft||sl+dojo.style(this.scrollNode,"width")<_14.offsetLeft+dojo.style(_14,"width")){
-this.createSmoothScroll().play();
-}
-}
-this.inherited(arguments);
-},_getScrollBounds:function(){
-var _15=this.getChildren(),_16=dojo.style(this.scrollNode,"width"),_17=dojo.style(this.containerNode,"width"),_18=_17-_16,_19=this._getTabsWidth();
-if(_15.length&&_19>_16){
-return {min:this.isLeftToRight()?0:_15[_15.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_15[_15.length-1].domNode.offsetLeft+dojo.style(_15[_15.length-1].domNode,"width"))-_16:_18};
-}else{
-var _1a=this.isLeftToRight()?0:_18;
-return {min:_1a,max:_1a};
-}
-},_getScrollForSelectedTab:function(){
-var w=this.scrollNode,n=this._selectedTab,_1b=dojo.style(this.scrollNode,"width"),_1c=this._getScrollBounds();
-var pos=(n.offsetLeft+dojo.style(n,"width")/2)-_1b/2;
-pos=Math.min(Math.max(pos,_1c.min),_1c.max);
-return pos;
-},createSmoothScroll:function(x){
-if(arguments.length>0){
-var _1d=this._getScrollBounds();
-x=Math.min(Math.max(x,_1d.min),_1d.max);
-}else{
-x=this._getScrollForSelectedTab();
-}
-if(this._anim&&this._anim.status()=="playing"){
-this._anim.stop();
-}
-var _1e=this,w=this.scrollNode,_1f=new dojo._Animation({beforeBegin:function(){
-if(this.curve){
-delete this.curve;
-}
-var _20=w.scrollLeft,_21=_1e._convertToScrollLeft(x);
-_1f.curve=new dojo._Line(_20,_21);
-},onAnimate:function(val){
-w.scrollLeft=val;
-}});
-this._anim=_1f;
-this._setButtonClass(x);
-return _1f;
-},_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(_22,_23){
-if(_23&&dojo.hasClass(_23,"dijitTabDisabled")){
-return;
-}
-var _24=dojo.style(this.scrollNode,"width");
-var d=(_24*0.75)*_22;
-var to=this._getScroll()+d;
-this._setButtonClass(to);
-this.createSmoothScroll(to).play();
-},_setButtonClass:function(_25){
-var _26=this._getScrollBounds();
-this._leftBtn.set("disabled",_25<=_26.min);
-this._rightBtn.set("disabled",_25>=_26.max);
-}});
-dojo.declare("dijit.layout._ScrollingTabControllerButton",dijit.form.Button,{baseClass:"dijitTab tabStripButton",templateString:dojo.cache("dijit.layout","templates/_ScrollingTabControllerButton.html","<div dojoAttachEvent=\"onclick:_onButtonClick\">\n\t<div waiRole=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div waiRole=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img waiRole=\"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:"-1"});
+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;
+ }
+ }
+});
+
}
diff --git a/lib/dijit/layout/SplitContainer.js b/lib/dijit/layout/SplitContainer.js
index b0db3e465..cb18273e4 100644
--- a/lib/dijit/layout/SplitContainer.js
+++ b/lib/dijit/layout/SplitContainer.js
@@ -1,348 +1,589 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.SplitContainer"]=true;
+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");
-dojo.declare("dijit.layout.SplitContainer",dijit.layout._LayoutWidget,{constructor:function(){
-dojo.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(dojo.isMozilla){
-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 _1=dojo.doc.createElement("div");
-this.virtualSizer=_1;
-_1.style.position="relative";
-_1.style.zIndex=10;
-_1.className=this.isHorizontal?"dijitSplitContainerVirtualSizerH":"dijitSplitContainerVirtualSizerV";
-this.domNode.appendChild(_1);
-dojo.setSelectable(_1,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(_2,i,_3){
-this._setupChild(_2);
-if(i<_3.length-1){
-this._addSizer();
-}
-},this);
-if(this.persist){
-this._restoreState();
-}
-this.inherited(arguments);
-},_setupChild:function(_4){
-this.inherited(arguments);
-_4.domNode.style.position="absolute";
-dojo.addClass(_4.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(_5){
-_5=_5===undefined?this.sizers.length:_5;
-var _6=dojo.doc.createElement("div");
-_6.id=dijit.getUniqueId("dijit_layout_SplitterContainer_Splitter");
-this.sizers.splice(_5,0,_6);
-this.domNode.appendChild(_6);
-_6.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";
-var _7=dojo.doc.createElement("div");
-_7.className="thumb";
-_6.appendChild(_7);
-this.connect(_6,"onmousedown","_onSizerMouseDown");
-dojo.setSelectable(_6,false);
-},removeChild:function(_8){
-if(this.sizers.length){
-var i=dojo.indexOf(this.getChildren(),_8);
-if(i!=-1){
-if(i==this.sizers.length){
-i--;
-}
-dojo.destroy(this.sizers[i]);
-this.sizers.splice(i,1);
-}
-}
-this.inherited(arguments);
-if(this._started){
-this.layout();
-}
-},addChild:function(_9,_a){
-this.inherited(arguments);
-if(this._started){
-var _b=this.getChildren();
-if(_b.length>1){
-this._addSizer(_a);
-}
-this.layout();
-}
-},layout:function(){
-this.paneWidth=this._contentBox.w;
-this.paneHeight=this._contentBox.h;
-var _c=this.getChildren();
-if(!_c.length){
-return;
-}
-var _d=this.isHorizontal?this.paneWidth:this.paneHeight;
-if(_c.length>1){
-_d-=this.sizerWidth*(_c.length-1);
-}
-var _e=0;
-dojo.forEach(_c,function(_f){
-_e+=_f.sizeShare;
-});
-var _10=_d/_e;
-var _11=0;
-dojo.forEach(_c.slice(0,_c.length-1),function(_12){
-var _13=Math.round(_10*_12.sizeShare);
-_12.sizeActual=_13;
-_11+=_13;
-});
-_c[_c.length-1].sizeActual=_d-_11;
-this._checkSizes();
-var pos=0;
-var _14=_c[0].sizeActual;
-this._movePanel(_c[0],pos,_14);
-_c[0].position=pos;
-pos+=_14;
-if(!this.sizers){
-return;
-}
-dojo.some(_c.slice(1),function(_15,i){
-if(!this.sizers[i]){
-return true;
-}
-this._moveSlider(this.sizers[i],pos,this.sizerWidth);
-this.sizers[i].position=pos;
-pos+=this.sizerWidth;
-_14=_15.sizeActual;
-this._movePanel(_15,pos,_14);
-_15.position=pos;
-pos+=_14;
-},this);
-},_movePanel:function(_16,pos,_17){
-if(this.isHorizontal){
-_16.domNode.style.left=pos+"px";
-_16.domNode.style.top=0;
-var box={w:_17,h:this.paneHeight};
-if(_16.resize){
-_16.resize(box);
-}else{
-dojo.marginBox(_16.domNode,box);
-}
-}else{
-_16.domNode.style.left=0;
-_16.domNode.style.top=pos+"px";
-var box={w:this.paneWidth,h:_17};
-if(_16.resize){
-_16.resize(box);
-}else{
-dojo.marginBox(_16.domNode,box);
-}
-}
-},_moveSlider:function(_18,pos,_19){
-if(this.isHorizontal){
-_18.style.left=pos+"px";
-_18.style.top=0;
-dojo.marginBox(_18,{w:_19,h:this.paneHeight});
-}else{
-_18.style.left=0;
-_18.style.top=pos+"px";
-dojo.marginBox(_18,{w:this.paneWidth,h:_19});
-}
-},_growPane:function(_1a,_1b){
-if(_1a>0){
-if(_1b.sizeActual>_1b.sizeMin){
-if((_1b.sizeActual-_1b.sizeMin)>_1a){
-_1b.sizeActual=_1b.sizeActual-_1a;
-_1a=0;
-}else{
-_1a-=_1b.sizeActual-_1b.sizeMin;
-_1b.sizeActual=_1b.sizeMin;
-}
-}
-}
-return _1a;
-},_checkSizes:function(){
-var _1c=0;
-var _1d=0;
-var _1e=this.getChildren();
-dojo.forEach(_1e,function(_1f){
-_1d+=_1f.sizeActual;
-_1c+=_1f.sizeMin;
-});
-if(_1c<=_1d){
-var _20=0;
-dojo.forEach(_1e,function(_21){
-if(_21.sizeActual<_21.sizeMin){
-_20+=_21.sizeMin-_21.sizeActual;
-_21.sizeActual=_21.sizeMin;
-}
-});
-if(_20>0){
-var _22=this.isDraggingLeft?_1e.reverse():_1e;
-dojo.forEach(_22,function(_23){
-_20=this._growPane(_20,_23);
-},this);
-}
-}else{
-dojo.forEach(_1e,function(_24){
-_24.sizeActual=Math.round(_1d*(_24.sizeMin/_1c));
+
+
+//
+// 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);
+ }
});
-}
-},beginSizing:function(e,i){
-var _25=this.getChildren();
-this.paneBefore=_25[i];
-this.paneAfter=_25[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;
-this.originPos=dojo.position(_25[0].domNode,true);
-if(this.isHorizontal){
-var _26=e.layerX||e.offsetX||0;
-var _27=e.pageX;
-this.originPos=this.originPos.x;
-}else{
-var _26=e.layerY||e.offsetY||0;
-var _27=e.pageY;
-this.originPos=this.originPos.y;
-}
-this.startPoint=this.lastPoint=_27;
-this.screenToClientOffset=_27-_26;
-this.dragOffset=this.lastPoint-this.paneBefore.sizeActual-this.originPos-this.paneBefore.position;
-if(!this.activeSizing){
-this._showSizingLine();
-}
-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(){
-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 _28=this.paneBefore.position;
-var _29=this.paneAfter.position+this.paneAfter.sizeActual;
-this.paneBefore.sizeActual=pos-_28;
-this.paneAfter.position=pos+this.sizerWidth;
-this.paneAfter.sizeActual=_29-this.paneAfter.position;
-dojo.forEach(this.getChildren(),function(_2a){
-_2a.sizeShare=_2a.sizeActual;
+
+// 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
});
-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");
-},_getCookieName:function(i){
-return this.id+"_"+i;
-},_restoreState:function(){
-dojo.forEach(this.getChildren(),function(_2b,i){
-var _2c=this._getCookieName(i);
-var _2d=dojo.cookie(_2c);
-if(_2d){
-var pos=parseInt(_2d);
-if(typeof pos=="number"){
-_2b.sizeShare=pos;
-}
-}
-},this);
-},_saveState:function(){
-if(!this.persist){
-return;
-}
-dojo.forEach(this.getChildren(),function(_2e,i){
-dojo.cookie(this._getCookieName(i),_2e.sizeShare,{expires:365});
-},this);
-}});
-dojo.extend(dijit._Widget,{sizeMin:10,sizeShare:10});
+
}
diff --git a/lib/dijit/layout/StackContainer.js b/lib/dijit/layout/StackContainer.js
index 78a49021d..98af4c942 100644
--- a/lib/dijit/layout/StackContainer.js
+++ b/lib/dijit/layout/StackContainer.js
@@ -1,148 +1,336 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.StackContainer"]=true;
+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,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
+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.declare("dijit.layout.StackContainer",dijit.layout._LayoutWidget,{doLayout:true,persist:false,baseClass:"dijitStackContainer",postCreate:function(){
-this.inherited(arguments);
-dojo.addClass(this.domNode,"dijitLayoutContainer");
-dijit.setWaiRole(this.containerNode,"tabpanel");
-this.connect(this.domNode,"onkeypress",this._onKeyPress);
-},startup:function(){
-if(this._started){
-return;
-}
-var _1=this.getChildren();
-dojo.forEach(_1,this._setupChild,this);
-if(this.persist){
-this.selectedChildWidget=dijit.byId(dojo.cookie(this.id+"_selectedChild"));
-}else{
-dojo.some(_1,function(_2){
-if(_2.selected){
-this.selectedChildWidget=_2;
-}
-return _2.selected;
-},this);
-}
-var _3=this.selectedChildWidget;
-if(!_3&&_1[0]){
-_3=this.selectedChildWidget=_1[0];
-_3.selected=true;
-}
-dojo.publish(this.id+"-startup",[{children:_1,selected:_3}]);
-this.inherited(arguments);
-},resize:function(){
-var _4=this.selectedChildWidget;
-if(_4&&!this._hasBeenShown){
-this._hasBeenShown=true;
-this._showChild(_4);
-}
-this.inherited(arguments);
-},_setupChild:function(_5){
-this.inherited(arguments);
-dojo.removeClass(_5.domNode,"dijitVisible");
-dojo.addClass(_5.domNode,"dijitHidden");
-_5.domNode.title="";
-},addChild:function(_6,_7){
-this.inherited(arguments);
-if(this._started){
-dojo.publish(this.id+"-addChild",[_6,_7]);
-this.layout();
-if(!this.selectedChildWidget){
-this.selectChild(_6);
-}
-}
-},removeChild:function(_8){
-this.inherited(arguments);
-if(this._started){
-dojo.publish(this.id+"-removeChild",[_8]);
-}
-if(this._beingDestroyed){
-return;
-}
-if(this.selectedChildWidget===_8){
-this.selectedChildWidget=undefined;
-if(this._started){
-var _9=this.getChildren();
-if(_9.length){
-this.selectChild(_9[0]);
-}
-}
-}
-if(this._started){
-this.layout();
-}
-},selectChild:function(_a,_b){
-_a=dijit.byId(_a);
-if(this.selectedChildWidget!=_a){
-this._transition(_a,this.selectedChildWidget,_b);
-this.selectedChildWidget=_a;
-dojo.publish(this.id+"-selectChild",[_a]);
-if(this.persist){
-dojo.cookie(this.id+"_selectedChild",this.selectedChildWidget.id);
-}
-}
-},_transition:function(_c,_d){
-if(_d){
-this._hideChild(_d);
-}
-this._showChild(_c);
-if(_c.resize){
-if(this.doLayout){
-_c.resize(this._containerContentBox||this._contentBox);
-}else{
-_c.resize();
-}
-}
-},_adjacent:function(_e){
-var _f=this.getChildren();
-var _10=dojo.indexOf(_f,this.selectedChildWidget);
-_10+=_e?1:_f.length-1;
-return _f[_10%_f.length];
-},forward:function(){
-this.selectChild(this._adjacent(true),true);
-},back:function(){
-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(_11){
-var _12=this.getChildren();
-_11.isFirstChild=(_11==_12[0]);
-_11.isLastChild=(_11==_12[_12.length-1]);
-_11.selected=true;
-dojo.removeClass(_11.domNode,"dijitHidden");
-dojo.addClass(_11.domNode,"dijitVisible");
-_11._onShow();
-},_hideChild:function(_13){
-_13.selected=false;
-dojo.removeClass(_13.domNode,"dijitVisible");
-dojo.addClass(_13.domNode,"dijitHidden");
-_13.onHide();
-},closeChild:function(_14){
-var _15=_14.onClose(this,_14);
-if(_15){
-this.removeChild(_14);
-_14.destroyRecursive();
-}
-},destroyDescendants:function(_16){
-dojo.forEach(this.getChildren(),function(_17){
-this.removeChild(_17);
-_17.destroyRecursive(_16);
-},this);
-}});
dojo.require("dijit.layout.StackController");
-dojo.extend(dijit._Widget,{selected:false,closable:false,iconClass:"",showTitle:true});
+
+
+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
+});
+
}
diff --git a/lib/dijit/layout/StackController.js b/lib/dijit/layout/StackController.js
index 033dadf6f..e0d2075bb 100644
--- a/lib/dijit/layout/StackController.js
+++ b/lib/dijit/layout/StackController.js
@@ -1,174 +1,334 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.StackController"]=true;
+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,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],{templateString:"<span wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",containerId:"",buttonWidget:"dijit.layout._StackButton",postCreate:function(){
-dijit.setWaiRole(this.domNode,"tablist");
-this.pane2button={};
-this.pane2handles={};
-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(_1){
-dojo.forEach(_1.children,this.onAddChild,this);
-if(_1.selected){
-this.onSelectChild(_1.selected);
-}
-},destroy:function(){
-for(var _2 in this.pane2button){
-this.onRemoveChild(dijit.byId(_2));
-}
-this.inherited(arguments);
-},onAddChild:function(_3,_4){
-var _5=dojo.getObject(this.buttonWidget);
-var _6=new _5({id:this.id+"_"+_3.id,label:_3.title,dir:_3.dir,lang:_3.lang,showLabel:_3.showTitle,iconClass:_3.iconClass,closeButton:_3.closable,title:_3.tooltip});
-dijit.setWaiState(_6.focusNode,"selected","false");
-this.pane2handles[_3.id]=[this.connect(_3,"set",function(_7,_8){
-var _9={title:"label",showTitle:"showLabel",iconClass:"iconClass",closable:"closeButton",tooltip:"title"}[_7];
-if(_9){
-_6.set(_9,_8);
-}
-}),this.connect(_6,"onClick",dojo.hitch(this,"onButtonClick",_3)),this.connect(_6,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",_3))];
-this.addChild(_6,_4);
-this.pane2button[_3.id]=_6;
-_3.controlButton=_6;
-if(!this._currentChild){
-_6.focusNode.setAttribute("tabIndex","0");
-dijit.setWaiState(_6.focusNode,"selected","true");
-this._currentChild=_3;
-}
-if(!this.isLeftToRight()&&dojo.isIE&&this._rectifyRtlTabList){
-this._rectifyRtlTabList();
-}
-},onRemoveChild:function(_a){
-if(this._currentChild===_a){
-this._currentChild=null;
-}
-dojo.forEach(this.pane2handles[_a.id],this.disconnect,this);
-delete this.pane2handles[_a.id];
-var _b=this.pane2button[_a.id];
-if(_b){
-this.removeChild(_b);
-delete this.pane2button[_a.id];
-_b.destroy();
-}
-delete _a.controlButton;
-},onSelectChild:function(_c){
-if(!_c){
-return;
-}
-if(this._currentChild){
-var _d=this.pane2button[this._currentChild.id];
-_d.set("checked",false);
-dijit.setWaiState(_d.focusNode,"selected","false");
-_d.focusNode.setAttribute("tabIndex","-1");
-}
-var _e=this.pane2button[_c.id];
-_e.set("checked",true);
-dijit.setWaiState(_e.focusNode,"selected","true");
-this._currentChild=_c;
-_e.focusNode.setAttribute("tabIndex","0");
-var _f=dijit.byId(this.containerId);
-dijit.setWaiState(_f.containerNode,"labelledby",_e.id);
-},onButtonClick:function(_10){
-var _11=dijit.byId(this.containerId);
-_11.selectChild(_10);
-},onCloseButtonClick:function(_12){
-var _13=dijit.byId(this.containerId);
-_13.closeChild(_12);
-if(this._currentChild){
-var b=this.pane2button[this._currentChild.id];
-if(b){
-dijit.focus(b.focusNode||b.domNode);
-}
-}
-},adjacent:function(_14){
-if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){
-_14=!_14;
-}
-var _15=this.getChildren();
-var _16=dojo.indexOf(_15,this.pane2button[this._currentChild.id]);
-var _17=_14?1:_15.length-1;
-return _15[(_16+_17)%_15.length];
-},onkeypress:function(e){
-if(this.disabled||e.altKey){
-return;
-}
-var _18=null;
-if(e.ctrlKey||!e._djpage){
-var k=dojo.keys;
-switch(e.charOrCode){
-case k.LEFT_ARROW:
-case k.UP_ARROW:
-if(!e._djpage){
-_18=false;
-}
-break;
-case k.PAGE_UP:
-if(e.ctrlKey){
-_18=false;
-}
-break;
-case k.RIGHT_ARROW:
-case k.DOWN_ARROW:
-if(!e._djpage){
-_18=true;
-}
-break;
-case k.PAGE_DOWN:
-if(e.ctrlKey){
-_18=true;
-}
-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(_18!==null){
-this.adjacent(_18).onClick();
-dojo.stopEvent(e);
-}
-}
-},onContainerKeyPress:function(_19){
-_19.e._djpage=_19.page;
-this.onkeypress(_19.e);
-}});
-dojo.declare("dijit.layout._StackButton",dijit.form.ToggleButton,{tabIndex:"-1",postCreate:function(evt){
-dijit.setWaiRole((this.focusNode||this.domNode),"tab");
-this.inherited(arguments);
-},onClick:function(evt){
-dijit.focus(this.focusNode);
-},onClickCloseButton:function(evt){
-evt.stopPropagation();
-}});
+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();
+ }
+ });
+
}
diff --git a/lib/dijit/layout/TabContainer.js b/lib/dijit/layout/TabContainer.js
index d765cf7e4..009422464 100644
--- a/lib/dijit/layout/TabContainer.js
+++ b/lib/dijit/layout/TabContainer.js
@@ -1,23 +1,76 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.TabContainer"]=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");
dojo.require("dijit.layout._TabContainerBase");
dojo.require("dijit.layout.TabController");
dojo.require("dijit.layout.ScrollingTabController");
-dojo.declare("dijit.layout.TabContainer",dijit.layout._TabContainerBase,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_1){
-var _2=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_3=dojo.getObject(this.controllerWidget);
-return new _3({id:this.id+"_tablist",dir:this.dir,lang:this.lang,tabPosition:this.tabPosition,doLayout:this.doLayout,containerId:this.id,"class":_2,nested:this.nested,useMenu:this.useMenu,useSlider:this.useSlider,tabStripClass:this.tabStrip?this.baseClass+(this.tabStrip?"":"No")+"Strip":null},_1);
-},postMixInProperties:function(){
-this.inherited(arguments);
-if(!this.controllerWidget){
-this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?"dijit.layout.ScrollingTabController":"dijit.layout.TabController";
-}
-}});
+
+
+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";
+ }
+ }
+});
+
}
diff --git a/lib/dijit/layout/TabController.js b/lib/dijit/layout/TabController.js
index edb3930c5..0a2276aca 100644
--- a/lib/dijit/layout/TabController.js
+++ b/lib/dijit/layout/TabController.js
@@ -1,77 +1,161 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout.TabController"]=true;
+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,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.layout.TabController",dijit.layout.StackController,{templateString:"<div wairole='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 _1=0;
-for(var _2 in this.pane2button){
-var ow=this.pane2button[_2].innerDiv.scrollWidth;
-_1=Math.max(_1,ow);
-}
-for(_2 in this.pane2button){
-this.pane2button[_2].innerDiv.style.width=_1+"px";
-}
-}});
-dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",cssStateNodes:{closeNode:"dijitTabCloseButton"},templateString:dojo.cache("dijit.layout","templates/_TabButton.html","<div waiRole=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick'>\n <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n \t<div waiRole=\"presentation\" dojoAttachPoint='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" 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' waiRole=\"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,postMixInProperties:function(){
-if(!this.iconClass){
-this.iconClass="dijitTabButtonIcon";
-}
-},postCreate:function(){
-this.inherited(arguments);
-dojo.setSelectable(this.containerNode,false);
-if(this.iconNode.className=="dijitTabButtonIcon"){
-dojo.style(this.iconNode,"width","1px");
-}
-},startup:function(){
-this.inherited(arguments);
-var n=this.domNode;
-setTimeout(function(){
-n.className=n.className;
-},1);
-},_setCloseButtonAttr:function(_3){
-this.closeButton=_3;
-dojo.toggleClass(this.innerDiv,"dijitClosable",_3);
-this.closeNode.style.display=_3?"":"none";
-if(_3){
-var _4=dojo.i18n.getLocalization("dijit","common");
-if(this.closeNode){
-dojo.attr(this.closeNode,"title",_4.itemClose);
-}
-var _4=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:_4.itemClose,dir:this.dir,lang:this.lang,onClick:dojo.hitch(this,"onClickCloseButton")}));
-}else{
-if(this._closeMenu){
-this._closeMenu.destroyRecursive();
-delete this._closeMenu;
-}
-}
-},_setLabelAttr:function(_5){
-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);
-}});
+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);
+ }
+});
+
}
diff --git a/lib/dijit/layout/_ContentPaneResizeMixin.js b/lib/dijit/layout/_ContentPaneResizeMixin.js
new file mode 100644
index 000000000..fe361bee5
--- /dev/null
+++ b/lib/dijit/layout/_ContentPaneResizeMixin.js
@@ -0,0 +1,260 @@
+/*
+ Copyright (c) 2004-2011, The 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;
+ }
+});
+
+}
diff --git a/lib/dijit/layout/_LayoutWidget.js b/lib/dijit/layout/_LayoutWidget.js
index ec7be37b7..cbbf71009 100644
--- a/lib/dijit/layout/_LayoutWidget.js
+++ b/lib/dijit/layout/_LayoutWidget.js
@@ -1,126 +1,313 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout._LayoutWidget"]=true;
+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],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,postCreate:function(){
-dojo.addClass(this.domNode,"dijitContainer");
-this.inherited(arguments);
-},startup:function(){
-if(this._started){
-return;
-}
-this.inherited(arguments);
-var _1=this.getParent&&this.getParent();
-if(!(_1&&_1.isLayoutContainer)){
-this.resize();
-this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){
-this.resize();
-});
-}
-},resize:function(_2,_3){
-var _4=this.domNode;
-if(_2){
-dojo.marginBox(_4,_2);
-if(_2.t){
-_4.style.top=_2.t+"px";
-}
-if(_2.l){
-_4.style.left=_2.l+"px";
-}
-}
-var mb=_3||{};
-dojo.mixin(mb,_2||{});
-if(!("h" in mb)||!("w" in mb)){
-mb=dojo.mixin(dojo.marginBox(_4),mb);
-}
-var cs=dojo.getComputedStyle(_4);
-var me=dojo._getMarginExtents(_4,cs);
-var be=dojo._getBorderExtents(_4,cs);
-var bb=(this._borderBox={w:mb.w-(me.w+be.w),h:mb.h-(me.h+be.h)});
-var pe=dojo._getPadExtents(_4,cs);
-this._contentBox={l:dojo._toPixelValue(_4,cs.paddingLeft),t:dojo._toPixelValue(_4,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};
-this.layout();
-},layout:function(){
-},_setupChild:function(_5){
-dojo.addClass(_5.domNode,this.baseClass+"-child");
-if(_5.baseClass){
-dojo.addClass(_5.domNode,this.baseClass+"-"+_5.baseClass);
-}
-},addChild:function(_6,_7){
-this.inherited(arguments);
-if(this._started){
-this._setupChild(_6);
-}
-},removeChild:function(_8){
-dojo.removeClass(_8.domNode,this.baseClass+"-child");
-if(_8.baseClass){
-dojo.removeClass(_8.domNode,this.baseClass+"-"+_8.baseClass);
-}
-this.inherited(arguments);
-}});
-dijit.layout.marginBox2contentBox=function(_9,mb){
-var cs=dojo.getComputedStyle(_9);
-var me=dojo._getMarginExtents(_9,cs);
-var pb=dojo._getPadBorderExtents(_9,cs);
-return {l:dojo._toPixelValue(_9,cs.paddingLeft),t:dojo._toPixelValue(_9,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};
+
+
+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 _a=function(_b){
-return _b.substring(0,1).toUpperCase()+_b.substring(1);
-};
-var _c=function(_d,_e){
-_d.resize?_d.resize(_e):dojo.marginBox(_d.domNode,_e);
-dojo.mixin(_d,dojo.marginBox(_d.domNode));
-dojo.mixin(_d,_e);
-};
-dijit.layout.layoutChildren=function(_f,dim,_10){
-dim=dojo.mixin({},dim);
-dojo.addClass(_f,"dijitLayoutContainer");
-_10=dojo.filter(_10,function(_11){
-return _11.layoutAlign!="client";
-}).concat(dojo.filter(_10,function(_12){
-return _12.layoutAlign=="client";
-}));
-dojo.forEach(_10,function(_13){
-var elm=_13.domNode,pos=_13.layoutAlign;
-var _14=elm.style;
-_14.left=dim.l+"px";
-_14.top=dim.t+"px";
-_14.bottom=_14.right="auto";
-dojo.addClass(elm,"dijitAlign"+_a(pos));
-if(pos=="top"||pos=="bottom"){
-_c(_13,{w:dim.w});
-dim.h-=_13.h;
-if(pos=="top"){
-dim.t+=_13.h;
-}else{
-_14.top=dim.t+dim.h+"px";
-}
-}else{
-if(pos=="left"||pos=="right"){
-_c(_13,{h:dim.h});
-dim.w-=_13.w;
-if(pos=="left"){
-dim.l+=_13.w;
-}else{
-_14.left=dim.l+dim.w+"px";
-}
-}else{
-if(pos=="client"){
-_c(_13,dim);
-}
-}
-}
-});
-};
+ 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);
+ }
+ });
+ };
+
})();
+
}
diff --git a/lib/dijit/layout/_TabContainerBase.js b/lib/dijit/layout/_TabContainerBase.js
index 0ba42ec35..5e07cb653 100644
--- a/lib/dijit/layout/_TabContainerBase.js
+++ b/lib/dijit/layout/_TabContainerBase.js
@@ -1,68 +1,145 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.layout._TabContainerBase"]=true;
+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],{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);
-},postCreate: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(_1){
-dojo.addClass(_1.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 _2=this.tabPosition.replace(/-h/,"");
-this.tablist.layoutAlign=_2;
-var _3=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_2},{domNode:this.containerNode,layoutAlign:"client"}];
-dijit.layout.layoutChildren(this.domNode,this._contentBox,_3);
-this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_3[2]);
-if(sc&&sc.resize){
-sc.resize(this._containerContentBox);
-}
-}else{
-if(this.tablist.resize){
-this.tablist.resize({w:dojo.contentBox(this.domNode).w});
-}
-if(sc&&sc.resize){
-sc.resize();
-}
-}
-},destroy:function(){
-if(this.tablist){
-this.tablist.destroy();
-}
-this.inherited(arguments);
-}});
+
+
+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);
+ }
+});
+
}
diff --git a/lib/dijit/lib/main.js b/lib/dijit/lib/main.js
new file mode 100644
index 000000000..28f1164e9
--- /dev/null
+++ b/lib/dijit/lib/main.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2004-2011, The 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/nls/dijit-all_ROOT.js b/lib/dijit/nls/dijit-all_ROOT.js
deleted file mode 100644
index 43cfcad7e..000000000
--- a/lib/dijit/nls/dijit-all_ROOT.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.ROOT");dijit._editor.nls.commands.ROOT={"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"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.ROOT");dijit._editor.nls.FontChoice.ROOT={"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"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.ROOT");dijit._editor.nls.LinkDialog.ROOT={"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:"};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:]","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"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ROOT");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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ROOT");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"};
diff --git a/lib/dijit/nls/dijit-all_ar.js b/lib/dijit/nls/dijit-all_ar.js
deleted file mode 100644
index 2c32d8113..000000000
--- a/lib/dijit/nls/dijit-all_ar.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.ar");dijit._editor.nls.commands.ar={"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":"ازاحة للداخل باستخدام Tab","justifyRight":"محاذاة الى اليمين","appleKey":"⌘${0}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.ar");dijit._editor.nls.FontChoice.ar={"1":"صغير جدا جدا","2":"صغير جدا","formatBlock":"النسق","3":"صغير","4":"متوسط","5":"كبير","6":"كبير جدا","7":"كبير جدا جدا","fantasy":"خيالي","serif":"serif","p":"فقرة","pre":"منسق بصفة مسبقة","sans-serif":"sans-serif","fontName":"طاقم طباعة","h1":"عنوان","h2":"عنوان فرعي","h3":"فرعي-عنوان فرعي","monospace":"أحادي المسافة","fontSize":"الحجم","cursive":"كتابة بحروف متصلة","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.ar");dijit._editor.nls.LinkDialog.ar={"text":"الوصف:","insertImageTitle":"خصائص الصورة","set":"تحديد","newWindow":"نافذة جديدة","topWindow":"النافذة العلوية","target":"الهدف: ","createLinkTitle":"خصائص الوصلة","parentWindow":"النافذة الرئيسية","currentWindow":"النافذة الحالية","url":"عنوان URL:"};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":"∞","patternDigit":"#","minusSign":"-","decimal":"٫","nan":"ليس رقم","nativeZeroDigit":"٠","perMille":"؉","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ar");dojo.cldr.nls.currency.ar={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ar");dojo.cldr.nls.gregorian.ar={"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-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"};
diff --git a/lib/dijit/nls/dijit-all_ca.js b/lib/dijit/nls/dijit-all_ca.js
deleted file mode 100644
index 48456f7e7..000000000
--- a/lib/dijit/nls/dijit-all_ca.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.ca");dijit._editor.nls.commands.ca={"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":"Regle 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 la 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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.ca");dijit._editor.nls.FontChoice.ca={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.ca");dijit._editor.nls.LinkDialog.ca={"text":"Descipció:","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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ca");dojo.cldr.nls.currency.ca={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ca");dojo.cldr.nls.gregorian.ca={"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}"};
diff --git a/lib/dijit/nls/dijit-all_cs.js b/lib/dijit/nls/dijit-all_cs.js
deleted file mode 100644
index db73adbcf..000000000
--- a/lib/dijit/nls/dijit-all_cs.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.cs");dijit._editor.nls.commands.cs={"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 režim celé obrazovky","italic":"Kurzíva","fontName":"Název písma","justifyLeft":"Zarovnat vlevo","unlink":"Odebrat odkaz","toggleTableBorder":"Přepnout ohraničení tabulky","viewSource":"Zobrazit zdroj ve formátu 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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.cs");dijit._editor.nls.FontChoice.cs={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.cs");dijit._editor.nls.LinkDialog.cs={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.cs");dojo.cldr.nls.currency.cs={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.cs");dojo.cldr.nls.gregorian.cs={"dayPeriods-format-wide-pm":"odp.","eraNames":["př.Kr.","po Kr."],"field-day-relative+-1":"Včera","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","months-standAlone-abbr":["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],"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ří","dateFormat-long":"d. MMMM y","timeFormat-medium":"H:mm:ss","dateFormatItem-Hm":"H:mm","dateFormat-medium":"d.M.yyyy","dateFormatItem-Hms":"H:mm:ss","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"],"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"],"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","dateFormat-full":"EEEE, d. MMMM y","months-format-wide":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"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","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-era":"Era","dateFormatItem-yM":"y-M","field-year":"Year","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-M":"L","field-minute":"Minute","field-dayperiod":"Dayperiod","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}","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","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","field-week":"Week","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"};
diff --git a/lib/dijit/nls/dijit-all_da.js b/lib/dijit/nls/dijit-all_da.js
deleted file mode 100644
index a87e64a46..000000000
--- a/lib/dijit/nls/dijit-all_da.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.da");dijit._editor.nls.commands.da={"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","ctrlKey":"Ctrl+${0}","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}"};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 ugyldig.","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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.da");dijit._editor.nls.FontChoice.da={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.da");dijit._editor.nls.LinkDialog.da={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.da");dojo.cldr.nls.currency.da={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.da");dojo.cldr.nls.gregorian.da={"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","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}"};
diff --git a/lib/dijit/nls/dijit-all_de-de.js b/lib/dijit/nls/dijit-all_de-de.js
deleted file mode 100644
index 7af3dd8c8..000000000
--- a/lib/dijit/nls/dijit-all_de-de.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.de_de");dijit._editor.nls.commands.de_de={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.de_de");dijit._editor.nls.FontChoice.de_de={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.de_de");dijit._editor.nls.LinkDialog.de_de={"text":"Beschreibung:","insertImageTitle":"Grafikeigenschaften","set":"Festlegen","newWindow":"Neues Fenster","topWindow":"Aktives Fenster","target":"Ziel:","createLinkTitle":"Linkeigenschaften","parentWindow":"Übergeordnetes Fenster","currentWindow":"Aktuelles Fenster","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.de_de");dojo.cldr.nls.currency.de_de={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.de_de");dojo.cldr.nls.gregorian.de_de={"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","dateFormatItem-EEEd":"d. EEE","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","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}","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"};
diff --git a/lib/dijit/nls/dijit-all_de.js b/lib/dijit/nls/dijit-all_de.js
deleted file mode 100644
index 196dbf358..000000000
--- a/lib/dijit/nls/dijit-all_de.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.de");dijit._editor.nls.commands.de={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.de");dijit._editor.nls.FontChoice.de={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.de");dijit._editor.nls.LinkDialog.de={"text":"Beschreibung:","insertImageTitle":"Grafikeigenschaften","set":"Festlegen","newWindow":"Neues Fenster","topWindow":"Aktives Fenster","target":"Ziel:","createLinkTitle":"Linkeigenschaften","parentWindow":"Übergeordnetes Fenster","currentWindow":"Aktuelles Fenster","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.de");dojo.cldr.nls.currency.de={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.de");dojo.cldr.nls.gregorian.de={"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","dateFormatItem-EEEd":"d. EEE","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","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}","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"};
diff --git a/lib/dijit/nls/dijit-all_el.js b/lib/dijit/nls/dijit-all_el.js
deleted file mode 100644
index a9f2945bf..000000000
--- a/lib/dijit/nls/dijit-all_el.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.el");dijit._editor.nls.commands.el={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.el");dijit._editor.nls.FontChoice.el={"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":"πλάγιοι","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.el");dijit._editor.nls.LinkDialog.el={"text":"Περιγραφή:","insertImageTitle":"Ιδιότητες εικόνας","set":"Ορισμός","newWindow":"Νέο παράθυρο","topWindow":"Παράθυρο σε πρώτο πλάνο","target":"Προορισμός:","createLinkTitle":"Ιδιότητες σύνδεσης","parentWindow":"Γονικό παράθυρο","currentWindow":"Τρέχον παράθυρο","url":"Διεύθυνση URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","decimalFormat":"#,##0.###","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.el");dojo.cldr.nls.currency.el={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.el");dojo.cldr.nls.gregorian.el={"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":"MMM y","dateFormatItem-yQ":"y Q","dateFormatItem-yyyyMMMM":"MMMM 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":"MMM 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","dateFormatItem-yMMMM":"LLLL y","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"};
diff --git a/lib/dijit/nls/dijit-all_en-gb.js b/lib/dijit/nls/dijit-all_en-gb.js
deleted file mode 100644
index a66fb43e5..000000000
--- a/lib/dijit/nls/dijit-all_en-gb.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.en_gb");dijit._editor.nls.commands.en_gb={"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"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.en_gb");dijit._editor.nls.FontChoice.en_gb={"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"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.en_gb");dijit._editor.nls.LinkDialog.en_gb={"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:"};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":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.en_gb");dojo.cldr.nls.currency.en_gb={"HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.en_gb");dojo.cldr.nls.gregorian.en_gb={"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"};
diff --git a/lib/dijit/nls/dijit-all_en-us.js b/lib/dijit/nls/dijit-all_en-us.js
deleted file mode 100644
index 2c6e1b0cb..000000000
--- a/lib/dijit/nls/dijit-all_en-us.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.en_us");dijit._editor.nls.commands.en_us={"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"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.en_us");dijit._editor.nls.FontChoice.en_us={"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"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.en_us");dijit._editor.nls.LinkDialog.en_us={"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:"};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":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.en_us");dojo.cldr.nls.currency.en_us={"HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.en_us");dojo.cldr.nls.gregorian.en_us={"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"};
diff --git a/lib/dijit/nls/dijit-all_en.js b/lib/dijit/nls/dijit-all_en.js
deleted file mode 100644
index 0ae531fbc..000000000
--- a/lib/dijit/nls/dijit-all_en.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.en");dijit._editor.nls.commands.en={"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"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.en");dijit._editor.nls.FontChoice.en={"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"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.en");dijit._editor.nls.LinkDialog.en={"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:"};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":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.en");dojo.cldr.nls.currency.en={"HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.en");dojo.cldr.nls.gregorian.en={"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"};
diff --git a/lib/dijit/nls/dijit-all_es-es.js b/lib/dijit/nls/dijit-all_es-es.js
deleted file mode 100644
index a647048cf..000000000
--- a/lib/dijit/nls/dijit-all_es-es.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.es_es");dijit._editor.nls.commands.es_es={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.es_es");dijit._editor.nls.FontChoice.es_es={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.es_es");dijit._editor.nls.LinkDialog.es_es={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.es_es");dojo.cldr.nls.currency.es_es={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.es_es");dojo.cldr.nls.gregorian.es_es={"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}"};
diff --git a/lib/dijit/nls/dijit-all_es.js b/lib/dijit/nls/dijit-all_es.js
deleted file mode 100644
index 616b3b0a6..000000000
--- a/lib/dijit/nls/dijit-all_es.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.es");dijit._editor.nls.commands.es={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.es");dijit._editor.nls.FontChoice.es={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.es");dijit._editor.nls.LinkDialog.es={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.es");dojo.cldr.nls.currency.es={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.es");dojo.cldr.nls.gregorian.es={"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}"};
diff --git a/lib/dijit/nls/dijit-all_fi-fi.js b/lib/dijit/nls/dijit-all_fi-fi.js
deleted file mode 100644
index d257fb43c..000000000
--- a/lib/dijit/nls/dijit-all_fi-fi.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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":"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.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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.fi_fi");dijit._editor.nls.commands.fi_fi={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.fi_fi");dijit._editor.nls.FontChoice.fi_fi={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.fi_fi");dijit._editor.nls.LinkDialog.fi_fi={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.fi_fi");dojo.cldr.nls.currency.fi_fi={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.fi_fi");dojo.cldr.nls.gregorian.fi_fi={"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"],"dateFormatItem-EEEd":"EEE d.","dayPeriods-format-wide-pm":"ip.","dateFormat-full":"EEEE 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","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}","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}"};
diff --git a/lib/dijit/nls/dijit-all_fi.js b/lib/dijit/nls/dijit-all_fi.js
deleted file mode 100644
index 95a4f216e..000000000
--- a/lib/dijit/nls/dijit-all_fi.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_fi");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fi");dojo.nls.colors.fi={"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.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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.fi");dijit._editor.nls.commands.fi={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.fi");dijit._editor.nls.FontChoice.fi={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.fi");dijit._editor.nls.LinkDialog.fi={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.fi");dojo.cldr.nls.currency.fi={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.fi");dojo.cldr.nls.gregorian.fi={"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"],"dateFormatItem-EEEd":"EEE d.","dayPeriods-format-wide-pm":"ip.","dateFormat-full":"EEEE 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","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}","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}"};
diff --git a/lib/dijit/nls/dijit-all_fr-fr.js b/lib/dijit/nls/dijit-all_fr-fr.js
deleted file mode 100644
index 8055fbf89..000000000
--- a/lib/dijit/nls/dijit-all_fr-fr.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.fr_fr");dijit._editor.nls.commands.fr_fr={"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 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 vers le mode 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":"Action \"${0}\" uniquement disponible dans votre navigateur via un raccourci clavier. Utilisez ${1}.","indent":"Retrait","redo":"Rétablir","strikethrough":"Barrer","justifyFull":"Justifier","justifyCenter":"Aligner au centre","hiliteColor":"Couleur 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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.fr_fr");dijit._editor.nls.FontChoice.fr_fr={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.fr_fr");dijit._editor.nls.LinkDialog.fr_fr={"text":"Description :","insertImageTitle":"Propriétés des images","set":"Définir","newWindow":"Nouvelle fenêtre","topWindow":"Première fenêtre","target":"Cible :","createLinkTitle":"Propriétés des liens","parentWindow":"Fenêtre parent","currentWindow":"Fenêtre en cours","url":"URL :"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.fr_fr");dojo.cldr.nls.currency.fr_fr={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.fr_fr");dojo.cldr.nls.gregorian.fr_fr={"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"],"dateFormatItem-EEEd":"d EEE","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","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}","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"};
diff --git a/lib/dijit/nls/dijit-all_fr.js b/lib/dijit/nls/dijit-all_fr.js
deleted file mode 100644
index 75b8e3fa9..000000000
--- a/lib/dijit/nls/dijit-all_fr.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.fr");dijit._editor.nls.commands.fr={"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 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 vers le mode 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":"Action \"${0}\" uniquement disponible dans votre navigateur via un raccourci clavier. Utilisez ${1}.","indent":"Retrait","redo":"Rétablir","strikethrough":"Barrer","justifyFull":"Justifier","justifyCenter":"Aligner au centre","hiliteColor":"Couleur 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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.fr");dijit._editor.nls.FontChoice.fr={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.fr");dijit._editor.nls.LinkDialog.fr={"text":"Description :","insertImageTitle":"Propriétés des images","set":"Définir","newWindow":"Nouvelle fenêtre","topWindow":"Première fenêtre","target":"Cible :","createLinkTitle":"Propriétés des liens","parentWindow":"Fenêtre parent","currentWindow":"Fenêtre en cours","url":"URL :"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.fr");dojo.cldr.nls.currency.fr={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.fr");dojo.cldr.nls.gregorian.fr={"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"],"dateFormatItem-EEEd":"d EEE","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","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}","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"};
diff --git a/lib/dijit/nls/dijit-all_he-il.js b/lib/dijit/nls/dijit-all_he-il.js
deleted file mode 100644
index b40fa1b5f..000000000
--- a/lib/dijit/nls/dijit-all_he-il.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.he_il");dijit._editor.nls.commands.he_il={"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":"יישור לימין"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.he_il");dijit._editor.nls.FontChoice.he_il={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.he_il");dijit._editor.nls.LinkDialog.he_il={"text":"תיאור:","insertImageTitle":"תכונות תמונה","set":"הגדרה","newWindow":"חלון חדש","topWindow":"חלון עליון ","target":"יעד:","createLinkTitle":"תכונות קישור","parentWindow":"חלון אב","currentWindow":"חלון נוכחי ","url":"URL:‏"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.he_il");dojo.cldr.nls.currency.he_il={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.he_il");dojo.cldr.nls.gregorian.he_il={"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}"};
diff --git a/lib/dijit/nls/dijit-all_he.js b/lib/dijit/nls/dijit-all_he.js
deleted file mode 100644
index fb88b3d90..000000000
--- a/lib/dijit/nls/dijit-all_he.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.he");dijit._editor.nls.commands.he={"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":"יישור לימין"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.he");dijit._editor.nls.FontChoice.he={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.he");dijit._editor.nls.LinkDialog.he={"text":"תיאור:","insertImageTitle":"תכונות תמונה","set":"הגדרה","newWindow":"חלון חדש","topWindow":"חלון עליון ","target":"יעד:","createLinkTitle":"תכונות קישור","parentWindow":"חלון אב","currentWindow":"חלון נוכחי ","url":"URL:‏"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.he");dojo.cldr.nls.currency.he={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.he");dojo.cldr.nls.gregorian.he={"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}"};
diff --git a/lib/dijit/nls/dijit-all_hu.js b/lib/dijit/nls/dijit-all_hu.js
deleted file mode 100644
index 104c387e8..000000000
--- a/lib/dijit/nls/dijit-all_hu.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.hu");dijit._editor.nls.commands.hu={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.hu");dijit._editor.nls.FontChoice.hu={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.hu");dijit._editor.nls.LinkDialog.hu={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.hu");dojo.cldr.nls.currency.hu={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.hu");dojo.cldr.nls.gregorian.hu={"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"],"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."],"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.","dateFormat-full":"y. MMMM d., EEEE","dateFormatItem-Md":"M. d.","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","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","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})","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"};
diff --git a/lib/dijit/nls/dijit-all_it-it.js b/lib/dijit/nls/dijit-all_it-it.js
deleted file mode 100644
index 7d5b8002c..000000000
--- a/lib/dijit/nls/dijit-all_it-it.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.it_it");dijit._editor.nls.commands.it_it={"removeFormat":"Rimuovi formato","copy":"Copia","paste":"Incolla","selectAll":"Seleziona tutto","insertOrderedList":"Elenco numerato","insertTable":"Inserisci/Modifica tabella","print":"Stampa","underline":"Sottolinea","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":"Attiva/Disattiva bordo tabella","viewSource":"Visualizza origine HTML","fontSize":"Dimensione carattere","systemShortcut":"La azione \"${0}\" è disponibile solo nel browser tramite un tasto di scelta rapida. Utilizzare ${1}.","indent":"Rientro","redo":"Ripristina","strikethrough":"Barrato","justifyFull":"Giustifica","justifyCenter":"Allinea al centro","hiliteColor":"Colore sfondo","deleteTable":"Elimina tabella","outdent":"Annulla rientro","cut":"Taglia","plainFormatBlock":"Stile paragrafo","toggleDir":"Attiva/Disattiva direzione","bold":"Grassetto","tabIndent":"Rientro tabulazione","justifyRight":"Allinea a destra","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.it_it");dijit._editor.nls.FontChoice.it_it={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.it_it");dijit._editor.nls.LinkDialog.it_it={"text":"Descrizione:","insertImageTitle":"Proprietà immagine","set":"Imposta","newWindow":"Nuova finestra","topWindow":"Finestra superiore","target":"Destinazione:","createLinkTitle":"Proprietà collegamento","parentWindow":"Finestra padre","currentWindow":"Finestra corrente","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.it_it");dojo.cldr.nls.currency.it_it={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.it_it");dojo.cldr.nls.gregorian.it_it={"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","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}"};
diff --git a/lib/dijit/nls/dijit-all_it.js b/lib/dijit/nls/dijit-all_it.js
deleted file mode 100644
index a71d9a5e7..000000000
--- a/lib/dijit/nls/dijit-all_it.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.it");dijit._editor.nls.commands.it={"removeFormat":"Rimuovi formato","copy":"Copia","paste":"Incolla","selectAll":"Seleziona tutto","insertOrderedList":"Elenco numerato","insertTable":"Inserisci/Modifica tabella","print":"Stampa","underline":"Sottolinea","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":"Attiva/Disattiva bordo tabella","viewSource":"Visualizza origine HTML","fontSize":"Dimensione carattere","systemShortcut":"La azione \"${0}\" è disponibile solo nel browser tramite un tasto di scelta rapida. Utilizzare ${1}.","indent":"Rientro","redo":"Ripristina","strikethrough":"Barrato","justifyFull":"Giustifica","justifyCenter":"Allinea al centro","hiliteColor":"Colore sfondo","deleteTable":"Elimina tabella","outdent":"Annulla rientro","cut":"Taglia","plainFormatBlock":"Stile paragrafo","toggleDir":"Attiva/Disattiva direzione","bold":"Grassetto","tabIndent":"Rientro tabulazione","justifyRight":"Allinea a destra","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.it");dijit._editor.nls.FontChoice.it={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.it");dijit._editor.nls.LinkDialog.it={"text":"Descrizione:","insertImageTitle":"Proprietà immagine","set":"Imposta","newWindow":"Nuova finestra","topWindow":"Finestra superiore","target":"Destinazione:","createLinkTitle":"Proprietà collegamento","parentWindow":"Finestra padre","currentWindow":"Finestra corrente","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.it");dojo.cldr.nls.currency.it={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.it");dojo.cldr.nls.gregorian.it={"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","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}"};
diff --git a/lib/dijit/nls/dijit-all_ja-jp.js b/lib/dijit/nls/dijit-all_ja-jp.js
deleted file mode 100644
index 067474b36..000000000
--- a/lib/dijit/nls/dijit-all_ja-jp.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.ja_jp");dijit._editor.nls.commands.ja_jp={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.ja_jp");dijit._editor.nls.FontChoice.ja_jp={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.ja_jp");dijit._editor.nls.LinkDialog.ja_jp={"text":"説明:","insertImageTitle":"イメージ・プロパティー","set":"設定","newWindow":"新規ウィンドウ","topWindow":"最上位ウィンドウ","target":"ターゲット:","createLinkTitle":"リンク・プロパティー","parentWindow":"親ウィンドウ","currentWindow":"現行ウィンドウ","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ja_jp");dojo.cldr.nls.currency.ja_jp={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ja_jp");dojo.cldr.nls.gregorian.ja_jp={"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":"L","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"};
diff --git a/lib/dijit/nls/dijit-all_ja.js b/lib/dijit/nls/dijit-all_ja.js
deleted file mode 100644
index af7cb82cd..000000000
--- a/lib/dijit/nls/dijit-all_ja.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.ja");dijit._editor.nls.commands.ja={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.ja");dijit._editor.nls.FontChoice.ja={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.ja");dijit._editor.nls.LinkDialog.ja={"text":"説明:","insertImageTitle":"イメージ・プロパティー","set":"設定","newWindow":"新規ウィンドウ","topWindow":"最上位ウィンドウ","target":"ターゲット:","createLinkTitle":"リンク・プロパティー","parentWindow":"親ウィンドウ","currentWindow":"現行ウィンドウ","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ja");dojo.cldr.nls.currency.ja={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ja");dojo.cldr.nls.gregorian.ja={"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":"L","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"};
diff --git a/lib/dijit/nls/dijit-all_ko-kr.js b/lib/dijit/nls/dijit-all_ko-kr.js
deleted file mode 100644
index f94d4bd8d..000000000
--- a/lib/dijit/nls/dijit-all_ko-kr.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.ko_kr");dijit._editor.nls.commands.ko_kr={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.ko_kr");dijit._editor.nls.FontChoice.ko_kr={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.ko_kr");dijit._editor.nls.LinkDialog.ko_kr={"text":"설명:","insertImageTitle":"이미지 특성","set":"설정","newWindow":"새 창","topWindow":"최상위 창","target":"대상:","createLinkTitle":"링크 특성","parentWindow":"상위 창","currentWindow":"현재 창","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ko_kr");dojo.cldr.nls.currency.ko_kr={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ko_kr");dojo.cldr.nls.gregorian.ko_kr={"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":"모레","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":"L","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})","dateFormatItem-H":"HH","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"};
diff --git a/lib/dijit/nls/dijit-all_ko.js b/lib/dijit/nls/dijit-all_ko.js
deleted file mode 100644
index b25c07653..000000000
--- a/lib/dijit/nls/dijit-all_ko.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.ko");dijit._editor.nls.commands.ko={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.ko");dijit._editor.nls.FontChoice.ko={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.ko");dijit._editor.nls.LinkDialog.ko={"text":"설명:","insertImageTitle":"이미지 특성","set":"설정","newWindow":"새 창","topWindow":"최상위 창","target":"대상:","createLinkTitle":"링크 특성","parentWindow":"상위 창","currentWindow":"현재 창","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ko");dojo.cldr.nls.currency.ko={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ko");dojo.cldr.nls.gregorian.ko={"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":"모레","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":"L","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})","dateFormatItem-H":"HH","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"};
diff --git a/lib/dijit/nls/dijit-all_nb.js b/lib/dijit/nls/dijit-all_nb.js
deleted file mode 100644
index 7352edc17..000000000
--- a/lib/dijit/nls/dijit-all_nb.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.nb");dijit._editor.nls.commands.nb={"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","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","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","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.nb");dijit._editor.nls.FontChoice.nb={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.nb");dijit._editor.nls.LinkDialog.nb={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.nb");dojo.cldr.nls.currency.nb={"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$"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.nb");dojo.cldr.nls.gregorian.nb={"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}"};
diff --git a/lib/dijit/nls/dijit-all_nl-nl.js b/lib/dijit/nls/dijit-all_nl-nl.js
deleted file mode 100644
index 13107dcdd..000000000
--- a/lib/dijit/nls/dijit-all_nl-nl.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.nl_nl");dijit._editor.nls.commands.nl_nl={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.nl_nl");dijit._editor.nls.FontChoice.nl_nl={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.nl_nl");dijit._editor.nls.LinkDialog.nl_nl={"text":"Beschrijving:","insertImageTitle":"Afbeeldingseigenschappen","set":"Instellen","newWindow":"Nieuw venster","topWindow":"Bovenste venster","target":"Doel:","createLinkTitle":"Linkeigenschappen","parentWindow":"Hoofdvenster","currentWindow":"Huidig venster","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.nl_nl");dojo.cldr.nls.currency.nl_nl={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.nl_nl");dojo.cldr.nls.gregorian.nl_nl={"dateFormatItem-yM":"M-y","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"PM","field-minute":"Minuut","eraNames":["Voor Christus","na Christus"],"dateFormatItem-MMMEd":"E d MMM","field-day-relative+-1":"gisteren","field-weekday":"Dag van de week","dateFormatItem-yQQQ":"QQQ y","field-day-relative+-2":"eergisteren","dateFormatItem-MMdd":"dd-MM","field-day-relative+-3":"eereergisteren","days-standAlone-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-era":"Tijdperk","field-hour":"Uur","dayPeriods-format-wide-am":"AM","quarters-standAlone-abbr":["K1","K2","K3","K4"],"dateFormatItem-y":"y","timeFormat-full":"HH:mm:ss zzzz","months-standAlone-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"dateFormatItem-yMMM":"MMM y","field-day-relative+0":"vandaag","field-day-relative+1":"morgen","days-standAlone-narrow":["Z","M","D","W","D","V","Z"],"eraAbbr":["v. Chr.","n. Chr."],"field-day-relative+2":"overmorgen","field-day-relative+3":"overovermorgen","dateFormatItem-yyyyMMMM":"MMMM y","dateFormat-long":"d MMMM y","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d-MM","dateFormat-medium":"d MMM y","dateFormatItem-yyMM":"MM-yy","dateFormatItem-yyMMM":"MMM yy","dateFormatItem-yyQQQQ":"QQQQ yy","quarters-standAlone-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-ms":"mm:ss","field-year":"Jaar","field-week":"Week","months-standAlone-wide":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"dateFormatItem-MMMd":"d-MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"HH:mm:ss z","months-format-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"timeFormat-short":"HH:mm","field-month":"Maand","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["K1","K2","K3","K4"],"days-format-abbr":["zo","ma","di","wo","do","vr","za"],"dateFormatItem-M":"L","days-format-narrow":["Z","M","D","W","D","V","Z"],"field-second":"Seconde","field-day":"Dag","dateFormatItem-MEd":"E d-M","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"days-standAlone-abbr":["zo","ma","di","wo","do","vr","za"],"dateFormat-short":"dd-MM-yy","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":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"dateFormatItem-d":"d","quarters-format-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"days-format-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"eraNarrow":["v. Chr.","n. Chr."],"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"};
diff --git a/lib/dijit/nls/dijit-all_nl.js b/lib/dijit/nls/dijit-all_nl.js
deleted file mode 100644
index 9f7820b49..000000000
--- a/lib/dijit/nls/dijit-all_nl.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.nl");dijit._editor.nls.commands.nl={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.nl");dijit._editor.nls.FontChoice.nl={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.nl");dijit._editor.nls.LinkDialog.nl={"text":"Beschrijving:","insertImageTitle":"Afbeeldingseigenschappen","set":"Instellen","newWindow":"Nieuw venster","topWindow":"Bovenste venster","target":"Doel:","createLinkTitle":"Linkeigenschappen","parentWindow":"Hoofdvenster","currentWindow":"Huidig venster","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.nl");dojo.cldr.nls.currency.nl={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.nl");dojo.cldr.nls.gregorian.nl={"dateFormatItem-yM":"M-y","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"PM","field-minute":"Minuut","eraNames":["Voor Christus","na Christus"],"dateFormatItem-MMMEd":"E d MMM","field-day-relative+-1":"gisteren","field-weekday":"Dag van de week","dateFormatItem-yQQQ":"QQQ y","field-day-relative+-2":"eergisteren","dateFormatItem-MMdd":"dd-MM","field-day-relative+-3":"eereergisteren","days-standAlone-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-era":"Tijdperk","field-hour":"Uur","dayPeriods-format-wide-am":"AM","quarters-standAlone-abbr":["K1","K2","K3","K4"],"dateFormatItem-y":"y","timeFormat-full":"HH:mm:ss zzzz","months-standAlone-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"dateFormatItem-yMMM":"MMM y","field-day-relative+0":"vandaag","field-day-relative+1":"morgen","days-standAlone-narrow":["Z","M","D","W","D","V","Z"],"eraAbbr":["v. Chr.","n. Chr."],"field-day-relative+2":"overmorgen","field-day-relative+3":"overovermorgen","dateFormatItem-yyyyMMMM":"MMMM y","dateFormat-long":"d MMMM y","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d-MM","dateFormat-medium":"d MMM y","dateFormatItem-yyMM":"MM-yy","dateFormatItem-yyMMM":"MMM yy","dateFormatItem-yyQQQQ":"QQQQ yy","quarters-standAlone-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-ms":"mm:ss","field-year":"Jaar","field-week":"Week","months-standAlone-wide":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"dateFormatItem-MMMd":"d-MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"HH:mm:ss z","months-format-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"timeFormat-short":"HH:mm","field-month":"Maand","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["K1","K2","K3","K4"],"days-format-abbr":["zo","ma","di","wo","do","vr","za"],"dateFormatItem-M":"L","days-format-narrow":["Z","M","D","W","D","V","Z"],"field-second":"Seconde","field-day":"Dag","dateFormatItem-MEd":"E d-M","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"days-standAlone-abbr":["zo","ma","di","wo","do","vr","za"],"dateFormat-short":"dd-MM-yy","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":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"dateFormatItem-d":"d","quarters-format-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"days-format-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"eraNarrow":["v. Chr.","n. Chr."],"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"};
diff --git a/lib/dijit/nls/dijit-all_pl.js b/lib/dijit/nls/dijit-all_pl.js
deleted file mode 100644
index db6e375aa..000000000
--- a/lib/dijit/nls/dijit-all_pl.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_pl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pl");dojo.nls.colors.pl={"lightsteelblue":"jasny stalowoniebieski","orangered":"pomarańczowoczerwony","midnightblue":"ciemnogranatowy","cadetblue":"niebieskoszary","seashell":"muszla","slategrey":"łupkowy szary","coral":"koralowy","darkturquoise":"ciemnoturkusowy","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":"przytłumiony szary","orange":"pomarańczowy","white":"biały","navajowhite":"piaskowy","royalblue":"błękit królewski","deeppink":"głęboki różowy","lime":"limetkowy","oldlace":"bladopomarańczowy","chartreuse":"jaskrawozielony","darkcyan":"ciemny cyjan","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"kawowy","darkviolet":"ciemnofioletowy","lightslategrey":"jasny łupkowy szary","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"wodny","sienna":"siena","mintcream":"jasnomiętowy","rosybrown":"różowobrązowy","mediumslateblue":"średni łupkowy niebieski","magenta":"magenta","lightseagreen":"jasna morska zieleń","cyan":"cyjan","olivedrab":"oliwkowa zieleń","darkgoldenrod":"ciemnogliniany","slateblue":"łupkowy niebieski","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia morska zieleń","maroon":"bordowy","darkslategray":"ciemny łupkowy szary","mediumturquoise":"średni turkusowy","ghostwhite":"bladobiały","darkblue":"ciemnoniebieski","mediumvioletred":"średni fioletowoczerwony","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":"cyrankowy","floralwhite":"kwiatowa biel","cornflowerblue":"chabrowy","paleturquoise":"bladoturkusowy","purple":"purpurowy","gainsboro":"bladoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"melon","darkseagreen":"ciemna morska zieleń","lightcoral":"jasnokoralowy","palevioletred":"blady fioletowoczerwony","mediumpurple":"średnia purpura","saddlebrown":"skórzany brązowy","darkmagenta":"ciemna magenta","thistle":"bladofioletowy","whitesmoke":"przydymiony biały","wheat":"pszeniczny","violet":"fioletowy","lightskyblue":"jasny błękit nieba","goldenrod":"gliniany","mediumblue":"średni niebieski","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny łupkowy szary","peru":"jasnobrązowy","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasnogliniana żółć","blanchedalmond":"migdałowy","aliceblue":"bladoniebieski","bisque":"biszkoptowy","slategray":"łupkowy szary","palegoldenrod":"bladogliniany","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"kolor drewna","dodgerblue":"błękit Dodgers","darkgray":"ciemnoszary","lightcyan":"jasny cyjan","powderblue":"pudrowy niebieski","blueviolet":"niebieskofioletowy","orchid":"orchidea","dimgray":"przytłumiony szary","beige":"beżowy","fuchsia":"fuksja","lavenderblush":"lawendoworóżowy","hotpink":"intensywny różowy","steelblue":"stalowy niebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"limetkowozielony","indianred":"kasztanowy","papayawhip":"papaja","lightslategray":"jasny łupkowy szary","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"kukurydziany","black":"czarny","seagreen":"morska zieleń","darkslateblue":"ciemny łupkowy niebieski","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazur","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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.pl");dijit._editor.nls.commands.pl={"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":"Źródło 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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.pl");dijit._editor.nls.FontChoice.pl={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.pl");dijit._editor.nls.LinkDialog.pl={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.pl");dojo.cldr.nls.currency.pl={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.pl");dojo.cldr.nls.gregorian.pl={"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-M-y","dateFormatItem-MMMEd":"d MMM E","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-M","dayPeriods-format-wide-noon":"w południe","field-era":"Era","dateFormatItem-yM":"M-y","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":"dd-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-M","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":"yyyy-MM","dateFormatItem-y":"y","months-standAlone-narrow":["s","l","m","k","m","c","l","s","w","p","l","g"],"dateFormatItem-yyMM":"MM/yy","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","field-week":"Tydzień","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}","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}"};
diff --git a/lib/dijit/nls/dijit-all_pt-br.js b/lib/dijit/nls/dijit-all_pt-br.js
deleted file mode 100644
index 384e56ddc..000000000
--- a/lib/dijit/nls/dijit-all_pt-br.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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":"marrom","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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.pt_br");dijit._editor.nls.commands.pt_br={"removeFormat":"Remover Formato","copy":"Copiar","paste":"Colar","selectAll":"Selecionar Todos","insertOrderedList":"Lista Numerada","insertTable":"Inserir/Editar Tabela","print":"Impressão","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 pela 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 do teclado. Use ${1}.","indent":"Recuar","redo":"Refazer","strikethrough":"Tachado","justifyFull":"Justificar","justifyCenter":"Alinhar pelo Centro","hiliteColor":"Cor de 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 pela Direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.pt_br");dijit._editor.nls.FontChoice.pt_br={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.pt_br");dijit._editor.nls.LinkDialog.pt_br={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.pt_br");dojo.cldr.nls.currency.pt_br={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.pt_br");dojo.cldr.nls.gregorian.pt_br={"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"};
diff --git a/lib/dijit/nls/dijit-all_pt-pt.js b/lib/dijit/nls/dijit-all_pt-pt.js
deleted file mode 100644
index 50ad9e399..000000000
--- a/lib/dijit/nls/dijit-all_pt-pt.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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 escuro","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 escuro","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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.pt_pt");dijit._editor.nls.commands.pt_pt={"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":"Origem 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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.pt_pt");dijit._editor.nls.FontChoice.pt_pt={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.pt_pt");dijit._editor.nls.LinkDialog.pt_pt={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.pt_pt");dojo.cldr.nls.currency.pt_pt={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.pt_pt");dojo.cldr.nls.gregorian.pt_pt={"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"],"dayPeriods-standAlone-abbr-pm":"p.m.","dateFormatItem-hm":"h:mm","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","dayPeriods-format-abbr-pm":"p.m.","dateFormatItem-yyQ":"QQQ 'de' yy","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"],"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-yQ":"QQQ 'de' yyyy","dateFormatItem-hms":"h:mm:ss","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-HHmmss":"HH'h'mm'min'ss's'","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","dateFormatItem-Hm":"HH'h'mm","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","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","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","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","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}","dateFormatItem-Hms":"HH:mm:ss"};
diff --git a/lib/dijit/nls/dijit-all_pt.js b/lib/dijit/nls/dijit-all_pt.js
deleted file mode 100644
index 6e670e66e..000000000
--- a/lib/dijit/nls/dijit-all_pt.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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":"marrom","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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.pt");dijit._editor.nls.commands.pt={"removeFormat":"Remover Formato","copy":"Copiar","paste":"Colar","selectAll":"Selecionar Todos","insertOrderedList":"Lista Numerada","insertTable":"Inserir/Editar Tabela","print":"Impressão","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 pela 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 do teclado. Use ${1}.","indent":"Recuar","redo":"Refazer","strikethrough":"Tachado","justifyFull":"Justificar","justifyCenter":"Alinhar pelo Centro","hiliteColor":"Cor de 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 pela Direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.pt");dijit._editor.nls.FontChoice.pt={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.pt");dijit._editor.nls.LinkDialog.pt={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.pt");dojo.cldr.nls.currency.pt={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.pt");dojo.cldr.nls.gregorian.pt={"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"};
diff --git a/lib/dijit/nls/dijit-all_ru.js b/lib/dijit/nls/dijit-all_ru.js
deleted file mode 100644
index eb33d7773..000000000
--- a/lib/dijit/nls/dijit-all_ru.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.ru");dijit._editor.nls.commands.ru={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.ru");dijit._editor.nls.FontChoice.ru={"1":"самый маленький","2":"очень маленький","formatBlock":"Формат","3":"маленький","4":"средний","5":"большой","6":"очень большой","7":"самый большой","fantasy":"артистический","serif":"с засечками","p":"Абзац","pre":"Заранее отформатированный","sans-serif":"без засечек","fontName":"Шрифт","h1":"Заголовок","h2":"Подзаголовок","h3":"Вложенный подзаголовок","monospace":"непропорциональный","fontSize":"Размер","cursive":"курсив","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.ru");dijit._editor.nls.LinkDialog.ru={"text":"Описание:","insertImageTitle":"Свойства изображения","set":"Задать","newWindow":"Новое окно","topWindow":"Окно верхнего уровня","target":"Целевой объект:","createLinkTitle":"Свойства ссылки","parentWindow":"Родительское окно","currentWindow":"Текущее окно","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ru");dojo.cldr.nls.currency.ru={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ru");dojo.cldr.nls.gregorian.ru={"dateFormatItem-yM":"M.y","field-dayperiod":"AM/PM","field-minute":"Минута","eraNames":["до н.э.","н.э."],"dateFormatItem-MMMEd":"E 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"};
diff --git a/lib/dijit/nls/dijit-all_sk.js b/lib/dijit/nls/dijit-all_sk.js
deleted file mode 100644
index 2ac818c23..000000000
--- a/lib/dijit/nls/dijit-all_sk.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.sk");dijit._editor.nls.commands.sk={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.sk");dijit._editor.nls.FontChoice.sk={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.sk");dijit._editor.nls.LinkDialog.sk={"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:"};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:]","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"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.sk");dojo.cldr.nls.currency.sk={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.sk");dojo.cldr.nls.gregorian.sk={"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"};
diff --git a/lib/dijit/nls/dijit-all_sl.js b/lib/dijit/nls/dijit-all_sl.js
deleted file mode 100644
index d67f53f52..000000000
--- a/lib/dijit/nls/dijit-all_sl.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_sl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sl");dojo.nls.colors.sl={"lightsteelblue":"svetlo jeklena modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"zelenkasto modra","seashell":"morska školjka","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":"umazano siva","orange":"oranžna","white":"bela","navajowhite":"navajsko bela","royalblue":"kraljevsko modra","deeppink":"temno roza","lime":"rumeno zelena","oldlace":"stara čipka","chartreuse":"svetlo rumena zelena","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travnato zelena","lightyellow":"svetlo rumena","tan":"kožno rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno rumenkasto rjava","green":"zelena","deepskyblue":"temno nebesno modra","aqua":"akva","sienna":"siena","mintcream":"mentolno smetanasta","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"olivno sivo rjava","darkgoldenrod":"temno zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednje akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"prosojno bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično-rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"roza","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejna","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarsko modra","lemonchiffon":"limonina","teal":"zeleno modra","floralwhite":"cvetno bela","cornflowerblue":"plavično modra","paleturquoise":"bledo turkizna","purple":"škrlatna","gainsboro":"pepelnato siva","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":"temno magenta","thistle":"osatna","whitesmoke":"umazano bela","wheat":"žitna","violet":"vijolična","lightskyblue":"svetlo nebesno modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebesno 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":"mandljeva","aliceblue":"alice modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"grčav les","dodgerblue":"koruzno modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"smodniško modra","blueviolet":"modro vijolična","orchid":"orhidejna","dimgray":"umazano siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"bleščeča sivka","hotpink":"živo roza","steelblue":"jekleno modra","tomato":"paradižnikova","lightpink":"svetlo roza","limegreen":"citronsko zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejna","cornsilk":"koruzni laski","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"rumenkasto rjava","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurna","peachpuff":"breskova","darkolivegreen":"temno 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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.sl");dijit._editor.nls.commands.sl={"removeFormat":"Odstrani obliko zapisa","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":"Obojestranska poravnava","justifyCenter":"Poravnaj na sredino","hiliteColor":"Barva ozadja","deleteTable":"Izbriši tabelo","outdent":"Viseč odstavek","cut":"Izreži","plainFormatBlock":"Slog odstavka","toggleDir":"Preklopi na usmeritev","bold":"Krepko","tabIndent":"Zamik tabulatorja","justifyRight":"Poravnaj desno","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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 zunaj obsega. ","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 možnosti","nextMessage":"Dodatne možnosti"};dojo.provide("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.sl");dijit._editor.nls.FontChoice.sl={"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 oblikovano","sans-serif":"sans-serif","fontName":"Pisava","h1":"Naslov","h2":"Podnaslov","h3":"Pod podnaslov","monospace":"monospace","fontSize":"Velikost","cursive":"cursive","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.sl");dijit._editor.nls.LinkDialog.sl={"text":"Opis:","insertImageTitle":"Lastnosti slike","set":"Nastavi","newWindow":"Novo okno","topWindow":"Najvišje okno","target":"Cilj:","createLinkTitle":"Lastnosti povezave","parentWindow":"Nadrejeno okno","currentWindow":"Trenutno okno","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.sl");dojo.cldr.nls.currency.sl={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.sl");dojo.cldr.nls.gregorian.sl={"field-dayperiod":"Čas dneva","dayPeriods-format-wide-pm":"pop.","field-minute":"Minuta","eraNames":["pred našim štetjem","naše štetje"],"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"],"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","months-standAlone-wide":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"field-week":"Teden","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","dateFormatItem-MMMMd":"d. MMMM","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["ned","pon","tor","sre","čet","pet","sob"],"dateFormatItem-MMMMdd":"dd. MMMM","dateFormatItem-mmss":"mm:ss","days-format-narrow":["n","p","t","s","č","p","s"],"field-second":"Sekunda","field-day":"Dan","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","dateFormat-full":"EEEE, dd. MMMM y","dateFormatItem-Md":"d. M.","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","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","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-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","dateFormatItem-MMMd":"MMM d","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","dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"};
diff --git a/lib/dijit/nls/dijit-all_sv.js b/lib/dijit/nls/dijit-all_sv.js
deleted file mode 100644
index 2de24a570..000000000
--- a/lib/dijit/nls/dijit-all_sv.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.sv");dijit._editor.nls.commands.sv={"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"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.sv");dijit._editor.nls.FontChoice.sv={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.sv");dijit._editor.nls.LinkDialog.sv={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.sv");dojo.cldr.nls.currency.sv={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.sv");dojo.cldr.nls.gregorian.sv={"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":"y MMM","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}"};
diff --git a/lib/dijit/nls/dijit-all_th.js b/lib/dijit/nls/dijit-all_th.js
deleted file mode 100644
index ee6501592..000000000
--- a/lib/dijit/nls/dijit-all_th.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.th");dijit._editor.nls.commands.th={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.th");dijit._editor.nls.FontChoice.th={"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","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.th");dijit._editor.nls.LinkDialog.th={"text":"รายละเอียด","insertImageTitle":"คุณสมบัติอิมเมจ","set":"ตั้งค่า","newWindow":"หน้าต่างใหม่","topWindow":"หน้าต่างบนสุด","target":"เป้าหมาย:","createLinkTitle":"คุณสมบัติลิงก์","parentWindow":"หน้าต่างหลัก","currentWindow":"หน้าต่างปัจจุบัน","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.th");dojo.cldr.nls.currency.th={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.th");dojo.cldr.nls.gregorian.th={"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"};
diff --git a/lib/dijit/nls/dijit-all_tr.js b/lib/dijit/nls/dijit-all_tr.js
deleted file mode 100644
index 173d38775..000000000
--- a/lib/dijit/nls/dijit-all_tr.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.tr");dijit._editor.nls.commands.tr={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.tr");dijit._editor.nls.FontChoice.tr={"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ı","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.tr");dijit._editor.nls.LinkDialog.tr={"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:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.tr");dojo.cldr.nls.currency.tr={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.tr");dojo.cldr.nls.gregorian.tr={"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}"};
diff --git a/lib/dijit/nls/dijit-all_xx.js b/lib/dijit/nls/dijit-all_xx.js
deleted file mode 100644
index 7ac51c180..000000000
--- a/lib/dijit/nls/dijit-all_xx.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.xx");dijit._editor.nls.commands.xx={"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"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.xx");dijit._editor.nls.FontChoice.xx={"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"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.xx");dijit._editor.nls.LinkDialog.xx={"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:"};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:]","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"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.xx");dojo.cldr.nls.currency.xx={"USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.xx");dojo.cldr.nls.gregorian.xx={"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"};
diff --git a/lib/dijit/nls/dijit-all_zh-cn.js b/lib/dijit/nls/dijit-all_zh-cn.js
deleted file mode 100644
index 1949751ee..000000000
--- a/lib/dijit/nls/dijit-all_zh-cn.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.zh_cn");dijit._editor.nls.commands.zh_cn={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.zh_cn");dijit._editor.nls.FontChoice.zh_cn={"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":"草书","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.zh_cn");dijit._editor.nls.LinkDialog.zh_cn={"text":"描述:","insertImageTitle":"图像属性","set":"设置","newWindow":"新窗口","topWindow":"最顶部窗口","target":"目标:","createLinkTitle":"链接属性","parentWindow":"父窗口","currentWindow":"当前窗口","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.zh_cn");dojo.cldr.nls.currency.zh_cn={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.zh_cn");dojo.cldr.nls.gregorian.zh_cn={"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":"L","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"};
diff --git a/lib/dijit/nls/dijit-all_zh-tw.js b/lib/dijit/nls/dijit-all_zh-tw.js
deleted file mode 100644
index 9f6f5f46c..000000000
--- a/lib/dijit/nls/dijit-all_zh-tw.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.zh_tw");dijit._editor.nls.commands.zh_tw={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.zh_tw");dijit._editor.nls.FontChoice.zh_tw={"1":"最小","2":"較小","formatBlock":"格式","3":"小","4":"中","5":"大","6":"較大","7":"最大","fantasy":"Fantasy","serif":"新細明體","p":"段落","pre":"預先格式化","sans-serif":"新細明體","fontName":"字型","h1":"標題","h2":"子標題","h3":"次子標題","monospace":"等寬","fontSize":"大小","cursive":"Cursive","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.zh_tw");dijit._editor.nls.LinkDialog.zh_tw={"text":"說明:","insertImageTitle":"影像內容","set":"設定","newWindow":"新視窗","topWindow":"最上面的視窗","target":"目標:","createLinkTitle":"鏈結內容","parentWindow":"上層視窗","currentWindow":"現行視窗","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.zh_tw");dojo.cldr.nls.currency.zh_tw={"BRE_displayName":"巴西克魯賽羅 (1990-1993)","DEM_displayName":"德國馬克","KGS_symbol":"som","CUP_displayName":"古巴披索","HUF_symbol":"Ft","BDT_symbol":"Tk","LSL_symbol":"M","VEF_symbol":"BsF","MDL_displayName":"摩杜雲列伊","DOP_displayName":"多明尼加披索","MTL_symbol":"Lm","NGN_displayName":"奈及利亞奈拉","KZT_displayName":"卡扎克斯坦坦吉","BGL_symbol":"lev","LTT_displayName":"立陶宛特羅","LAK_displayName":"寮國基普","LKR_displayName":"斯里蘭卡盧布","AOR_displayName":"安哥拉新寬扎 Reajustado (1995-1999)","XEU_displayName":"歐洲貨幣單位 XEU","SYP_symbol":"LS","USS_displayName":"美元 (同一天)","MNT_displayName":"蒙古圖格里克","AMD_symbol":"dram","MOP_displayName":"澳門元","TJR_displayName":"塔吉克斯坦盧布","LUC_displayName":"盧森堡可兌換法郎","LUL_displayName":"盧森堡金融法郎","MRO_symbol":"UM","AON_displayName":"安哥拉新寬扎 (1990-2000)","BEF_displayName":"比利時法郎","IEP_displayName":"愛爾蘭鎊","SBD_displayName":"索羅門群島元","GRD_displayName":"希臘德拉克馬","AZM_displayName":"阿塞拜彊馬特納","MTP_displayName":"馬爾他鎊","UGX_symbol":"U Sh","ARS_symbol":"Arg$","LVR_displayName":"拉脫維亞盧布","GNF_displayName":"幾內亞法郎","GIP_displayName":"直布羅陀鎊","SRG_displayName":"蘇里南盾","BAD_displayName":"波士尼亞-黑塞哥維那第納爾","FJD_displayName":"斐濟元","BAM_displayName":"波士尼亞-黑塞哥維那可轉換馬克","XBB_displayName":"歐洲貨幣單位 XBB","CDF_displayName":"剛果法郎","HRD_displayName":"克羅地亞第納爾","EQE_displayName":"埃奎維勒","BZD_displayName":"伯利茲元","MLF_displayName":"馬里法郎","VEB_symbol":"Be","EGP_displayName":"埃及鎊","MVR_displayName":"馬爾地夫海島盧非亞","KWD_symbol":"KD","TRL_symbol":"TL","ALL_symbol":"lek","SDP_displayName":"蘇丹鎊","NPR_displayName":"尼泊爾盧布","PHP_displayName":"菲律賓披索","DJF_symbol":"DF","WST_displayName":"西薩摩亞塔拉","JPY_displayName":"日圓","TMM_displayName":"土庫曼馬納特","STD_symbol":"Db","BGN_displayName":"保加利亞新列弗","KYD_displayName":"開曼群島美元","VUV_displayName":"萬那杜萬杜","IRR_displayName":"伊朗里亞爾","DJF_displayName":"吉布地法郎","BTN_symbol":"Nu","XDR_displayName":"特殊提款權","ECS_displayName":"厄瓜多蘇克雷","LSM_displayName":"馬洛蒂","MNT_symbol":"Tug","NLG_displayName":"荷蘭盾","MWK_displayName":"馬拉維克瓦查","IRR_symbol":"RI","OMR_symbol":"RO","JMD_symbol":"J$","PES_displayName":"秘魯太陽幣","SRG_symbol":"Sf","LYD_displayName":"利比亞第納爾","BRR_displayName":"巴西克魯賽羅","ETB_symbol":"Br","KMF_symbol":"CF","DKK_symbol":"DKr","XXX_displayName":"XXX","IDR_displayName":"印尼 - 盧布","DZD_symbol":"DA","TZS_symbol":"T Sh","SGD_symbol":"SGD","KGS_displayName":"吉爾吉斯索馬","BRN_displayName":"巴西克如爾達農瓦","AFN_symbol":"Af","ISK_displayName":"冰島克朗","LUF_displayName":"盧森堡法郎","MXN_symbol":"MEX$","GYD_symbol":"G$","TOP_symbol":"T$","SVC_displayName":"薩爾瓦多科郎","ZMK_displayName":"尚比亞克瓦查","TOP_displayName":"東加潘加","ITL_displayName":"義大利里拉","USN_displayName":"美元 (第二天)","KWD_displayName":"科威特第納爾","GEL_symbol":"lari","KMF_displayName":"科摩羅法郎","COP_symbol":"Col$","MYR_displayName":"馬來西亞 - 林吉特","XFU_displayName":"法國 UIC 法郎","GMD_displayName":"甘比亞達拉西","LVL_displayName":"拉脫維亞拉特銀幣","AUD_displayName":"澳幣","XPF_displayName":"CFP 法郎","LBP_displayName":"黎巴嫩鎊","SKK_symbol":"Sk","BYB_displayName":"白俄羅斯新盧布 (1994-1999)","MKD_displayName":"馬其頓第納爾","GWP_displayName":"幾內亞披索披索","CNY_displayName":"人民幣","HNL_symbol":"L","BOB_symbol":"Bs","JOD_displayName":"約旦第納爾","OMR_displayName":"阿曼里奧","BOV_displayName":"玻利維亞幕多","XPT_displayName":"白金","AUD_symbol":"AU$","NOK_displayName":"挪威克羅納","SCR_displayName":"塞舌爾群島盧布","XBA_displayName":"歐洲綜合單位","CSK_displayName":"捷克斯洛伐克硬克朗","PLZ_displayName":"波蘭茲羅提 (1950-1995)","UAK_displayName":"烏克蘭卡本瓦那茲","MGF_displayName":"馬達加斯加法郎","GNS_displayName":"幾內亞西里","YUN_displayName":"南斯拉夫 可轉換第納爾","UYU_symbol":"Ur$","GYD_displayName":"圭亞那元","QAR_displayName":"卡達爾里亞爾","BZD_symbol":"BZ$","JOD_symbol":"JD","ALL_displayName":"阿爾巴尼亞列克","BBD_displayName":"巴貝多元","RON_displayName":"羅馬尼亞列伊","XCD_symbol":"EC$","AMD_displayName":"亞美尼亞德拉姆","CYP_displayName":"賽浦路斯鎊","GBP_symbol":"£","SEK_displayName":"瑞典克羅納","MZN_symbol":"MTn","MMK_displayName":"緬甸元","ZAR_displayName":"南非蘭特","ECV_displayName":"厄瓜多爾由里達瓦康斯坦 (UVC)","LYD_symbol":"LD","VUV_symbol":"VT","AWG_displayName":"阿魯巴盾","CVE_symbol":"CVEsc","STD_displayName":"聖多美島和普林西比島多布拉","CAD_displayName":"加幣","ADP_displayName":"安道爾陪士特","MRO_displayName":"茅利塔尼亞烏吉亞","LSL_displayName":"賴索托羅蒂","TND_displayName":"突尼西亞第納爾","USD_symbol":"$","BMD_symbol":"Ber$","BAM_symbol":"KM","BRC_displayName":"巴西克魯賽羅 (1986-1989)","BMD_displayName":"百慕達幣","BRL_displayName":"巴西里拉","JMD_displayName":"牙買加元","SOS_displayName":"索馬利亞先令","SAR_displayName":"沙烏地里雅","PEI_displayName":"祕魯因蒂","ESP_displayName":"西班牙陪士特","HKD_displayName":"港幣","ESP_symbol":"₧","BWP_displayName":"波札那 - 普拉","TTD_displayName":"千里達及托巴哥元","BSD_displayName":"巴哈馬元","BIF_displayName":"蒲隆地法郎","FRF_displayName":"法國法郎","DKK_displayName":"丹麥克羅納","AED_displayName":"阿拉伯聯合大公國迪爾汗","GHS_symbol":"GH¢","AOK_displayName":"安哥拉寬扎(1977-1990)","ATS_displayName":"奧地利先令","PEN_displayName":"秘魯新太陽幣","CRC_displayName":"哥斯大黎加科郎","PAB_displayName":"巴拿馬巴波亞","CHE_displayName":"WIR 歐元","GQE_displayName":"赤道幾內亞埃奎勒","DZD_displayName":"阿爾及利亞第納爾","EEK_displayName":"愛沙尼亞克朗","YDD_displayName":"葉門第納爾","GHC_displayName":"迦納仙蔕","YER_symbol":"YRl","PLN_symbol":"Zl","NPR_symbol":"Nrs","MXP_displayName":"墨西哥銀披索 (1861-1992)","XAG_displayName":"XAG","XFO_displayName":"法國金法郎","GWE_displayName":"葡屬幾內亞埃斯庫多","BOB_displayName":"玻利維亞貨幣單位","CAD_symbol":"CA$","ZWD_displayName":"辛巴威元","SRD_displayName":"蘇利南元","ZRN_displayName":"薩伊新扎伊爾","XAU_displayName":"黃金","GTQ_symbol":"Q","KRW_symbol":"KRW","BOP_displayName":"玻利維亞披索","LBP_symbol":"LL","XBD_displayName":"歐洲會計單位(XBD)","TZS_displayName":"坦尚尼亞先令","XPF_symbol":"CFPF","TTD_symbol":"TT$","LRD_displayName":"賴比瑞亞元","KRW_displayName":"韓國圜","SHP_displayName":"聖赫勒拿鎊","NAD_symbol":"N$","MZE_displayName":"莫桑比克埃斯庫多","SDD_displayName":"蘇丹第納爾","HRK_displayName":"克羅地亞庫納","FKP_displayName":"福克蘭群島鎊","COP_displayName":"哥倫比亞披索","YUD_displayName":"南斯拉夫第納爾硬幣","YUM_displayName":"南斯拉夫挪威亞第納爾","BYR_symbol":"Rbl","THB_displayName":"泰銖","MGA_displayName":"馬達加斯加艾瑞爾","TWD_displayName":"新臺幣","UGS_displayName":"烏干達先令 (1966-1987)","SBD_symbol":"SI$","ZAL_displayName":"南非 - 蘭特 (金融)","GEL_displayName":"喬治拉里","ILP_displayName":"以色列鎊","MKD_symbol":"MDen","KES_displayName":"肯尼亞先令","CZK_displayName":"捷克克朗","UGX_displayName":"烏干達先令","KZT_symbol":"T","BGL_displayName":"保加利亞硬列弗","ARP_displayName":"阿根廷披索(1983-1985)","BBD_symbol":"BDS$","MYR_symbol":"RM","RUR_displayName":"俄羅斯盧布 (1991-1998)","ERN_displayName":"厄立特里亞納克法","BEF_symbol":"BF","CLF_displayName":"卡林油達佛曼跎","BRB_displayName":"巴西克魯薩多農瓦(1967-1986)","IDR_symbol":"Rp","IEP_symbol":"IR£","BHD_displayName":"巴林第納爾","SYP_displayName":"敘利亞鎊","BIF_symbol":"Fbu","SZL_displayName":"史瓦濟蘭里朗吉尼","INR_displayName":"印度盧布","PTE_displayName":"葡萄牙埃斯庫多","KPW_displayName":"北朝鮮幣","XOF_displayName":"西非法郎 BCEAO","DOP_symbol":"RD$","MXN_displayName":"墨西哥 - 披索","RWF_displayName":"盧安達法郎","ETB_displayName":"衣索比亞比爾","LTL_displayName":"立陶宛里塔","SZL_symbol":"E","QAR_symbol":"QR","SOS_symbol":"Sh.","BND_displayName":"汶萊元","SUR_displayName":"蘇聯盧布","AOA_displayName":"安哥拉寬扎","FJD_symbol":"F$","CVE_displayName":"維德角埃斯庫多","XTS_displayName":"XTS","CLP_displayName":"智利披索","HUF_displayName":"匈牙利 - 福林","LKR_symbol":"SL Re","SCR_symbol":"SR","TJS_displayName":"塔吉克索莫尼","MWK_symbol":"MK","GBP_displayName":"英鎊","TPE_displayName":"帝汶埃斯庫多","GNF_symbol":"GF","SGD_displayName":"新加坡幣","SLL_displayName":"獅子山利昂","MZM_symbol":"Mt","PHP_symbol":"Php","CYP_symbol":"£C","XAF_displayName":"西非法郎 BEAC","MTL_displayName":"馬爾他里拉","KHR_displayName":"柬埔寨瑞爾","ZRZ_displayName":"扎伊爾扎伊爾","KES_symbol":"K Sh","PKR_symbol":"Pra","IQD_symbol":"ID","BEC_displayName":"比利時法郎 (可轉換)","BEL_displayName":"比利時法郎 (金融)","AZN_displayName":"亞塞拜然蒙納特","FIM_displayName":"芬蘭馬克","PKR_displayName":"巴基斯坦盧布","UYP_displayName":"烏拉圭披索 (1975-1993)","ANG_symbol":"NA f.","CHW_displayName":"WIR 法郎","PLN_displayName":"波蘭茲羅提","RON_symbol":"0≤lei|1≤leu|1","BTN_displayName":"不丹那特倫","UAH_displayName":"烏克蘭格里夫那","YER_displayName":"也門里亞爾","UYU_displayName":"烏拉圭披索","CRC_symbol":"C","PGK_displayName":"巴布亞紐幾內亞基那","XBC_displayName":"歐洲會計單位(XBC)","EUR_displayName":"歐元","MUR_displayName":"模里西斯盧布","BYR_displayName":"白俄羅斯盧布","SEK_symbol":"SKr","BHD_symbol":"BD","IQD_displayName":"伊拉克第納爾","VEB_displayName":"委內瑞拉博利瓦","CLP_symbol":"Ch$","MZM_displayName":"莫三比克梅蒂卡爾","NZD_symbol":"$NZ","CHF_symbol":"Fr.","SIT_displayName":"斯洛維尼亞托勒","NOK_symbol":"NKr","XCD_displayName":"格瑞那達元","RUB_displayName":"俄羅斯盧布","BUK_displayName":"緬甸元 BUK","ILS_displayName":"以色列新謝克爾","KHR_symbol":"CR","NAD_displayName":"納米比亞元","HNL_displayName":"洪都拉斯倫皮拉","GTQ_displayName":"瓜地馬拉格查爾","EUR_symbol":"€","NZD_displayName":"紐西蘭幣","ARA_displayName":"阿根廷奧斯特納爾","ARS_displayName":"阿根廷披索","ANG_displayName":"荷屬安地列斯盾","MOP_symbol":"MOP","ZWD_symbol":"Z$","ITL_symbol":"₤","ZAR_symbol":"R","CHF_displayName":"瑞士法郎","USD_displayName":"美元","CNY_symbol":"¥","HKD_symbol":"HK$","JPY_symbol":"JP¥"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.zh_tw");dojo.cldr.nls.gregorian.zh_tw={"dateFormatItem-yM":"yyyy/M","field-minute":"分鐘","eraNames":["西元前","西元"],"field-weekday":"週天","dateFormatItem-MMdd":"MM/dd","field-day-relative+-3":"大前天","field-relative-day":"大後天","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"field-era":"年代","field-hour":"小時","quarters-standAlone-abbr":["第1季","第2季","第3季","第4季"],"timeFormat-full":"zzzzah時mm分ss秒","months-standAlone-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"y年M月","eraAbbr":["西元前","西元"],"field-day-relative+2":"後天","field-day-relative+3":"大後天","timeFormat-medium":"ah:mm:ss","field-zone":"區域","dateFormatItem-yyMM":"yy-MM","dateFormat-medium":"yyyy/M/d","quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"dateFormatItem-yMMMM":"y年M月","dateFormatItem-HHmmss":"H:mm:ss","months-standAlone-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"field-week":"週","dateFormatItem-HHmm":"H:mm","timeFormat-long":"zah時mm分ss秒","dateFormatItem-H":"H時","quarters-format-abbr":["第1季","第2季","第3季","第4季"],"days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"field-second":"秒","dateFormatItem-MEd":"M/d(E)","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"days-standAlone-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormat-short":"yy/M/d","dateFormatItem-yMMMEd":"y年M月d日EEE","dateFormatItem-Md":"M/d","dateFormatItem-yMEd":"yyyy/M/d(EEE)","dateTimeAvailableFormats":["d日(E)","H:mm","H:mm:ss","M-d(E)","MM/dd","M/d","yyyy/M","yyyy/M/d(EEE)","yyyy年M月","yyyy年M月","yyyy/MM","MMMMdd日","MMMd日","MM-dd","M-d","d日","mm:ss","mm:ss","yyyy年","yyyy-M","yyyy年M月d日,E","yyyy年MMM","yyyy年MMMd日EEE","yyyy年MMMM","yyyy年QQQ","y年QQQ","yy-MM","yy年MMM","yy年第Q季度","yyyy年","yyyy年M月","yyyy年MMMM"],"quarters-format-wide":["第1季","第2季","第3季","第4季"],"eraNarrow":["西元前","西元"],"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","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":"明天","dateFormatItem-M":"L","days-standAlone-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-yyMMM":"yy年MMM","dateFormatItem-Hm":"H:mm","field-dayperiod":"上午/下午","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":"中午","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-y":"y年","dateFormatItem-hm":"ah:mm","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"};
diff --git a/lib/dijit/nls/dijit-all_zh.js b/lib/dijit/nls/dijit-all_zh.js
deleted file mode 100644
index 12af91a7a..000000000
--- a/lib/dijit/nls/dijit-all_zh.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dijit.nls.dijit-all_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._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.zh");dijit._editor.nls.commands.zh={"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}"};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("dijit._editor.nls.FontChoice");dijit._editor.nls.FontChoice._built=true;dojo.provide("dijit._editor.nls.FontChoice.zh");dijit._editor.nls.FontChoice.zh={"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":"草书","noFormat":"None"};dojo.provide("dijit._editor.nls.LinkDialog");dijit._editor.nls.LinkDialog._built=true;dojo.provide("dijit._editor.nls.LinkDialog.zh");dijit._editor.nls.LinkDialog.zh={"text":"描述:","insertImageTitle":"图像属性","set":"设置","newWindow":"新窗口","topWindow":"最顶部窗口","target":"目标:","createLinkTitle":"链接属性","parentWindow":"父窗口","currentWindow":"当前窗口","url":"URL:"};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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.zh");dojo.cldr.nls.currency.zh={"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":"€"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.zh");dojo.cldr.nls.gregorian.zh={"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":"L","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"};
diff --git a/lib/dijit/nls/kk/common.js b/lib/dijit/nls/kk/common.js
new file mode 100644
index 000000000..2ac0faf64
--- /dev/null
+++ b/lib/dijit/nls/kk/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Болдырмау","buttonSave":"Сақтау","itemClose":"Жабу"}) \ No newline at end of file
diff --git a/lib/dijit/nls/kk/loading.js b/lib/dijit/nls/kk/loading.js
new file mode 100644
index 000000000..ba14287a2
--- /dev/null
+++ b/lib/dijit/nls/kk/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Жүктелуде...","errorState":"Кешіріңіз, қате орын алды"}) \ No newline at end of file
diff --git a/lib/dijit/nls/sl/loading.js b/lib/dijit/nls/sl/loading.js
index 4100866db..bae0ab0c9 100644
--- a/lib/dijit/nls/sl/loading.js
+++ b/lib/dijit/nls/sl/loading.js
@@ -1 +1 @@
-({"loadingState":"Nalaganje...","errorState":"Oprostite, prišlo je do napake."}) \ No newline at end of file
+({"loadingState":"Nalaganje ...","errorState":"Oprostite, prišlo je do napake."}) \ No newline at end of file
diff --git a/lib/dijit/package.json b/lib/dijit/package.json
new file mode 100644
index 000000000..9ca942316
--- /dev/null
+++ b/lib/dijit/package.json
@@ -0,0 +1,24 @@
+{
+ "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
diff --git a/lib/dijit/resources/_modules.js b/lib/dijit/resources/_modules.js
index 8d3fc5de7..0470c8e9b 100644
--- a/lib/dijit/resources/_modules.js
+++ b/lib/dijit/resources/_modules.js
@@ -1,7 +1,25 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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
+
+dijit.demos = {
+ // summary:
+ // Home of the official dijit demo code
+};
+
+dijit.form = {
+ // summary:
+ // Form and input related widgets
+};
+
+dijit.layout = {
+ // summary:
+ // Layout related widgets
+};
+=====*/
diff --git a/lib/dijit/robot.js b/lib/dijit/robot.js
index 5035cf5d4..09be04d03 100644
--- a/lib/dijit/robot.js
+++ b/lib/dijit/robot.js
@@ -1,12 +1,15 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.robot"]=true;
+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
index 8f86dd81b..e5ef90641 100644
--- a/lib/dijit/robotx.js
+++ b/lib/dijit/robotx.js
@@ -1,24 +1,34 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.robotx"]=true;
+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 _1=doh.robot._updateDocument;
-dojo.mixin(doh.robot,{_updateDocument:function(){
-_1();
-var _2=dojo.global;
-if(_2["dijit"]){
-dijit=_2.dijit;
-}
-}});
+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/themes/a11y/colors3x4-rtl.png b/lib/dijit/themes/a11y/colors3x4-rtl.png
deleted file mode 100644
index 51a7d11a2..000000000
--- a/lib/dijit/themes/a11y/colors3x4-rtl.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/a11y/colors7x10-rtl.png b/lib/dijit/themes/a11y/colors7x10-rtl.png
deleted file mode 100644
index c191e9056..000000000
--- a/lib/dijit/themes/a11y/colors7x10-rtl.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/Calendar.css b/lib/dijit/themes/claro/Calendar.css
index 3a3256ef0..ff8e64fa7 100644
--- a/lib/dijit/themes/claro/Calendar.css
+++ b/lib/dijit/themes/claro/Calendar.css
@@ -1,206 +1,282 @@
-
+/* Calendar
+ *
+ * Styling Calendar mainly includes:
+ *
+ * 1. Calendar container
+ * .dijitCalendar - main container
+ * .dijitCalendarHover / .dijitCalendarActive - states e.g. hover,active
+ *
+ * 2. Month
+ * .dijitCalendarMonthContainer
+ * .dijitCalendarMonthLabel
+ * .dijitCalendarDecrease / .dijitCalendarDecrease - icons for switching to previous/next month
+ * .dijitCalendarArrowActive .dijitCalendarDecrease - states e.g. hover,active
+ *
+ * 3. Date
+ * .dijitCalendarDayLabelTemplate - week day column header e.g. S M T W T F S
+ * .dijitCalendarDateTemplate - date label wrapper
+ * .dijitCalendarPreviousMonth .dijitCalendarDateLabel - special labels for previous or next month
+ * .dijitCalendarSelectedDate .dijitCalendarDateLabel - styles for selected date
+ * .dijitCalendarDisabledDate .dijitCalendarDateLabel - styles for disabled date
+ * .dijitCalendarActiveDate .dijitCalendarDateLabel - states e.g. hover,active
+ *
+ * 4. Year
+ * .dijitCalendarYearContainer
+ * .dijitCalendarYearLabel
+ * .dijitCalendarPreviousYear /.dijitCalendarNextYear
+ * .dijitCalendarNextYearHover / .dijitCalendarPreviousYearHover - states e.g. hover,active
+ *
+ * 5. Dropdown Month Menu
+ * .dijitCalendarMonthMenu - menu container
+ * .dijitCalendarMonthMenu .dijitCalendarMonthLabel - month label in menu item
+ * .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover - menu item hover state
+ */
.claro .dijitCalendar {
- border:solid 1px #b5bcc7;
- background-color:#d4ebff;
- background-image:url("images/calendarContainerImages.png");
- background-position:0px -448px;
- background-repeat:repeat-x;
- text-align:center;
- padding:6px 5px 3px 5px;
- -moz-border-radius:4px;
- -webkit-border-radius:4px;
+ border: solid 1px #b5bcc7;
+ background-color: #cfe5fa;
+ background-image: url("images/calendarContainerImages.png");
+ background-position: 0 -448px;
+ background-repeat: repeat-x;
+ text-align: center;
+ padding: 6px 5px 3px 5px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
}
.dj_ie6 .claro .dijitCalendar {
- background-image:none;
+ background-image: none;
}
.claro .dijitCalendar img {
- border:none;
+ border: none;
}
-.claro .dijitCalendarHover,
-.claro .dijitCalendarActive {
- background-color: #b7dcff;
- border:solid 1px #769dc0;
+.claro .dijitCalendarHover, .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;
}
.claro .dijitCalendarMonthContainer th {
- text-align:center;
- padding-bottom:4px;
- vertical-align:middle;
-}
-.claro .dijitCalendarMonthLabelSpacer {
- display:none;
+ text-align: center;
+ padding-bottom: 4px;
+ vertical-align: middle;
}
.claro .dijitCalendarMonthLabel {
- color:#000000;
- font-size: 1.091em;
- display: block;
+ color: #000000;
+ font-size: 1.091em;
+ padding: 0 4px;
}
+/* next/previous month arrows */
.claro .dijitCalendarIncrementControl {
- width:18px;
- height:16px;
- background-image: url("images/calendarArrows.png");
- background-repeat: no-repeat;
+ width: 18px;
+ height: 16px;
+ background-image: url("images/calendarArrows.png");
+ background-repeat: no-repeat;
}
.dj_ie6 .claro .dijitCalendarIncrementControl {
- background-image: url("images/calendarArrows8bit.png");
+ background-image: url("images/calendarArrows8bit.png");
}
.claro .dijitCalendarIncrease {
- background-position:-18px 0px;
+ background-position: -18px 0;
}
.claro .dijitCalendarArrowHover .dijitCalendarDecrease {
- background-position:-36px 0px;
+ background-position: -36px 0;
}
.claro .dijitCalendarArrowHover .dijitCalendarIncrease {
- background-position:-55px 0px;
+ background-position: -55px 0;
}
.claro .dijitCalendarArrowActive .dijitCalendarDecrease {
- background-position:-72px 0px;
+ background-position: -72px 0;
}
.claro .dijitCalendarArrowActive .dijitCalendarIncrease {
- background-position:-91px 0px;
+ background-position: -91px 0;
}
.claro .dijitA11ySideArrow {
-
- display: none;
+ /* text +/- labels instead of arrow icons, for high contrast mode */
+
+ display: none;
}
.claro .dijitDayLabels th {
- padding:0px 4px 0px 4px;
- border-bottom:solid 1px #99b5cd;
- font-weight:bold;
- text-align:center;
+ padding: 0 4px 0 4px;
+ font-weight: bold;
+ text-align: center;
}
.claro .dijitCalendarDayLabelTemplate {
- padding-bottom:0em;
- text-align:center;
- border-bottom:1px solid #99B5CD;
- font-size:0.909em;
- padding:0 3px 2px;
+ padding-bottom: 0;
+ text-align: center;
+ border-bottom: 1px solid #b5bcc7;
+ font-size: 0.909em;
+ padding: 0 3px 2px;
}
.claro .dijitCalendarDateTemplate {
- text-align:center;
- background-color:#fff;
- background-image:url("images/calendarContainerImages.png");
- background-position:0px 0px;
- background-repeat:repeat-x;
- border-bottom: 1px solid #dadde1;
- padding-top:0px;
- font-size:0.909em;
- font-family: Arial;
- font-weight:bold;
- letter-spacing:.05em;
- text-align:center;
+ text-align: center;
+ background-color: #ffffff;
+ background-image: url("images/calendarContainerImages.png");
+ background-position: 0 0;
+ background-repeat: repeat-x;
+ border-bottom: 1px solid #d3d3d3;
+ padding-top: 0;
+ font-size: 0.909em;
+ font-family: Arial;
+ font-weight: bold;
+ letter-spacing: .05em;
+ text-align: center;
}
.dj_ie6 .claro .dijitCalendarDateTemplate {
- background-image: none;
+ background-image: none;
}
-.claro .dijitCalendarPreviousMonth,
-.claro .dijitCalendarNextMonth {
- background-color:#ebf3f9;
- background-image:none;
- border-bottom:solid 1px #d2dae8;
- color:#547da1;
+.claro .dijitCalendarPreviousMonth, .claro .dijitCalendarNextMonth {
+ background-color: #e9f4fe;
+ background-image: none;
+ border-bottom: solid 1px #d3d3d3;
+ /* todo: redundant with above .dijitCalendarDateTemplate rule */
}
.claro .dijitCalendarDateTemplate .dijitCalendarDateLabel {
- text-decoration:none;
- display:block;
- padding:3px 5px 3px 4px;
- border:solid 1px #fff;
- color:#1e1e1e;
- background-color:rgba(171,212,251,0);
- -webkit-transition-property:background-color, border;
- -webkit-transition-duration:.35s;
-}
-.claro .dijitCalendarPreviousMonth .dijitCalendarDateLabel,
-.claro .dijitCalendarNextMonth .dijitCalendarDateLabel{
- color:#547da1;
- border-color:#ebf3f9;
+ text-decoration: none;
+ display: block;
+ padding: 3px 5px 3px 4px;
+ border: solid 1px #ffffff;
+ /* intentionally matches background-color, no visible border until hover/selection */
+
+ background-color: rgba(171, 212, 251, 0);
+ /* transparent causes black-flash animation problem on webkit */
+
+ -webkit-transition-property: background-color, border;
+ -moz-transition-property: background-color, border;
+ transition-property: background-color, border;
+ -webkit-transition-duration: 0.35s;
+ -moz-transition-duration: 0.35s;
+ transition-duration: 0.35s;
+}
+.claro .dijitCalendarPreviousMonth .dijitCalendarDateLabel, .claro .dijitCalendarNextMonth .dijitCalendarDateLabel {
+ color: #769dc0;
+ border-color: #e9f4fe;
+ /* intentionally matches background-color, no visible border until hover/selection */
+
}
.claro .dijitCalendarYearContainer {
- vertical-align:middle;
+ vertical-align: middle;
}
.claro .dijitCalendarYearControl {
- padding: 1px 2px 2px 2px;
+ padding: 1px 2px 2px 2px;
}
.claro .dijitCalendarYearLabel {
- padding:2px 0px 0px 0px;
- margin:0;
+ padding: 2px 0 0 0;
+ margin: 0;
}
.claro .dijitCalendarYearLabel span {
-
- vertical-align:middle;
+ /* trying to center next/current/previous year vertically, doesn't work on IE6/7 though */
+
+ vertical-align: middle;
}
.claro .dijitCalendarSelectedYear {
- padding:0px 3px;
+ padding: 0 3px;
}
-.claro .dijitCalendarNextYear,
-.claro .dijitCalendarPreviousYear {
- padding: 1px 6px 1px 6px;
- font-size:0.909em;
+.claro .dijitCalendarNextYear, .claro .dijitCalendarPreviousYear {
+ padding: 1px 6px 1px 6px;
+ font-size: 0.909em;
}
.claro .dijitCalendarSelectedYear {
- font-size:1.091em;
- color:#000;
-}
-.claro .dijitCalendarHoveredDate .dijitCalendarDateLabel{
- background-color:#abd4fb;
- border:solid 1px #729dc2;
- color:#000;
- -webkit-transition-duration:.2s;
-}
-.claro .dijitCalendarNextYearHover,
-.claro .dijitCalendarPreviousYearHover {
- color:#000;
- border:solid 1px #fefefe;
- padding: 0px 5px 0px 5px;
- background-color:#eaf4fe;
-}
-.claro .dijitCalendarNextYearActive,
-.claro .dijitCalendarPreviousYearActive {
- border: solid 1px #87b3d9;
- padding: 0px 5px 0px 5px;
- background-color:#90bde6;
+ font-size: 1.091em;
+ color: #000000;
+}
+/* End Normal Calendar Style */
+/* Hovered Calendar Style */
+.claro .dijitCalendarHoveredDate .dijitCalendarDateLabel {
+ background-color: #abd6ff;
+ border: solid 1px #769dc0;
+ color: #000000;
+ -webkit-transition-duration: 0.2s;
+ -moz-transition-duration: 0.2s;
+ transition-duration: 0.2s;
+}
+.claro .dijitCalendarNextYearHover, .claro .dijitCalendarPreviousYearHover {
+ color: #000000;
+ border: solid 1px #ffffff;
+ padding: 0 5px 0 5px;
+ /* reduced by 1 to make room for border */
+
+ background-color: #e9f4fe;
+}
+/* End Hovered Calendar Style */
+/* Active Calendar Style */
+.claro .dijitCalendarNextYearActive, .claro .dijitCalendarPreviousYearActive {
+ border: solid 1px #769dc0;
+ padding: 0 5px 0 5px;
+ /* reduced by 1 to make room for border */
+
+ background-color: #cfe5fa;
}
.claro .dijitCalendarActiveDate .dijitCalendarDateLabel {
- background-image:url("images/calendarContainerImages.png");
- background-position:0px -300px;
- background-color:#75b5f0;
- border:solid 1px #fff;
- -webkit-transition-duration:.1s;
+ background-image: url("images/calendarContainerImages.png");
+ background-position: 0 -300px;
+ background-color: #7dbefa;
+ border: solid 1px #ffffff;
+ -webkit-transition-duration: 0.1s;
+ -moz-transition-duration: 0.1s;
+ transition-duration: 0.1s;
}
.dj_ie6 .claro .dijitCalendarActiveDate .dijitCalendarDateLabel {
- background-image:none;
+ background-image: none;
}
+/* End Active Calendar Style */
+/* Selected Calendar Style */
.claro .dijitCalendarSelectedDate .dijitCalendarDateLabel {
- color:#000;
- background-color:#e7f4ff;
- border-color:#accfed;
+ color: #000000;
+ background-color: #abd6ff;
+ border-color: #769dc0;
}
+/* End Selected Calendar Style */
+/* Disabled Calendar Style*/
.claro .dijitCalendarDisabledDate .dijitCalendarDateLabel {
- text-decoration:line-through;
-
-
- background-color: transparent;
- border-width: 0px;
- padding: 4px 6px 4px 5px;
- color: #547DA1;
-}
-.claro .dijitCalendarMonthContainer .dijitMenu{
-
- top: 20px !important;
- left: 0px;
- border-color: #769dc0;
- background-color: #fff;
- text-align:center;
- background-image: none;
-}
-.claro .dijitCalendarMonthContainer .dijitMenu .dijitCalendarMonthLabel{
- border-top: solid 1px #fff;
- border-bottom: solid 1px #fff;
- padding: 2px 20px;
-}
-.claro .dijitCalendarMonthContainer .dijitMenu .dijitMenuItemHover {
- background-color: #abd6ff;
- border-color: #769dc0;
- border-width:1px 0px;
- background-image: url("images/commonHighlight.png");
- background-repeat:repeat-x;
+ 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;
+}
+/* End Disabled Calendar Style */
+/* Styling for month DropDownButton */
+.claro .dijitCalendar .dijitDropDownButton {
+ margin: 0;
+}
+.claro .dijitCalendar .dijitButtonText {
+ padding: 1px 0 3px;
+ margin-right: -4px;
+}
+.claro .dijitCalendar .dijitDropDownButton .dijitButtonNode {
+ background-color: transparent;
+ background-image: none;
+ padding: 0 3px 0 2px;
+ border: solid 1px #b5bcc7;
+ -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ -moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+}
+.claro .dijitCalendar .dijitDropDownButtonHover .dijitButtonNode {
+ background-color: #e9f4fe;
+ border: solid 1px #ffffff;
+}
+/* Styling for month drop down list */
+.claro .dijitCalendarMonthMenu {
+ border-color: #769dc0;
+ background-color: #ffffff;
+ text-align: center;
+ background-image: none;
+}
+.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabel {
+ border-top: solid 1px #ffffff;
+ /* intentionally invisible until hover */
+
+ border-bottom: solid 1px #ffffff;
+ padding: 2px 0;
+}
+.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
+ background-color: #abd6ff;
+ border-color: #769dc0;
+ 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
new file mode 100644
index 000000000..ec6aa4696
--- /dev/null
+++ b/lib/dijit/themes/claro/Calendar.less
@@ -0,0 +1,273 @@
+/* Calendar
+ *
+ * Styling Calendar mainly includes:
+ *
+ * 1. Calendar container
+ * .dijitCalendar - main container
+ * .dijitCalendarHover / .dijitCalendarActive - states e.g. hover,active
+ *
+ * 2. Month
+ * .dijitCalendarMonthContainer
+ * .dijitCalendarMonthLabel
+ * .dijitCalendarDecrease / .dijitCalendarDecrease - icons for switching to previous/next month
+ * .dijitCalendarArrowActive .dijitCalendarDecrease - states e.g. hover,active
+ *
+ * 3. Date
+ * .dijitCalendarDayLabelTemplate - week day column header e.g. S M T W T F S
+ * .dijitCalendarDateTemplate - date label wrapper
+ * .dijitCalendarPreviousMonth .dijitCalendarDateLabel - special labels for previous or next month
+ * .dijitCalendarSelectedDate .dijitCalendarDateLabel - styles for selected date
+ * .dijitCalendarDisabledDate .dijitCalendarDateLabel - styles for disabled date
+ * .dijitCalendarActiveDate .dijitCalendarDateLabel - states e.g. hover,active
+ *
+ * 4. Year
+ * .dijitCalendarYearContainer
+ * .dijitCalendarYearLabel
+ * .dijitCalendarPreviousYear /.dijitCalendarNextYear
+ * .dijitCalendarNextYearHover / .dijitCalendarPreviousYearHover - states e.g. hover,active
+ *
+ * 5. Dropdown Month Menu
+ * .dijitCalendarMonthMenu - menu container
+ * .dijitCalendarMonthMenu .dijitCalendarMonthLabel - month label in menu item
+ * .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover - menu item hover state
+ */
+
+@import "variables";
+
+.claro .dijitCalendar {
+ border:solid 1px @border-color;
+ background-color: @calendar-background-color;
+ background-image:url("images/calendarContainerImages.png");
+ background-position:0 -448px;
+ background-repeat:repeat-x;
+ text-align:center;
+ padding:6px 5px 3px 5px;
+ .border-radius(4px);
+}
+.dj_ie6 .claro .dijitCalendar {
+ background-image:none;
+}
+.claro .dijitCalendar img {
+ border:none;
+}
+.claro .dijitCalendarHover,
+.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: @hovered-background-color;
+ border:solid 1px @hovered-border-color;
+}
+.claro .dijitCalendarMonthContainer th {
+ text-align:center;
+ padding-bottom:4px;
+ vertical-align:middle;
+}
+.claro .dijitCalendarMonthLabel {
+ color: @text-color;
+ font-size: 1.091em;
+ padding: 0 4px;
+}
+
+/* next/previous month arrows */
+.claro .dijitCalendarIncrementControl {
+ width:18px;
+ height:16px;
+ background-image: url("images/calendarArrows.png");
+ background-repeat: no-repeat;
+}
+.dj_ie6 .claro .dijitCalendarIncrementControl {
+ background-image: url("images/calendarArrows8bit.png");
+}
+.claro .dijitCalendarIncrease {
+ background-position:-18px 0;
+}
+.claro .dijitCalendarArrowHover .dijitCalendarDecrease {
+ background-position:-36px 0;
+}
+.claro .dijitCalendarArrowHover .dijitCalendarIncrease {
+ background-position:-55px 0;
+}
+.claro .dijitCalendarArrowActive .dijitCalendarDecrease {
+ background-position:-72px 0;
+}
+.claro .dijitCalendarArrowActive .dijitCalendarIncrease {
+ background-position:-91px 0;
+}
+.claro .dijitA11ySideArrow {
+ /* text +/- labels instead of arrow icons, for high contrast mode */
+ 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 .dijitCalendarDateTemplate {
+ text-align:center;
+ background-color:@calendar-currentmonth-background-color;
+ background-image:url("images/calendarContainerImages.png");
+ background-position:0 0;
+ background-repeat:repeat-x;
+ border-bottom: 1px solid @minor-border-color;
+ padding-top:0;
+ font-size:0.909em;
+ font-family: Arial;
+ font-weight:bold;
+ letter-spacing:.05em;
+ text-align:center;
+}
+.dj_ie6 .claro .dijitCalendarDateTemplate {
+ background-image: none;
+}
+.claro .dijitCalendarPreviousMonth,
+.claro .dijitCalendarNextMonth {
+ background-color: @calendar-adjacentmonth-background-color;
+ background-image:none;
+ border-bottom:solid 1px @minor-border-color; /* todo: redundant with above .dijitCalendarDateTemplate rule */
+}
+.claro .dijitCalendarDateTemplate .dijitCalendarDateLabel {
+ text-decoration:none;
+ display:block;
+ padding:3px 5px 3px 4px;
+ border:solid 1px @calendar-currentmonth-background-color; /* intentionally matches background-color, no visible border until hover/selection */
+ background-color:rgba(171,212,251,0); /* transparent causes black-flash animation problem on webkit */
+ .transition-property(background-color, border);
+ .transition-duration(.35s);
+}
+.claro .dijitCalendarPreviousMonth .dijitCalendarDateLabel,
+.claro .dijitCalendarNextMonth .dijitCalendarDateLabel{
+ color: @calendar-adjacentmonth-text-color;
+ border-color: @calendar-adjacentmonth-background-color; /* intentionally matches background-color, no visible border until hover/selection */
+}
+
+.claro .dijitCalendarYearContainer {
+ vertical-align:middle;
+}
+.claro .dijitCalendarYearControl {
+ padding: 1px 2px 2px 2px;
+}
+.claro .dijitCalendarYearLabel {
+ padding:2px 0 0 0;
+ margin:0;
+}
+.claro .dijitCalendarYearLabel span {
+ /* trying to center next/current/previous year vertically, doesn't work on IE6/7 though */
+ vertical-align:middle;
+}
+.claro .dijitCalendarSelectedYear {
+ padding:0 3px;
+}
+.claro .dijitCalendarNextYear,
+.claro .dijitCalendarPreviousYear {
+ padding: 1px 6px 1px 6px;
+ font-size:0.909em;
+}
+.claro .dijitCalendarSelectedYear {
+ font-size:1.091em;
+ color:@selected-text-color;
+}
+/* End Normal Calendar Style */
+/* Hovered Calendar Style */
+.claro .dijitCalendarHoveredDate .dijitCalendarDateLabel{
+ background-color:@hovered-background-color;
+ border:solid 1px @hovered-border-color;
+ color:@hovered-text-color;
+ .transition-duration(.2s);
+}
+.claro .dijitCalendarNextYearHover,
+.claro .dijitCalendarPreviousYearHover {
+ 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 */
+ background-color: @calendar-button-hovered-background-color;
+}
+/* End Hovered Calendar Style */
+/* Active Calendar Style */
+.claro .dijitCalendarNextYearActive,
+.claro .dijitCalendarPreviousYearActive {
+ 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");
+ background-position:0 -300px;
+ background-color: @calendar-date-pressed-background-color;
+ border:solid 1px @calendar-date-pressed-border-color;
+ .transition-duration(.1s);
+}
+.dj_ie6 .claro .dijitCalendarActiveDate .dijitCalendarDateLabel {
+ background-image:none;
+}
+/* End Active Calendar Style */
+/* Selected Calendar Style */
+.claro .dijitCalendarSelectedDate .dijitCalendarDateLabel {
+ color:@selected-text-color;
+ background-color: @calendar-date-selected-background-color;
+ border-color: @calendar-date-selected-border-color;
+}
+/* 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;
+}
+
+/* End Disabled Calendar Style */
+
+/* Styling for month DropDownButton */
+
+.claro .dijitCalendar .dijitDropDownButton {
+ margin: 0;
+}
+.claro .dijitCalendar .dijitButtonText {
+ padding: 1px 0 3px;
+ margin-right:-4px;
+}
+.claro .dijitCalendar .dijitDropDownButton .dijitButtonNode {
+ background-color: transparent;
+ background-image: none;
+ padding: 0 3px 0 2px;
+ border:solid 1px @border-color;
+ .box-shadow(0 0 0 rgba(0,0,0,0));
+}
+.claro .dijitCalendar .dijitDropDownButtonHover .dijitButtonNode {
+ background-color: @calendar-button-hovered-background-color;
+ border:solid 1px @calendar-button-hovered-border-color;
+}
+
+/* Styling for month drop down list */
+
+.claro .dijitCalendarMonthMenu {
+ border-color: @popup-border-color;
+ background-color: @menu-background-color;
+ text-align:center;
+ background-image: none;
+}
+.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabel {
+ border-top: solid 1px @menu-background-color; /* intentionally invisible until hover */
+ border-bottom: solid 1px @menu-background-color;
+ padding: 2px 0;
+}
+.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
+ background-color: @hovered-background-color;
+ border-color: @hovered-border-color;
+ border-width:1px 0;
+ background-image: url("images/commonHighlight.png");
+ background-repeat:repeat-x;
+}
diff --git a/lib/dijit/themes/claro/Calendar_rtl.css b/lib/dijit/themes/claro/Calendar_rtl.css
index 0f35d60ef..5892a64bf 100644
--- a/lib/dijit/themes/claro/Calendar_rtl.css
+++ b/lib/dijit/themes/claro/Calendar_rtl.css
@@ -1,18 +1,18 @@
-.claro .dijitCalendarRtl .dijitCalendarIncrease{
- background-position: 0px 0px;
+.claro .dijitCalendarRtl .dijitCalendarIncrease {
+ background-position: 0 0;
}
.claro .dijitCalendarRtl .dijitCalendarDecrease {
- background-position: -18px 0px;
+ background-position: -18px 0;
}
.claro .dijitCalendarRtl .dijitCalendarArrowHover .dijitCalendarIncrease {
- background-position: -36px 0px;
+ background-position: -36px 0;
}
.claro .dijitCalendarRtl .dijitCalendarArrowHover .dijitCalendarDecrease {
- background-position: -55px 0px;
+ background-position: -55px 0;
}
.claro .dijitCalendarRtl .dijitCalendarArrowActive .dijitCalendarIncrease {
- background-position: -72px 0px;
+ background-position: -72px 0;
}
.claro .dijitCalendarRtl .dijitCalendarArrowActive .dijitCalendarDecrease {
- background-position: -91px 0px;
+ background-position: -91px 0;
}
diff --git a/lib/dijit/themes/claro/Calendar_rtl.less b/lib/dijit/themes/claro/Calendar_rtl.less
new file mode 100644
index 000000000..713717bd7
--- /dev/null
+++ b/lib/dijit/themes/claro/Calendar_rtl.less
@@ -0,0 +1,19 @@
+.claro .dijitCalendarRtl .dijitCalendarIncrease{
+ background-position: 0 0;
+}
+.claro .dijitCalendarRtl .dijitCalendarDecrease {
+ background-position: -18px 0;
+}
+.claro .dijitCalendarRtl .dijitCalendarArrowHover .dijitCalendarIncrease {
+ background-position: -36px 0;
+}
+.claro .dijitCalendarRtl .dijitCalendarArrowHover .dijitCalendarDecrease {
+ background-position: -55px 0;
+}
+.claro .dijitCalendarRtl .dijitCalendarArrowActive .dijitCalendarIncrease {
+ background-position: -72px 0;
+}
+.claro .dijitCalendarRtl .dijitCalendarArrowActive .dijitCalendarDecrease {
+ background-position: -91px 0;
+}
+
diff --git a/lib/dijit/themes/claro/ColorPalette.css b/lib/dijit/themes/claro/ColorPalette.css
index 87a25ae25..34d1c72b2 100644
--- a/lib/dijit/themes/claro/ColorPalette.css
+++ b/lib/dijit/themes/claro/ColorPalette.css
@@ -1,18 +1,41 @@
-
+/* ColorPalette
+ *
+ * Styling of the ColorPalette consists of the following:
+ *
+ * 1. the whole color palette
+ * .dijitColorPalette - for outline, border, and background color of the whole color palette
+ * Note: outline does not work for IE
+ *
+ * 2. the color swatch
+ * .dijitColorPalette .dijitPaletteImg
+ * transparent (but clickable) <img> node inside of each <td>, overlaying the color swatch.
+ * displays border around a color swatch
+ *
+ * 3. hovered swatch
+ * .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg
+ * the hovered state of the color swatch - adds border
+ *
+ * 4. active and selected swatch
+ * .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg
+ * .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg
+ * adds border for active or selected state
+ */
.claro .dijitColorPalette {
- outline: 1px solid #769dc0;
- border: 1px solid #c0ccdf;
- background:#fff;
- -moz-border-radius: 0px;
+ border: 1px solid #b5bcc7;
+ background: #ffffff;
+ -moz-border-radius: 0;
+ border-radius: 0;
}
.claro .dijitColorPalette .dijitPaletteImg {
-
- border: 1px solid #cecece;
+ /* transparent (but clickable) <img> node inside of each <td>, overlaying the color swatch.
+ * displays border around a color swatch
+ * overrides border color in dijit.css */
+
+ border: 1px solid #d3d3d3;
}
.claro .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
- border: 1px solid #000;
+ border: 1px solid #000000;
}
-.claro .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
-.claro .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
- border: 2px solid #000;
+.claro .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg, .claro .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
+ border: 2px solid #000000;
}
diff --git a/lib/dijit/themes/claro/ColorPalette.less b/lib/dijit/themes/claro/ColorPalette.less
new file mode 100644
index 000000000..e0327334d
--- /dev/null
+++ b/lib/dijit/themes/claro/ColorPalette.less
@@ -0,0 +1,44 @@
+/* ColorPalette
+ *
+ * Styling of the ColorPalette consists of the following:
+ *
+ * 1. the whole color palette
+ * .dijitColorPalette - for outline, border, and background color of the whole color palette
+ * Note: outline does not work for IE
+ *
+ * 2. the color swatch
+ * .dijitColorPalette .dijitPaletteImg
+ * transparent (but clickable) <img> node inside of each <td>, overlaying the color swatch.
+ * displays border around a color swatch
+ *
+ * 3. hovered swatch
+ * .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg
+ * the hovered state of the color swatch - adds border
+ *
+ * 4. active and selected swatch
+ * .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg
+ * .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg
+ * adds border for active or selected state
+ */
+
+@import "variables";
+
+.claro .dijitColorPalette {
+ border: 1px solid @border-color;
+ background: @colorpalette-background-color;
+ .border-radius(0);
+}
+
+.claro .dijitColorPalette .dijitPaletteImg {
+ /* transparent (but clickable) <img> node inside of each <td>, overlaying the color swatch.
+ * displays border around a color swatch
+ * overrides border color in dijit.css */
+ border: 1px solid @minor-border-color;
+}
+.claro .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
+ border: 1px solid @swatch-hovered-border-color;
+}
+.claro .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
+.claro .dijitColorPalette .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 dd68ce14c..110b303e2 100644
--- a/lib/dijit/themes/claro/Common.css
+++ b/lib/dijit/themes/claro/Common.css
@@ -1,70 +1,75 @@
-
+/* ========= Styling rules to affect widgets ========= */
.claro .dijitPopup {
- box-shadow: 0px 1px 5px rgba(0,0,0,0.25);
- -webkit-box-shadow: 0px 1px 5px rgba(0,0,0,0.25);
- -moz-box-shadow: 0px 1px 5px rgba(0,0,0,0.25);
+ -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 .dijitTooltipDialogPopup {
-
- box-shadow: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
+ /* exception popups: do not use a shadow on these because they aren't rectangular */
+
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
}
+/* The highlight is shown in the ComboBox menu. TODO: move to form/Common.less */
.claro .dijitComboBoxHighlightMatch {
- background-color:#a5beda;
+ background-color: #abd6ff;
}
.claro .dijitFocusedLabel {
-
- outline: 1px dotted #666666;
+ /* 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;
+ 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;
- no-repeat left center;
- padding-left:25px;
+ background: url('../../icons/images/commonIconsObjActEnabled.png') no-repeat left center;
+ background-position: -496px;
+ padding-left: 25px;
}
-.claro .dojoDndItemBefore,
-.claro .dojoDndItemAfter{
- border-top: 1px solid #769DC0;
+/* Drag and Drop */
+.claro .dojoDndItemBefore, .claro .dojoDndItemAfter {
+ border-top: 1px solid #769dc0;
}
.claro .dojoDndItemOver {
- cursor:pointer;
- }
+ cursor: pointer;
+}
.claro table.dojoDndAvatar {
- border: 1px solid #b5bcc7;
- border-collapse: collapse;
- background-color: #fff;
- -webkit-box-shadow:0px 1px 3px rgba(0, 0, 0, .25);
+ border: 1px solid #b5bcc7;
+ border-collapse: collapse;
+ background-color: #ffffff;
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
}
-.claro .dojoDndAvatarHeader td {
- height: 20px;
- padding-left:21px;
+.claro .dojoDndAvatarHeader td {
+ height: 20px;
+ padding-left: 21px;
}
.claro.dojoDndMove .dojoDndAvatarHeader, .claro.dojoDndCopy .dojoDndAvatarHeader {
- background-image: url(images/dnd.png);
- background-repeat: no-repeat;
- background-position:2px -122px;
+ background-image: url(images/dnd.png);
+ background-repeat: no-repeat;
+ background-position: 2px -122px;
}
.claro .dojoDndAvatarItem td {
- padding: 5px;
+ padding: 5px;
}
-.claro.dojoDndMove .dojoDndAvatarHeader {
- background-color: #f58383;
- background-position:2px -103px;
+.claro.dojoDndMove .dojoDndAvatarHeader {
+ background-color: #f58383;
+ background-position: 2px -103px;
}
-.claro.dojoDndCopy .dojoDndAvatarHeader {
- background-color: #f58383;
- background-position:2px -68px;
+.claro.dojoDndCopy .dojoDndAvatarHeader {
+ background-color: #f58383;
+ background-position: 2px -68px;
}
-.claro.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader {
- background-color: #97e68d;
- background-position:2px -33px;
+.claro.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader {
+ background-color: #97e68d;
+ background-position: 2px -33px;
}
-.claro.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader {
- background-color: #97e68d;
- background-position:2px 2px;
+.claro.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader {
+ background-color: #97e68d;
+ background-position: 2px 2px;
}
diff --git a/lib/dijit/themes/claro/Common.less b/lib/dijit/themes/claro/Common.less
new file mode 100644
index 000000000..872cf8913
--- /dev/null
+++ b/lib/dijit/themes/claro/Common.less
@@ -0,0 +1,76 @@
+/* ========= Styling rules to affect widgets ========= */
+
+@import "variables";
+
+.claro .dijitPopup {
+ .box-shadow(0 1px 5px rgba(0,0,0,0.25));
+}
+.claro .dijitTooltipDialogPopup {
+ /* exception popups: do not use a shadow on these because they aren't rectangular */
+ .box-shadow(none);
+}
+
+/* The highlight is shown in the ComboBox menu. TODO: move to form/Common.less */
+.claro .dijitComboBoxHighlightMatch {
+ background-color: @select-matchedtext-background-color;
+}
+
+.claro .dijitFocusedLabel {
+ /* for checkboxes or radio buttons, hatch border around the corresponding label, to indicate focus */
+ 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{
+ border-top: 1px solid @dnd-dropseparator-color;
+}
+.claro .dojoDndItemOver {
+ cursor:pointer;
+ }
+.claro table.dojoDndAvatar {
+ border: 1px solid @border-color;
+ border-collapse: collapse;
+ background-color: @dnd-avatar-background-color;
+ .box-shadow(0 1px 3px rgba(0, 0, 0, .25));
+}
+.claro .dojoDndAvatarHeader td {
+ height: 20px;
+ padding-left:21px;
+}
+.claro.dojoDndMove .dojoDndAvatarHeader, .claro.dojoDndCopy .dojoDndAvatarHeader {
+ background-image: url(images/dnd.png);
+ background-repeat: no-repeat;
+ background-position:2px -122px;
+}
+.claro .dojoDndAvatarItem td {
+ padding: 5px;
+}
+.claro.dojoDndMove .dojoDndAvatarHeader {
+ background-color: @dnd-avatar-header-background-color;
+ background-position:2px -103px;
+}
+.claro.dojoDndCopy .dojoDndAvatarHeader {
+ background-color: @dnd-avatar-header-background-color;
+ background-position:2px -68px;
+}
+.claro.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader {
+ background-color: @dnd-avatar-candrop-header-background-color;
+ background-position:2px -33px;
+}
+.claro.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader {
+ background-color: @dnd-avatar-candrop-header-background-color;
+ background-position:2px 2px;
+}
diff --git a/lib/dijit/themes/claro/Dialog.css b/lib/dijit/themes/claro/Dialog.css
index 10b513485..119900eca 100644
--- a/lib/dijit/themes/claro/Dialog.css
+++ b/lib/dijit/themes/claro/Dialog.css
@@ -1,162 +1,203 @@
-
+/* Dialog
+ *
+ * Styling Dialog includes two sections: Dialog and Tooltip & TooltipDialog
+ *
+ * Dialog:
+ * 1. Dialog (default styling):
+ * .dijitDialog - styles for dialog's bounding box
+ *
+ * 2. Dialog title
+ * .dijitDialogTitleBar - styles for the title container at the top of dialog
+ * .dijitDialogTitle - the text container in dialog title
+ *
+ * 3. Dialog content
+ * .dijitDialogPaneContent - main container for content area and action bar
+ * .dijitDialogPaneContentArea - styles for content container
+ *
+ * 4. Dialog action bar
+ * .dijitDialogPaneActionBar - styles for action buttons lie at the bottom of dialog pane content
+ *
+ * 5. Dialog underlay
+ * .dijitDialogUnderlay - div under the dialog which used for separate dialog and page content
+ *
+ *
+ * Tooltip & TooltipDialog:
+ * 1. tooltip content container:
+ * .dijitTooltipContainer - tooltip content container
+ *
+ * 2. tooltip connector:
+ * .dijitTooltipConnector - tooltip anchor includes 4 direction(up, down, left, right)
+ */
.claro .dijitDialog {
- border: 1px solid #769dc0;
- box-shadow:0px 1px 5px rgba(0,0,0,0.25);
- -webkit-box-shadow:0px 1px 5px rgba(0,0,0,0.25);
- -moz-box-shadow: 0px 1px 5px rgba(0,0,0,0.25);
-}
+ border: 1px solid #769dc0;
+ -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: #fff repeat-x top left;
- border-top: 1px solid #769dc0;
- padding:10px 8px;
- position: relative;
+ background: #ffffff repeat-x top left;
+ border-top: 1px solid #769dc0;
+ padding: 10px 8px;
+ position: relative;
}
.claro .dijitDialogPaneContentArea {
-
- margin: -10px -8px;
- padding: 10px 8px;
+ /* trick to get action bar (gray bar at bottom with OK/cancel buttons) to span from
+ * left to right but still indent dialog content
+ */
+ margin: -10px -8px;
+ padding: 10px 8px;
}
.claro .dijitDialogPaneActionBar {
-
- background-color: #f2f2f2;
- padding: 3px 5px 2px 7px;
- text-align: right;
- border-top: 1px solid #cdcdcd;
- margin: 10px -8px -10px;
+ /* gray bar at bottom of dialog with OK/Cancel buttons */
+
+ background-color: #efefef;
+ padding: 3px 5px 2px 7px;
+ text-align: right;
+ border-top: 1px solid #d3d3d3;
+ margin: 10px -8px -10px;
}
.claro .dijitDialogPaneActionBar .dijitButton {
- float: none;
+ float: none;
}
.claro .dijitDialogTitleBar {
-
- border: 1px solid #fff;
- border-top:none;
- background-color: #abd6ff;
- background-image: url("images/titlebar.png");
- background-repeat:repeat-x;
- padding: 5px 7px 4px 7px;
+ /* outer container for the titlebar of the dialog */
+
+ border: 1px solid #ffffff;
+ border-top: none;
+ background-color: #abd6ff;
+ background-image: url("images/titlebar.png");
+ background-repeat: repeat-x;
+ padding: 5px 7px 4px 7px;
}
.claro .dijitDialogTitle {
-
- padding: 0px 1px;
- font-size:1.091em;
+ /* typography and styling of the dialog title */
+
+ padding: 0 1px;
+ font-size: 1.091em;
}
.claro .dijitDialogCloseIcon {
-
- background: url("images/dialogCloseIcon.png");
- background-repeat:no-repeat;
- position: absolute;
- right: 5px;
- height: 15px;
- width: 21px;
+ /* the default close icon for the dialog */
+
+ background: url("images/dialogCloseIcon.png");
+ background-repeat: no-repeat;
+ position: absolute;
+ right: 5px;
+ height: 15px;
+ width: 21px;
}
.dj_ie6 .claro .dijitDialogCloseIcon {
- background-image: url("images/dialogCloseIcon8bit.png");
+ background-image: url("images/dialogCloseIcon8bit.png");
}
.claro .dijitDialogCloseIconHover {
- background-position:-21px;
+ background-position: -21px;
}
.claro .dijitDialogCloseIconActive {
- background-position:-42px;
+ background-position: -42px;
}
-.claro .dijitTooltip,
-.claro .dijitTooltipDialog {
-
- background: transparent;
+/* Tooltip and TooltipDialog */
+.claro .dijitTooltip, .claro .dijitTooltipDialog {
+ /* the outermost dom node, holding the connector and container */
+
+ background: transparent;
+ /* make the area on the sides of the arrow transparent */
+
}
.dijitTooltipBelow {
-
- padding-top: 13px;
- padding-left:3px;
- padding-right:3px;
+ /* leave room for arrow above content */
+
+ padding-top: 13px;
+ padding-left: 3px;
+ padding-right: 3px;
}
.dijitTooltipAbove {
-
- padding-bottom: 13px;
- padding-left:3px;
- padding-right:3px;
+ /* leave room for arrow below content */
+
+ padding-bottom: 13px;
+ padding-left: 3px;
+ padding-right: 3px;
}
.claro .dijitTooltipContainer {
-
- background-color:#fff;
- background-image:url("images/tooltip.png");
- background-repeat:repeat-x;
- background-position:-575px 100%;
- border:1px solid #769DC0;
- padding:6px 8px;
- border-radius: 4px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- box-shadow:0px 1px 3px rgba(0,0,0,0.25);
- -webkit-box-shadow:0px 1px 3px rgba(0,0,0,0.25);
- -moz-box-shadow: 0px 1px 3px rgba(0,0,0,0.25);
- font-size: 1em;
-}
+ /* the part with the text */
+
+ background-color: #ffffff;
+ background-image: url("images/tooltipGradient.png");
+ background-repeat: repeat-x;
+ background-position: bottom;
+ border: 1px solid #769dc0;
+ padding: 6px 8px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
+ -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;
+}
.dj_ie6 .claro .dijitTooltipContainer {
- background-image: none;
+ background-image: none;
}
.claro .dijitTooltipConnector {
-
- border: 0px;
- z-index: 2;
- background-image:url("images/tooltip.png");
- background-repeat:no-repeat;
- width:16px;
- height:14px;
+ /* the arrow piece */
+
+ border: 0;
+ z-index: 2;
+ background-image: url("images/tooltip.png");
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 14px;
}
.dj_ie6 .claro .dijitTooltipConnector {
- background-image:url("images/tooltip8bit.png");
+ background-image: url("images/tooltip8bit.png");
}
.claro .dijitTooltipABRight .dijitTooltipConnector {
-
- left: auto !important;
- right: 3px;
+ /* above or below tooltip, but the arrow appears on the right,
+ and the right edges of target and tooltip are aligned rather than the left */
+
+ left: auto !important;
+ right: 3px;
}
.claro .dijitTooltipBelow .dijitTooltipConnector {
-
- top: 0px;
- left: 3px;
- background-position:-31px 0%;
- width:16px;
- height:14px;
+ /* the arrow piece for tooltips below an element */
+
+ top: 0;
+ left: 3px;
+ background-position: -31px 0;
+ width: 16px;
+ height: 14px;
}
.claro .dijitTooltipAbove .dijitTooltipConnector {
-
- bottom: 0px;
- left: 3px;
- background-position:-15px 0%;
- width:16px;
- height:14px;
+ /* the arrow piece for tooltips above an element */
+
+ bottom: 0;
+ left: 3px;
+ background-position: -15px 0;
+ width: 16px;
+ height: 14px;
}
-.dj_ie7 .claro .dijitTooltipAbove .dijitTooltipConnector,
-.dj_ie6 .claro .dijitTooltipAbove .dijitTooltipConnector {
- bottom: -1px;
+.dj_ie7 .claro .dijitTooltipAbove .dijitTooltipConnector, .dj_ie6 .claro .dijitTooltipAbove .dijitTooltipConnector {
+ bottom: -1px;
}
.claro .dijitTooltipLeft {
- padding-right: 14px;
-}
-.dj_ie6 .claro .dijitTooltipLeft {
- padding-left: 15px;
+ padding-right: 14px;
}
.claro .dijitTooltipLeft .dijitTooltipConnector {
-
- right: 0px;
- bottom: 3px;
- background-position:0px 0%;
- width:16px;
- height:14px;
+ /* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+
+ right: 0;
+ background-position: 0 0;
+ width: 16px;
+ height: 14px;
}
.claro .dijitTooltipRight {
- padding-left: 14px;
+ padding-left: 14px;
}
.claro .dijitTooltipRight .dijitTooltipConnector {
-
- left: 0px;
- bottom: 3px;
- background-position:-48px 0%;
- width:16px;
- height:14px;
+ /* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+
+ left: 0;
+ background-position: -48px 0;
+ width: 16px;
+ height: 14px;
}
.claro .dijitDialogUnderlay {
- background: #fff;
+ background: #ffffff;
}
diff --git a/lib/dijit/themes/claro/Dialog.less b/lib/dijit/themes/claro/Dialog.less
new file mode 100644
index 000000000..ff5c1e656
--- /dev/null
+++ b/lib/dijit/themes/claro/Dialog.less
@@ -0,0 +1,203 @@
+/* Dialog
+ *
+ * Styling Dialog includes two sections: Dialog and Tooltip & TooltipDialog
+ *
+ * Dialog:
+ * 1. Dialog (default styling):
+ * .dijitDialog - styles for dialog's bounding box
+ *
+ * 2. Dialog title
+ * .dijitDialogTitleBar - styles for the title container at the top of dialog
+ * .dijitDialogTitle - the text container in dialog title
+ *
+ * 3. Dialog content
+ * .dijitDialogPaneContent - main container for content area and action bar
+ * .dijitDialogPaneContentArea - styles for content container
+ *
+ * 4. Dialog action bar
+ * .dijitDialogPaneActionBar - styles for action buttons lie at the bottom of dialog pane content
+ *
+ * 5. Dialog underlay
+ * .dijitDialogUnderlay - div under the dialog which used for separate dialog and page content
+ *
+ *
+ * Tooltip & TooltipDialog:
+ * 1. tooltip content container:
+ * .dijitTooltipContainer - tooltip content container
+ *
+ * 2. tooltip connector:
+ * .dijitTooltipConnector - tooltip anchor includes 4 direction(up, down, left, right)
+ */
+
+@import "variables";
+
+.claro .dijitDialog {
+ border: 1px solid @popup-border-color;
+ .box-shadow(0 1px 5px rgba(0,0,0,0.25));
+}
+
+.claro .dijitDialogPaneContent {
+ background: @pane-background-color repeat-x top left;
+ border-top: 1px solid @popup-border-color;
+ padding:10px 8px;
+ position: relative;
+}
+
+.claro .dijitDialogPaneContentArea {
+ /* trick to get action bar (gray bar at bottom with OK/cancel buttons) to span from
+ * left to right but still indent dialog content
+ */
+ margin: -10px -8px;
+ padding: 10px 8px;
+}
+
+.claro .dijitDialogPaneActionBar {
+ /* gray bar at bottom of dialog with OK/Cancel buttons */
+ background-color: @bar-background-color;
+ padding: 3px 5px 2px 7px;
+ text-align: right;
+ border-top: 1px solid @minor-border-color;
+ margin: 10px -8px -10px;
+}
+.claro .dijitDialogPaneActionBar .dijitButton {
+ float: none;
+}
+
+.claro .dijitDialogTitleBar {
+ /* outer container for the titlebar of the dialog */
+ border: 1px solid @dialog-titlebar-border-color;
+ border-top:none;
+ background-color: @dialog-titlebar-background-color;
+ background-image: url("images/titlebar.png");
+ background-repeat:repeat-x;
+ padding: 5px 7px 4px 7px;
+}
+
+.claro .dijitDialogTitle {
+ /* typography and styling of the dialog title */
+ padding: 0 1px;
+ font-size:1.091em;
+}
+
+.claro .dijitDialogCloseIcon {
+ /* the default close icon for the dialog */
+ background: url("images/dialogCloseIcon.png");
+ background-repeat:no-repeat;
+ position: absolute;
+ right: 5px;
+ height: 15px;
+ width: 21px;
+}
+.dj_ie6 .claro .dijitDialogCloseIcon {
+ background-image: url("images/dialogCloseIcon8bit.png");
+}
+.claro .dijitDialogCloseIconHover {
+ background-position:-21px;
+}
+.claro .dijitDialogCloseIconActive {
+ background-position:-42px;
+}
+
+/* Tooltip and TooltipDialog */
+
+.claro .dijitTooltip,
+.claro .dijitTooltipDialog {
+ /* the outermost dom node, holding the connector and container */
+ background: transparent; /* make the area on the sides of the arrow transparent */
+}
+.dijitTooltipBelow {
+ /* leave room for arrow above content */
+ padding-top: 13px;
+ padding-left:3px;
+ padding-right:3px;
+}
+
+.dijitTooltipAbove {
+ /* leave room for arrow below content */
+ padding-bottom: 13px;
+ padding-left:3px;
+ padding-right:3px;
+}
+
+.claro .dijitTooltipContainer {
+ /* the part with the text */
+ background-color:@popup-background-color;
+ background-image:url("images/tooltipGradient.png");
+ background-repeat:repeat-x;
+ background-position:bottom;
+ border:1px solid @popup-border-color;
+ padding:6px 8px;
+ .border-radius(4px);
+ .box-shadow(0 1px 3px rgba(0,0,0,0.25));
+ font-size: 1em;
+}
+
+.dj_ie6 .claro .dijitTooltipContainer {
+ background-image: none;
+}
+.claro .dijitTooltipConnector {
+ /* the arrow piece */
+ border: 0;
+ z-index: 2;
+ background-image:url("images/tooltip.png");
+ background-repeat:no-repeat;
+ width:16px;
+ height:14px;
+}
+.dj_ie6 .claro .dijitTooltipConnector {
+ background-image:url("images/tooltip8bit.png");
+}
+.claro .dijitTooltipABRight .dijitTooltipConnector {
+ /* above or below tooltip, but the arrow appears on the right,
+ and the right edges of target and tooltip are aligned rather than the left */
+ left: auto !important;
+ right: 3px;
+}
+
+.claro .dijitTooltipBelow .dijitTooltipConnector {
+ /* the arrow piece for tooltips below an element */
+ top: 0;
+ left: 3px;
+ background-position:-31px 0;
+ width:16px;
+ height:14px;
+}
+
+.claro .dijitTooltipAbove .dijitTooltipConnector {
+ /* the arrow piece for tooltips above an element */
+ bottom: 0;
+ left: 3px;
+ background-position:-15px 0;
+ width:16px;
+ height:14px;
+}
+.dj_ie7 .claro .dijitTooltipAbove .dijitTooltipConnector,
+.dj_ie6 .claro .dijitTooltipAbove .dijitTooltipConnector {
+ bottom: -1px;
+}
+
+.claro .dijitTooltipLeft {
+ padding-right: 14px;
+}
+.claro .dijitTooltipLeft .dijitTooltipConnector {
+ /* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+ right: 0;
+ background-position:0 0;
+ width:16px;
+ height:14px;
+}
+
+.claro .dijitTooltipRight {
+ padding-left: 14px;
+}
+.claro .dijitTooltipRight .dijitTooltipConnector {
+ /* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+ left: 0;
+ background-position:-48px 0;
+ width:16px;
+ height:14px;
+}
+
+.claro .dijitDialogUnderlay {
+ background: @dialog-underlay-color;
+}
diff --git a/lib/dijit/themes/claro/Dialog_rtl.css b/lib/dijit/themes/claro/Dialog_rtl.css
index 7bb72e75a..34930eb64 100644
--- a/lib/dijit/themes/claro/Dialog_rtl.css
+++ b/lib/dijit/themes/claro/Dialog_rtl.css
@@ -1,9 +1,9 @@
-
+/* Dialog */
.claro .dijitDialogRtl .dijitDialogCloseIcon {
- right: auto;
- left: 5px;
+ right: auto;
+ left: 5px;
}
.claro .dijitDialogRtl .dijitDialogPaneActionBar {
- text-align: left;
- padding: 3px 7px 2px 5px;
+ text-align: left;
+ padding: 3px 7px 2px 5px;
}
diff --git a/lib/dijit/themes/claro/Dialog_rtl.less b/lib/dijit/themes/claro/Dialog_rtl.less
new file mode 100644
index 000000000..452fe930b
--- /dev/null
+++ b/lib/dijit/themes/claro/Dialog_rtl.less
@@ -0,0 +1,13 @@
+/* Dialog */
+
+@import "variables";
+
+.claro .dijitDialogRtl .dijitDialogCloseIcon {
+ right: auto;
+ left: 5px;
+}
+
+.claro .dijitDialogRtl .dijitDialogPaneActionBar {
+ text-align: left;
+ padding: 3px 7px 2px 5px;
+}
diff --git a/lib/dijit/themes/claro/Editor.css b/lib/dijit/themes/claro/Editor.css
index b9af7e798..641990a09 100644
--- a/lib/dijit/themes/claro/Editor.css
+++ b/lib/dijit/themes/claro/Editor.css
@@ -1,36 +1,50 @@
-
-.claro .dijitEditorIFrameContainer{
- padding:3px 3px 1px 10px;
+/* Editor
+ *
+ * Styling Editor means styling the Editor inside iframe container (dijitEditorIFrameContainer)
+ *
+ * 1. Editor iframe container (default styling):
+ * .dijitEditorIFrameContainer - normal state styles: background-color, border, padding
+ *
+ * 2. hovered Editor iframe container (ie, mouse hover on editor)
+ * .dijitEditorHover .dijitEditorIFrameContainer/dijitEditorIFrame - styles when mouse hover on the container
+ *
+ * 3. focused Editor iframe container (ie, mouse focus on the editor pane)
+ * .dijitEditorFocused .dijitEditorIFrameContainer/dijitEditorIFrame - styles when container focused
+ *
+ * 3. disabled Editor iframe container
+ * .dijitEditorDisabled - editor's inner iframe container disable status styles: background, border
+ */
+.claro .dijitEditorIFrameContainer {
+ padding: 3px 3px 1px 10px;
}
.claro .dijitEditorIFrame {
- background-color: #fff;
+ background-color: #ffffff;
}
.claro .dijitEditor {
- border: 1px solid #b5bcc7;
+ border: 1px solid #b5bcc7;
}
-.claro .dijitEditor .dijitEditorIFrameContainer{
- background-color: #fff;
- background-image: url('form/images/textBox_back.png');
- background-repeat:repeat-x;
+.claro .dijitEditor .dijitEditorIFrameContainer {
+ background-color: #ffffff;
+ background-image: url('form/images/textBox_back.png');
+ background-repeat: repeat-x;
}
-.dj_ie6 .claro .dijitEditor .dijitEditorIFrameContainer{
- background-image: none;
+.dj_ie6 .claro .dijitEditor .dijitEditorIFrameContainer {
+ background-image: none;
}
-.claro .dijitEditorHover .dijitEditorIFrameContainer,
-.claro .dijitEditorHover .dijitEditorIFrameContainer .dijitEditorIFrame{
- background-color: #eef7ff;
+.claro .dijitEditorHover .dijitEditorIFrameContainer, .claro .dijitEditorHover .dijitEditorIFrameContainer .dijitEditorIFrame {
+ background-color: #e9f4fe;
}
-.claro .dijitEditorFocused .dijitEditorIFrameContainer,
-.claro .dijitEditorFocused .dijitEditorIFrameContainer .dijitEditorIFrame{
-
- background-color: #fff;
+.claro .dijitEditorFocused .dijitEditorIFrameContainer, .claro .dijitEditorFocused .dijitEditorIFrameContainer .dijitEditorIFrame {
+ /* TODO: contradicts rule above, which background-color do you want? */
+
+ background-color: #ffffff;
}
+/* Disabled */
.claro .dijitEditorDisabled {
- border: 1px solid #d3d3d3;
- color: #818181;
+ border: 1px solid #d3d3d3;
+ color: #818181;
}
-.claro .dijitDisabled .dijitEditorIFrame,
-.claro .dijitDisabled .dijitEditorIFrameContainer {
- background-color: #efefef;
- background-image: none;
+.claro .dijitDisabled .dijitEditorIFrame, .claro .dijitDisabled .dijitEditorIFrameContainer, .claro .dijitDisabled .dijitEditorIFrameContainer .dijitEditorIFrame {
+ background-color: #efefef;
+ background-image: none;
}
diff --git a/lib/dijit/themes/claro/Editor.less b/lib/dijit/themes/claro/Editor.less
new file mode 100644
index 000000000..43e6d39ae
--- /dev/null
+++ b/lib/dijit/themes/claro/Editor.less
@@ -0,0 +1,59 @@
+/* Editor
+ *
+ * Styling Editor means styling the Editor inside iframe container (dijitEditorIFrameContainer)
+ *
+ * 1. Editor iframe container (default styling):
+ * .dijitEditorIFrameContainer - normal state styles: background-color, border, padding
+ *
+ * 2. hovered Editor iframe container (ie, mouse hover on editor)
+ * .dijitEditorHover .dijitEditorIFrameContainer/dijitEditorIFrame - styles when mouse hover on the container
+ *
+ * 3. focused Editor iframe container (ie, mouse focus on the editor pane)
+ * .dijitEditorFocused .dijitEditorIFrameContainer/dijitEditorIFrame - styles when container focused
+ *
+ * 3. disabled Editor iframe container
+ * .dijitEditorDisabled - editor's inner iframe container disable status styles: background, border
+ */
+
+@import "variables";
+
+.claro .dijitEditorIFrameContainer{
+ padding:3px 3px 1px 10px;
+}
+.claro .dijitEditorIFrame {
+ background-color: @textbox-background-color;
+}
+.claro .dijitEditor {
+ border: 1px solid @border-color;
+}
+.claro .dijitEditor .dijitEditorIFrameContainer{
+ background-color: @textbox-background-color;
+ 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: @textbox-hovered-background-color;
+}
+.claro .dijitEditorFocused .dijitEditorIFrameContainer,
+.claro .dijitEditorFocused .dijitEditorIFrameContainer .dijitEditorIFrame{
+ /* TODO: contradicts rule above, which background-color do you want? */
+ background-color: @textbox-focused-background-color;
+}
+
+
+/* Disabled */
+.claro .dijitEditorDisabled {
+ border: 1px solid @disabled-border-color;
+ color: @disabled-text-color;
+}
+
+.claro .dijitDisabled .dijitEditorIFrame,
+.claro .dijitDisabled .dijitEditorIFrameContainer,
+.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/Editor_rtl.css b/lib/dijit/themes/claro/Editor_rtl.css
index b09efaac8..f63355867 100644
--- a/lib/dijit/themes/claro/Editor_rtl.css
+++ b/lib/dijit/themes/claro/Editor_rtl.css
@@ -1,4 +1,4 @@
-
-.claro .dijitEditorRtl .dijitEditorIFrameContainer{
- padding:3px 10px 1px 3px;
+/* Editor */
+.claro .dijitEditorRtl .dijitEditorIFrameContainer {
+ padding: 3px 10px 1px 3px;
}
diff --git a/lib/dijit/themes/claro/Editor_rtl.less b/lib/dijit/themes/claro/Editor_rtl.less
new file mode 100644
index 000000000..8ebc013d9
--- /dev/null
+++ b/lib/dijit/themes/claro/Editor_rtl.less
@@ -0,0 +1,9 @@
+/* Editor */
+
+@import "variables";
+
+.claro .dijitEditorRtl .dijitEditorIFrameContainer{
+ padding:3px 10px 1px 3px;
+}
+
+
diff --git a/lib/dijit/themes/claro/InlineEditBox.css b/lib/dijit/themes/claro/InlineEditBox.css
index b92c24e97..e6058f780 100644
--- a/lib/dijit/themes/claro/InlineEditBox.css
+++ b/lib/dijit/themes/claro/InlineEditBox.css
@@ -1,11 +1,20 @@
-
+/* InlineEditBox
+ *
+ * Styling InlineEditBox mainly includes:
+ *
+ * 1. Normal state
+ * .dijitInlineEditBoxDisplayMode - for border
+ *
+ * 2. Hover state
+ * .dijitInlineEditBoxDisplayModeHover - for border and background color
+ */
.claro .dijitInlineEditBoxDisplayMode {
- border: 1px solid transparent;
+ border: 1px solid transparent;
}
.claro .dijitInlineEditBoxDisplayModeHover {
- background-color: #e2f1ff;
- border: solid 1px #769dc0;
+ background-color: #e9f4fe;
+ border: solid 1px #769dc0;
}
.dj_ie6 .claro .dijitInlineEditBoxDisplayMode {
- border: none;
+ border: none;
}
diff --git a/lib/dijit/themes/claro/InlineEditBox.less b/lib/dijit/themes/claro/InlineEditBox.less
new file mode 100644
index 000000000..a7162be1b
--- /dev/null
+++ b/lib/dijit/themes/claro/InlineEditBox.less
@@ -0,0 +1,25 @@
+/* InlineEditBox
+ *
+ * Styling InlineEditBox mainly includes:
+ *
+ * 1. Normal state
+ * .dijitInlineEditBoxDisplayMode - for border
+ *
+ * 2. Hover state
+ * .dijitInlineEditBoxDisplayModeHover - for border and background color
+ */
+
+@import "variables";
+
+.claro .dijitInlineEditBoxDisplayMode {
+ border: 1px solid transparent;
+}
+
+.claro .dijitInlineEditBoxDisplayModeHover {
+ background-color: @textbox-hovered-background-color;
+ border: solid 1px @hovered-border-color;
+}
+
+.dj_ie6 .claro .dijitInlineEditBoxDisplayMode {
+ border: none;
+}
diff --git a/lib/dijit/themes/claro/Menu.css b/lib/dijit/themes/claro/Menu.css
index 4bb0be6e0..c55176d54 100644
--- a/lib/dijit/themes/claro/Menu.css
+++ b/lib/dijit/themes/claro/Menu.css
@@ -1,143 +1,184 @@
+/* Menu
+There are three areas of styling for the Menu:
+
+ 1. The menu
+ There are three types of menus:
+ i)Context Menu
+ ii)Drop down Menu
+ iii) Navigation Menu
+ All three types of menus are affected by the .dijitMenu class in which you can set the background-color, padding and border
+ .dijitMenu affects the drop down menu in TimeTextBox, Calendar, ComboBox and FilteringSelect
+ .dijitMenuTable - for padding - also affects Select widget
+
+ 2. The menu bar
+ .dijitMenuBar - for border, margins, padding, background-color of the menu bar
+ .dijitMenuBar .dijitMenuItem - for padding, text color of menu items in the menu bar (overrides .dijitMenuItem)
+
+ 3. Menu items - items in the menu.
+ .dijitMenuItem - for color
+ .dijitMenuItemHover, .dijitMenuItemSelected - for background-color, border, text color, padding of a menu item or menubar item that has been hovered over or selected
+ .dijitMenuItemActive - for bacgkround-color of an active (mousedown) menu item
+ td.dijitMenuItemIconCell - for padding around a menu item's icon
+ td.dijitMenuItemLabel - for padding around a menu item's label
+ .dijitMenuSeparatorTop - for border, top border, of the separator
+ .dijitMenuSeparatorBottom - for bottom margin of the separator
+
+ Styles specific to ComboBox and FilteringSelect widgets:
+ .dijitComboBoxMenu .dijitMenuItem - for padding and border of a menu item in a ComboBox or FilteringSelect widget's menu
+ .dijitComboBoxMenu .dijitMenuItemSelected- for text color, background-color and border of a menu item in a ComboBox or FilteringSelect widget's menu
+
+*/
.claro .dijitMenuBar {
- border: 1px solid #b5bcc7;
- margin: 0px;
- padding: 0px;
- background-color: #e6e6e7;
- background-image: url("images/commonHighlight.png");
- background-position:0px 0px;
- background-repeat:repeat-x;
+ border: 1px solid #b5bcc7;
+ margin: 0;
+ padding: 0;
+ background-color: #efefef;
+ background-image: url("images/commonHighlight.png");
+ background-position: 0 0;
+ background-repeat: repeat-x;
}
.dj_ie6 .claro .dijitMenuBar {
- background-image:none;
+ background-image: none;
}
.claro .dijitMenu {
- background-repeat:repeat-y;
- background-color:#fff;
- border: 1px solid #769dc0;
-
- margin: -1px 0;
-}
-.claro .dijitMenuBar .dijitMenuItem {
- padding: 6px 10px 7px;
- background-position:0px 100px;
- color:#4a4a4a;
- margin:-1px;
-}
+ background-repeat: repeat-y;
+ background-color: #ffffff;
+ border: 1px solid #769dc0;
+ /* so adjoining borders of MenuBar/ComboBox and Menu overlap, avoiding double border */
+
+ margin: -1px 0;
+}
+.dj_ie6 .claro .dijitMenu {
+ margin: 0;
+ /* above -1px makes top/bottom borders disappear on IE6 */
+
+}
+.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:0px -40px;
- background-repeat:repeat-x;
+ background-image: url("images/menuHighlight.png");
+ background-position: 0 -40px;
+ background-repeat: repeat-x;
}
+/* this prevents jiggling upon hover of a menu item */
.claro .dijitMenuTable {
- border-collapse:separate;
- border-spacing:0 0;
- padding:0px;
-}
-.claro .dijitMenuItem td{
- padding:1px;
-}
-.claro .dijitMenuPassive .dijitMenuItemHover,
-.claro .dijitMenuPassive .dijitMenuItemSelected {
- background-color: #abd6ff;
- border:solid 1px #769dc0;
- background-position:0px 0px;
- color:#000;
- padding: 5px 9px 6px;
-}
-.claro .dijitMenuPassive .dijitMenuItemActive{
- background-position:0px -177px;
-}
-.dj_ie6 .claro .dijitMenuItem,
-.dj_ie6 .claro .dijitMenuPassive .dijitMenuItem {
- background-image: none;
-}
-.claro .dijitMenuActive .dijitMenuItemHover,
-.claro .dijitMenuActive .dijitMenuItemSelected {
- border:solid 1px #769dc0;
- padding: 5px 9px 6px;
- background-color: #9dcfff;
- background-position:0px 0px;
- color:#000;
+ border-collapse: separate;
+ border-spacing: 0 0;
+ padding: 0;
+}
+.claro .dijitMenuItem td {
+ padding: 1px;
+}
+/* hover over a MenuBarItem */
+.claro .dijitMenuPassive .dijitMenuItemHover, .claro .dijitMenuPassive .dijitMenuItemSelected {
+ background-color: #abd6ff;
+ border: solid 1px #769dc0;
+ background-position: 0 0;
+ color: #000000;
+ padding: 5px 9px 6px;
+}
+.claro .dijitMenuPassive .dijitMenuItemActive {
+ background-position: 0 -177px;
+}
+.dj_ie6 .claro .dijitMenuItem, .dj_ie6 .claro .dijitMenuPassive .dijitMenuItem {
+ background-image: none;
+}
+/* MenuBarItem that has been selected and menu drops down from it */
+.claro .dijitMenuActive .dijitMenuItemHover, .claro .dijitMenuActive .dijitMenuItemSelected {
+ border: solid 1px #769dc0;
+ padding: 5px 9px 6px;
+ background-color: #abd6ff;
+ background-position: 0 0;
+ color: #000000;
}
.dj_ie .claro .dijitMenuActive .dijitMenuItemHover,
.dj_ie .claro .dijitMenuActive .dijitMenuItemSelected,
.dj_ie .claro .dijitMenuPassive .dijitMenuItemHover,
.dj_ie .claro .dijitMenuPassive .dijitMenuItemSelected {
- padding-top: 6px;
- padding-bottom: 5px;
- margin-top: -3px;
+ padding-top: 6px;
+ padding-bottom: 5px;
+ margin-top: -3px;
}
-.claro .dijitMenuActive .dijitMenuItemActive{
- background-color: #7dbefa;
- background-position:0px -177px;
+.claro .dijitMenuActive .dijitMenuItemActive {
+ background-color: #7dbefa;
+ background-position: 0 -177px;
}
.claro .dijitMenuItemActive {
- background-position:0px -177px;
+ background-position: 0 -177px;
}
.claro td.dijitMenuItemIconCell {
- padding: 2px;
- margin: 0px 0px 0px 4px;
+ padding: 2px;
+ margin: 0 0 0 4px;
}
.claro td.dijitMenuItemLabel {
- padding-top: 5px;
- padding-bottom: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
}
.claro .dijitMenuExpand {
- width: 7px;
- height: 7px;
- background-image: url('images/spriteArrows.png');
- background-position: -14px 0px;
- margin-right:3px;
+ width: 7px;
+ height: 7px;
+ background-image: url('images/spriteArrows.png');
+ background-position: -14px 0;
+ margin-right: 3px;
}
.claro .dijitMenuItemDisabled .dijitMenuItemIconCell {
- opacity:1;
+ opacity: 1;
}
.claro .dijitMenuSeparatorTop {
- height: auto;
- margin-top:1px;
- border-bottom: 1px solid #b5bcc7
+ height: auto;
+ margin-top: 1px;
+ /* prevents spacing above/below separator */
+
+ border-bottom: 1px solid #b5bcc7;
}
-.claro .dijitMenuSeparatorBottom{
- height: auto;
- margin-bottom:1px;
+.claro .dijitMenuSeparatorBottom {
+ height: auto;
+ margin-bottom: 1px;
}
+/* the checked menu item */
.claro .dijitCheckedMenuItemIconChar {
- display: none;
+ display: none;
}
.claro .dijitCheckedMenuItemIcon {
- background-image: url('form/images/checkboxRadioButtonStates.png');
- background-repeat:no-repeat;
- background-position: -15px 50%;
- width:15px;
- height:16px;
+ 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%;
+ background-position: 0 50%;
}
+/*ComboBox Menu*/
.claro .dijitComboBoxMenu {
- margin-left:0px;
- background-image: none;
+ margin-left: 0;
+ background-image: none;
}
-.claro .dijitComboBoxMenu .dijitMenuItem{
- padding:2px 0px;
- text-indent:6px;
- border-width:1px 0px 1px 0px;
- border-style:solid;
- border-color:#fff;
+.claro .dijitComboBoxMenu .dijitMenuItem {
+ padding: 2px;
+ border-width: 1px 0 1px 0;
+ border-style: solid;
+ border-color: #ffffff;
}
.claro .dijitComboBoxMenu .dijitMenuItemSelected {
- color:#000;
- border-color:#768dc0;
- background-color:#abd6ff;
+ color: #000000;
+ border-color: #769dc0;
+ background-color: #abd6ff;
}
.claro .dijitComboBoxMenuActive .dijitMenuItemSelected {
- background-position:0px -177px;
- background-color:#7dbefa;
+ background-position: 0 -177px;
+ background-color: #7dbefa;
+ /* TODO: why is this a different color than normal .dijitMenuItemSelected? */
+
}
.claro .dijitMenuPreviousButton, .claro .dijitMenuNextButton {
- font-style: italic;
+ font-style: italic;
}
diff --git a/lib/dijit/themes/claro/Menu.less b/lib/dijit/themes/claro/Menu.less
new file mode 100644
index 000000000..1528df40b
--- /dev/null
+++ b/lib/dijit/themes/claro/Menu.less
@@ -0,0 +1,188 @@
+/* Menu
+
+There are three areas of styling for the Menu:
+
+ 1. The menu
+ There are three types of menus:
+ i)Context Menu
+ ii)Drop down Menu
+ iii) Navigation Menu
+ All three types of menus are affected by the .dijitMenu class in which you can set the background-color, padding and border
+ .dijitMenu affects the drop down menu in TimeTextBox, Calendar, ComboBox and FilteringSelect
+ .dijitMenuTable - for padding - also affects Select widget
+
+ 2. The menu bar
+ .dijitMenuBar - for border, margins, padding, background-color of the menu bar
+ .dijitMenuBar .dijitMenuItem - for padding, text color of menu items in the menu bar (overrides .dijitMenuItem)
+
+ 3. Menu items - items in the menu.
+ .dijitMenuItem - for color
+ .dijitMenuItemHover, .dijitMenuItemSelected - for background-color, border, text color, padding of a menu item or menubar item that has been hovered over or selected
+ .dijitMenuItemActive - for bacgkround-color of an active (mousedown) menu item
+ td.dijitMenuItemIconCell - for padding around a menu item's icon
+ td.dijitMenuItemLabel - for padding around a menu item's label
+ .dijitMenuSeparatorTop - for border, top border, of the separator
+ .dijitMenuSeparatorBottom - for bottom margin of the separator
+
+ Styles specific to ComboBox and FilteringSelect widgets:
+ .dijitComboBoxMenu .dijitMenuItem - for padding and border of a menu item in a ComboBox or FilteringSelect widget's menu
+ .dijitComboBoxMenu .dijitMenuItemSelected- for text color, background-color and border of a menu item in a ComboBox or FilteringSelect widget's menu
+
+*/
+
+@import "variables";
+
+.claro .dijitMenuBar {
+ border: 1px solid @border-color;
+ margin: 0;
+ padding: 0;
+ background-color: @bar-background-color;
+ background-image: url("images/commonHighlight.png");
+ background-position:0 0;
+ background-repeat:repeat-x;
+}
+.dj_ie6 .claro .dijitMenuBar {
+ background-image:none;
+}
+.claro .dijitMenu {
+ background-repeat:repeat-y;
+ background-color:@menu-background-color;
+ border: 1px solid @popup-border-color;
+
+ /* so adjoining borders of MenuBar/ComboBox and Menu overlap, avoiding double border */
+ margin: -1px 0;
+}
+.dj_ie6 .claro .dijitMenu {
+ margin: 0; /* above -1px makes top/bottom borders disappear on IE6 */
+}
+.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-position:0 -40px;
+ background-repeat:repeat-x;
+}
+
+/* this prevents jiggling upon hover of a menu item */
+.claro .dijitMenuTable {
+ border-collapse:separate;
+ border-spacing:0 0;
+ padding:0;
+}
+.claro .dijitMenuItem td{
+ padding:1px;
+}
+/* hover over a MenuBarItem */
+.claro .dijitMenuPassive .dijitMenuItemHover,
+.claro .dijitMenuPassive .dijitMenuItemSelected {
+ background-color: @hovered-background-color;
+ border:solid 1px @hovered-border-color;
+ background-position:0 0;
+ color:@text-color;
+ padding: 5px 9px 6px;
+}
+.claro .dijitMenuPassive .dijitMenuItemActive{
+ background-position:0 -177px;
+}
+.dj_ie6 .claro .dijitMenuItem,
+.dj_ie6 .claro .dijitMenuPassive .dijitMenuItem {
+ background-image: none;
+}
+
+/* MenuBarItem that has been selected and menu drops down from it */
+.claro .dijitMenuActive .dijitMenuItemHover,
+.claro .dijitMenuActive .dijitMenuItemSelected {
+ border:solid 1px @hovered-border-color;
+ padding: 5px 9px 6px;
+ background-color: @hovered-background-color;
+ background-position:0 0;
+ color:@hovered-text-color;
+}
+.dj_ie .claro .dijitMenuActive .dijitMenuItemHover,
+.dj_ie .claro .dijitMenuActive .dijitMenuItemSelected,
+.dj_ie .claro .dijitMenuPassive .dijitMenuItemHover,
+.dj_ie .claro .dijitMenuPassive .dijitMenuItemSelected {
+ padding-top: 6px;
+ padding-bottom: 5px;
+ margin-top: -3px;
+}
+.claro .dijitMenuActive .dijitMenuItemActive{
+ background-color: @pressed-background-color;
+ background-position:0 -177px;
+}
+.claro .dijitMenuItemActive {
+ background-position:0 -177px;
+}
+.claro td.dijitMenuItemIconCell {
+ padding: 2px;
+ margin: 0 0 0 4px;
+}
+.claro td.dijitMenuItemLabel {
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.claro .dijitMenuExpand {
+ width: 7px;
+ height: 7px;
+ background-image: url('images/spriteArrows.png');
+ background-position: -14px 0;
+ margin-right:3px;
+}
+.claro .dijitMenuItemDisabled .dijitMenuItemIconCell {
+ opacity:1;
+}
+.claro .dijitMenuSeparatorTop {
+ height: auto;
+ margin-top:1px; /* prevents spacing above/below separator */
+ border-bottom: 1px solid @border-color
+}
+.claro .dijitMenuSeparatorBottom{
+ height: auto;
+ margin-bottom:1px;
+}
+/* the checked menu item */
+.claro .dijitCheckedMenuItemIconChar {
+ display: none;
+}
+.claro .dijitCheckedMenuItemIcon {
+ 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');
+}
+.claro .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
+ background-position: 0 50%;
+}
+
+/*ComboBox Menu*/
+.claro .dijitComboBoxMenu {
+ margin-left:0;
+ background-image: none;
+}
+
+.claro .dijitComboBoxMenu .dijitMenuItem {
+ padding: @textbox-padding; // Make drop down menu text line up with text in <input>.
+ border-width:1px 0 1px 0;
+ border-style:solid;
+ border-color: @select-dropdownitem-background-color;
+}
+.claro .dijitComboBoxMenu .dijitMenuItemSelected {
+ color:@selected-text-color;
+ border-color:@hovered-border-color;
+ background-color:@hovered-background-color;
+}
+.claro .dijitComboBoxMenuActive .dijitMenuItemSelected {
+ background-position:0 -177px;
+ background-color: @select-dropdownitem-hovered-background-color; /* TODO: why is this a different color than normal .dijitMenuItemSelected? */
+}
+.claro .dijitMenuPreviousButton, .claro .dijitMenuNextButton {
+ font-style: italic;
+}
diff --git a/lib/dijit/themes/claro/Menu_rtl.css b/lib/dijit/themes/claro/Menu_rtl.css
index 6ba061bec..2b96cbae7 100644
--- a/lib/dijit/themes/claro/Menu_rtl.css
+++ b/lib/dijit/themes/claro/Menu_rtl.css
@@ -1,8 +1,8 @@
.claro .dijitMenuItemRtl .dijitMenuExpand {
- background-position: -7px 0px;
- margin-right: 0px;
- margin-left: 3px;
+ background-position: -7px 0;
+ margin-right: 0;
+ margin-left: 3px;
}
.claro .dijitMenuItemRtl .dijitMenuItemIcon {
- margin:0px 4px 0px 0px;
+ margin: 0 4px 0 0;
}
diff --git a/lib/dijit/themes/claro/Menu_rtl.less b/lib/dijit/themes/claro/Menu_rtl.less
new file mode 100644
index 000000000..6f669f5fd
--- /dev/null
+++ b/lib/dijit/themes/claro/Menu_rtl.less
@@ -0,0 +1,11 @@
+@import "variables";
+
+.claro .dijitMenuItemRtl .dijitMenuExpand {
+ background-position: -7px 0;
+ margin-right: 0;
+ margin-left: 3px;
+}
+
+.claro .dijitMenuItemRtl .dijitMenuItemIcon {
+ margin:0 4px 0 0;
+}
diff --git a/lib/dijit/themes/claro/ProgressBar.css b/lib/dijit/themes/claro/ProgressBar.css
index 13e8f266f..c735e5c2f 100644
--- a/lib/dijit/themes/claro/ProgressBar.css
+++ b/lib/dijit/themes/claro/ProgressBar.css
@@ -1,28 +1,57 @@
-
-
+/* ProgressBar
+ *
+ * Styling of the ProgressBar consists of the following:
+ *
+ * 1. the base progress bar
+ * .dijitProgressBar - sets margins for the progress bar
+ *
+ * 2. the empty bar
+ * .dijitProgressBarEmpty - sets background img and color for bar or parts of bar that are not finished yet
+ * Also sets border color for whole bar
+ *
+ * 3. tile mode
+ * .dijitProgressBarTile
+ * inner container for finished portion when in 'tile' (image) mode
+ *
+ * 4. full bar mode
+ * .dijitProgressBarFull
+ * adds border to right side of the filled portion of bar
+ *
+ * 5. text for label of bar
+ * .dijitProgressBarLabel - sets text color, which must contrast with both the "Empty" and "Full" parts.
+ *
+ * 6. indeterminate mode
+ * .dijitProgressBarIndeterminate .dijitProgressBarTile
+ * sets animated gif for the progress bar in 'indeterminate' mode
+ */
.claro .dijitProgressBar {
- margin:2px 0px 2px 0px;
+ margin: 2px 0 2px 0;
}
.claro .dijitProgressBarEmpty {
-
- background:#fff url("images/progressBarEmpty.png") repeat-none left;
- border-color: #769dc0;
+ /* outer container and background of the bar that's not finished yet*/
+
+ background: #ffffff url("images/progressBarEmpty.png") repeat-none left;
+ border-color: #769dc0;
}
.claro .dijitProgressBarTile {
-
- background:#9dcfff url("images/progressBarFull.png") repeat-x top;
+ /* inner container for finished portion when in 'tile' (image) mode */
+
+ background: #abd6ff url("images/progressBarFull.png") repeat-x top;
}
.dj_ie6 .claro .dijitProgressBarTile {
- background-image: none;
-}
+ background-image: none;
+}
.claro .dijitProgressBarFull {
- border-right:1px solid #769dc0;
+ border-right: 1px solid #769dc0;
}
.claro .dijitProgressBarLabel {
-
- color:#293a4b;
+ /* Set to a color that contrasts with both the "Empty" and "Full" parts. */
+
+ color: #000000;
}
.claro .dijitProgressBarIndeterminate .dijitProgressBarTile {
-
- background:#cad2de url("images/progressBarAnim.gif") repeat-x top;
-}
+ /* use an animated gif for the progress bar in 'indeterminate' mode;
+ background-color won't appear unless user has turned off background images */
+
+ background: #efefef url("images/progressBarAnim.gif") repeat-x top;
+}
diff --git a/lib/dijit/themes/claro/ProgressBar.less b/lib/dijit/themes/claro/ProgressBar.less
new file mode 100644
index 000000000..d361952ee
--- /dev/null
+++ b/lib/dijit/themes/claro/ProgressBar.less
@@ -0,0 +1,56 @@
+/* ProgressBar
+ *
+ * Styling of the ProgressBar consists of the following:
+ *
+ * 1. the base progress bar
+ * .dijitProgressBar - sets margins for the progress bar
+ *
+ * 2. the empty bar
+ * .dijitProgressBarEmpty - sets background img and color for bar or parts of bar that are not finished yet
+ * Also sets border color for whole bar
+ *
+ * 3. tile mode
+ * .dijitProgressBarTile
+ * inner container for finished portion when in 'tile' (image) mode
+ *
+ * 4. full bar mode
+ * .dijitProgressBarFull
+ * adds border to right side of the filled portion of bar
+ *
+ * 5. text for label of bar
+ * .dijitProgressBarLabel - sets text color, which must contrast with both the "Empty" and "Full" parts.
+ *
+ * 6. indeterminate mode
+ * .dijitProgressBarIndeterminate .dijitProgressBarTile
+ * sets animated gif for the progress bar in 'indeterminate' mode
+ */
+
+ @import "variables";
+
+.claro .dijitProgressBar {
+ margin:2px 0 2px 0;
+}
+.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;
+ 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;
+}
+.dj_ie6 .claro .dijitProgressBarTile {
+ background-image: none;
+}
+.claro .dijitProgressBarFull {
+ border-right:1px solid @progressbar-border-color;
+}
+.claro .dijitProgressBarLabel {
+ /* Set to a color that contrasts with both the "Empty" and "Full" parts. */
+ color: @progressbar-text-color;
+}
+.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
diff --git a/lib/dijit/themes/claro/README b/lib/dijit/themes/claro/README
new file mode 100644
index 000000000..5ef4714ad
--- /dev/null
+++ b/lib/dijit/themes/claro/README
@@ -0,0 +1,64 @@
+These are "less" files that compile into the CSS of claro.
+
+---------
+Installing and running on Windows:
+
+1. Install node:
+ a) Go to https://github.com/ajaxorg/node-builds, press download button, and select "download zip"
+ b) unzip the file into C:\
+
+2. 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:
+
+ 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
+
+4. To compile all the files:
+
+ C:\> cd C:\myworkspace\dijit\themes\claro
+ C:\> node compile.js
+
+--------
+To install/run less version 2 on mac:
+
+1. Install Node.js
+ Download a built copy from https://github.com/ajaxorg/node-builds.
+ Alternately, o 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:
+
+ 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 a5ddf9129..fb8bf5efa 100644
--- a/lib/dijit/themes/claro/TimePicker.css
+++ b/lib/dijit/themes/claro/TimePicker.css
@@ -1,102 +1,130 @@
-
+/* Time Picker
+ *
+ * Styling the Time Picker consists of the following:
+ *
+ * 1. minor time values
+ * .dijitTimePickerTick - set text color, size, background color of minor values
+ * .dijitTimePickerTickHover - set hover style of minor time values
+ * dijitTimePickerTickSelected - set selected style of minor time values
+ *
+ * 2. major time values - 1:00, 2:00, times on the hour
+ * set text color, size, background color, left/right margins for "zoom" affect
+ * .dijitTimePickerMarkerHover - to set hover style of major time values
+ * .dijitTimePickerMarkerSelected - set selected style of major time values
+ *
+ * 3. up and down arrow buttons
+ * .dijitTimePicker .dijitButtonNode - background-color, border
+ * .dijitTimePicker .dijitUpArrowHover, .dijitTimePicker .dijitDownArrowHover - set background-color for hover state
+ *
+ * Other classes provide the fundamental structure of the TimePicker and should not be modified.
+ */
+/* override Button.css */
.claro .dijitTimePicker .dijitButtonNode {
- padding: 0 0;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
-}
-.claro .dijitTimePicker{
- border:1px #b5bcc7 solid;
- border-top:none;
- border-bottom:none;
- background-color:#fff;
-}
-.claro .dijitTimePickerItem{
-
- background-image: url("images/commonHighlight.png");
- background-position:0px -1px;
- background-repeat:repeat-x;
- border-top:solid 1px #b5bcc7;
- border-bottom:solid 1px #b5bcc7;
- margin-right:-1px;
- margin-left:-1px;
- margin-top:-1px;
+ padding: 0 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.claro .dijitTimePicker {
+ border: 1px #b5bcc7 solid;
+ border-top: none;
+ border-bottom: none;
+ background-color: #fff;
+ /* TODO: useless? Appears to be overridden by settings on individual elements */
+
}
+.claro .dijitTimePickerItem {
+ /* dijitTimePickerItem refers to both Tick's (minor values like 2:15, 2:30, 2:45) and Marker's (major values like 2PM, 3PM) */
+
+ background-image: url("images/commonHighlight.png");
+ background-position: 0 -1px;
+ background-repeat: repeat-x;
+ border-top: solid 1px #b5bcc7;
+ border-bottom: solid 1px #b5bcc7;
+ margin-right: -1px;
+ margin-left: -1px;
+ margin-top: -1px;
+}
+/* to make up for lack of alpha transparency in IE6 */
.dj_ie6 .claro .dijitTimePickerItem {
- background-image: none;
+ background-image: none;
}
.claro .dijitTimePickerTick {
-
- color:#7a7a7a;
- background-color:#f2f2f2;
- font-size:0.818em;
+ /* minor value */
+
+ color: #818181;
+ background-color: #efefef;
+ font-size: 0.818em;
}
.claro .dijitTimePickerMarker {
-
- color:#000;
- background-color:#e3f2ff;
- font-size: 1em;
- white-space: nowrap;
+ /* major value - 1:00, 2:00, times on the hour */
+
+ background-color: #e9f4fe;
+ font-size: 1em;
+ white-space: nowrap;
}
.claro .dijitTimePickerTickHover,
.claro .dijitTimePickerMarkerHover,
.claro .dijitTimePickerMarkerSelected,
.claro .dijitTimePickerTickSelected {
- background-color: #83c0fa;
- color:#000;
- border:solid 1px #b5bcc7;
- margin-left:-7px;
- margin-right:-7px;
+ background-color: #7dbefa;
+ border: solid 1px #b5bcc7;
+ margin-left: -7px;
+ margin-right: -7px;
+ color: #000000;
+}
+.claro .dijitTimePickerMarkerSelected, .claro .dijitTimePickerTickSelected {
+ font-size: 1em;
}
-.claro .dijitTimePickerMarkerSelected,
-.claro .dijitTimePickerTickSelected {
- font-size: 1em;
- }
.dj_ie .claro .dijitTimePickerTickHover,
.dj_ie .claro .dijitTimePickerMarkerHover,
.dj_ie .claro .dijitTimePickerMarkerSelected,
-.dj_ie .claro .dijitTimePickerTickSelected {
- width: 114%;
+.dj_ie .claro .dijitTimePickerTickSelected {
+ width: 114%;
}
.dj_ie6 .claro .dijitTimePickerTickHover,
.dj_ie6 .claro .dijitTimePickerMarkerHover,
.dj_ie6 .claro .dijitTimePickerMarkerSelected,
-.dj_ie6 .claro .dijitTimePickerTickSelected {
- position: relative;
- zoom: 1;
+.dj_ie6 .claro .dijitTimePickerTickSelected {
+ position: relative;
+ /* creates widening of element */
+ zoom: 1;
+ /* creates widening of element */
+
}
.claro .dijitTimePickerTick .dijitTimePickerItemInner {
- padding:1px;
- margin:0px;
+ padding: 1px;
+ margin: 0;
}
.claro .dijitTimePicker .dijitButtonNode {
- border-left:none;
- border-right:none;
- border-color:#b5bcc7;
- background-color: #f6f7fa;
- background-image: url("images/commonHighlight.png");
- background-position:0px -1px;
- background-repeat:repeat-x;
+ border-left: none;
+ border-right: none;
+ border-color: #b5bcc7;
+ background-color: #efefef;
+ background-image: url("images/commonHighlight.png");
+ background-position: 0 -1px;
+ background-repeat: repeat-x;
}
.dj_ie6 .claro .dijitTimePicker .dijitButtonNode {
- background-image: none;
+ background-image: none;
}
-.claro .dijitTimePicker .dijitArrowButtonInner{
- height: 100%;
- background-image: url("form/images/commonFormArrows.png");
- background-repeat: no-repeat;
- background-position:-140px 45%;
+.claro .dijitTimePicker .dijitArrowButtonInner {
+ height: 100%;
+ /* hack claro.button.css */
+
+ background-image: url("form/images/commonFormArrows.png");
+ background-repeat: no-repeat;
+ background-position: -140px 45%;
}
-.claro .dijitTimePicker .dijitDownArrowButton .dijitArrowButtonInner{
- background-position:-35px 45%;
+.claro .dijitTimePicker .dijitDownArrowButton .dijitArrowButtonInner {
+ background-position: -35px 45%;
}
-.claro .dijitTimePicker .dijitUpArrowHover,
-.claro .dijitTimePicker .dijitDownArrowHover {
- background-color: #abd6ff;
+/* hover */
+.claro .dijitTimePicker .dijitUpArrowHover, .claro .dijitTimePicker .dijitDownArrowHover {
+ background-color: #abd6ff;
}
.claro .dijitTimePicker .dijitUpArrowHover .dijitArrowButtonInner {
- background-position:-175px 45%;
+ background-position: -175px 45%;
}
.claro .dijitTimePicker .dijitDownArrowHover .dijitArrowButtonInner {
- background-position:-70px 45%;
+ background-position: -70px 45%;
}
diff --git a/lib/dijit/themes/claro/TimePicker.less b/lib/dijit/themes/claro/TimePicker.less
new file mode 100644
index 000000000..cd07a63d8
--- /dev/null
+++ b/lib/dijit/themes/claro/TimePicker.less
@@ -0,0 +1,124 @@
+/* Time Picker
+ *
+ * Styling the Time Picker consists of the following:
+ *
+ * 1. minor time values
+ * .dijitTimePickerTick - set text color, size, background color of minor values
+ * .dijitTimePickerTickHover - set hover style of minor time values
+ * dijitTimePickerTickSelected - set selected style of minor time values
+ *
+ * 2. major time values - 1:00, 2:00, times on the hour
+ * set text color, size, background color, left/right margins for "zoom" affect
+ * .dijitTimePickerMarkerHover - to set hover style of major time values
+ * .dijitTimePickerMarkerSelected - set selected style of major time values
+ *
+ * 3. up and down arrow buttons
+ * .dijitTimePicker .dijitButtonNode - background-color, border
+ * .dijitTimePicker .dijitUpArrowHover, .dijitTimePicker .dijitDownArrowHover - set background-color for hover state
+ *
+ * Other classes provide the fundamental structure of the TimePicker and should not be modified.
+ */
+
+@import "variables";
+
+/* override Button.css */
+.claro .dijitTimePicker .dijitButtonNode {
+ padding: 0 0;
+ .border-radius(0);
+}
+.claro .dijitTimePicker{
+ border:1px @border-color solid;
+ border-top:none;
+ border-bottom:none;
+ background-color:#fff; /* TODO: useless? Appears to be overridden by settings on individual elements */
+}
+.claro .dijitTimePickerItem{
+ /* dijitTimePickerItem refers to both Tick's (minor values like 2:15, 2:30, 2:45) and Marker's (major values like 2PM, 3PM) */
+ background-image: url("images/commonHighlight.png");
+ background-position:0 -1px;
+ background-repeat:repeat-x;
+ border-top:solid 1px @border-color;
+ border-bottom:solid 1px @border-color;
+ margin-right:-1px;
+ margin-left:-1px;
+ margin-top:-1px;
+}
+/* to make up for lack of alpha transparency in IE6 */
+.dj_ie6 .claro .dijitTimePickerItem {
+ background-image: none;
+}
+.claro .dijitTimePickerTick {
+ /* minor value */
+ color:@timepicker-minorvalue-text-color;
+ background-color:@timepicker-minorvalue-background-color;
+ font-size:0.818em;
+}
+.claro .dijitTimePickerMarker {
+ /* major value - 1:00, 2:00, times on the hour */
+ background-color: @timepicker-majorvalue-background-color;
+ font-size: 1em;
+ white-space: nowrap;
+}
+.claro .dijitTimePickerTickHover,
+.claro .dijitTimePickerMarkerHover,
+.claro .dijitTimePickerMarkerSelected,
+.claro .dijitTimePickerTickSelected {
+ background-color: @timepicker-value-hovered-background-color;
+ border:solid 1px @border-color;
+ margin-left:-7px;
+ margin-right:-7px;
+ color:@timepicker-value-hovered-text-color;
+}
+.claro .dijitTimePickerMarkerSelected,
+.claro .dijitTimePickerTickSelected {
+ font-size: 1em;
+}
+.dj_ie .claro .dijitTimePickerTickHover,
+.dj_ie .claro .dijitTimePickerMarkerHover,
+.dj_ie .claro .dijitTimePickerMarkerSelected,
+.dj_ie .claro .dijitTimePickerTickSelected {
+ width: 114%;
+}
+.dj_ie6 .claro .dijitTimePickerTickHover,
+.dj_ie6 .claro .dijitTimePickerMarkerHover,
+.dj_ie6 .claro .dijitTimePickerMarkerSelected,
+.dj_ie6 .claro .dijitTimePickerTickSelected {
+ position: relative; /* creates widening of element */
+ zoom: 1; /* creates widening of element */
+}
+.claro .dijitTimePickerTick .dijitTimePickerItemInner {
+ padding:1px;
+ margin:0;
+}
+.claro .dijitTimePicker .dijitButtonNode {
+ border-left:none;
+ border-right:none;
+ border-color:@border-color;
+ background-color: @unselected-background-color;
+ background-image: url("images/commonHighlight.png");
+ background-position:0 -1px;
+ background-repeat:repeat-x;
+}
+.dj_ie6 .claro .dijitTimePicker .dijitButtonNode {
+ background-image: none;
+}
+.claro .dijitTimePicker .dijitArrowButtonInner{
+ height: 100%; /* hack claro.button.css */
+ background-image: url("form/images/commonFormArrows.png");
+ background-repeat: no-repeat;
+ background-position:-140px 45%;
+}
+.claro .dijitTimePicker .dijitDownArrowButton .dijitArrowButtonInner{
+ background-position:-35px 45%;
+}
+/* hover */
+.claro .dijitTimePicker .dijitUpArrowHover,
+.claro .dijitTimePicker .dijitDownArrowHover {
+ background-color: @timepicker-arrow-hovered-background-color;
+}
+.claro .dijitTimePicker .dijitUpArrowHover .dijitArrowButtonInner {
+ background-position:-175px 45%;
+}
+.claro .dijitTimePicker .dijitDownArrowHover .dijitArrowButtonInner {
+ background-position:-70px 45%;
+}
diff --git a/lib/dijit/themes/claro/TimePicker_rtl.css b/lib/dijit/themes/claro/TimePicker_rtl.css
index a1bf2fbf0..6dfcf839e 100644
--- a/lib/dijit/themes/claro/TimePicker_rtl.css
+++ b/lib/dijit/themes/claro/TimePicker_rtl.css
@@ -1,9 +1,9 @@
-
+/* TimePicker */
.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerTickHover,
.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerMarkerHover,
.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerMarkerSelected,
.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerTickSelected {
- margin-left:-6px;
- margin-right:-8px;
- width: 114%;
+ margin-left: -6px;
+ margin-right: -8px;
+ width: 114%;
}
diff --git a/lib/dijit/themes/claro/TimePicker_rtl.less b/lib/dijit/themes/claro/TimePicker_rtl.less
new file mode 100644
index 000000000..44f5da5bd
--- /dev/null
+++ b/lib/dijit/themes/claro/TimePicker_rtl.less
@@ -0,0 +1,12 @@
+/* TimePicker */
+
+@import "variables";
+
+.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerTickHover,
+.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerMarkerHover,
+.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerMarkerSelected,
+.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerTickSelected {
+ margin-left:-6px;
+ margin-right:-8px;
+ width: 114%;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/claro/TitlePane.css b/lib/dijit/themes/claro/TitlePane.css
index a0191fc53..7f0cdbfb7 100644
--- a/lib/dijit/themes/claro/TitlePane.css
+++ b/lib/dijit/themes/claro/TitlePane.css
@@ -1,54 +1,73 @@
-
+/* TitlePane
+ *
+ * Styling TitlePane means styling the TitlePane title and its content container (dijitTitlePane)
+ *
+ * TitlePane title:
+ * 1. TitlePane title (default styling):
+ * .dijitTitlePaneTitle - TitlePane's title div style: background-color, border
+ *
+ * 2. hovered TitlePane title (ie, mouse hover on a title bar)
+ * .dijitTitlePaneTitleHover - styles when mouse hover on the title div
+ *
+ * 3. active TitlePane title (ie, mouse down on a title bar)
+ * .dijitTitlePaneTitleActive - styles when mouse down on the title div
+ *
+ *
+ * TitlePane Content Container:
+ * 1. outer/inner container:
+ * .dijitTitlePaneContentOuter / dijitTitlePaneContentInner - styles for the content outer div
+ */
.claro .dijitTitlePaneTitle {
- background-color: #e6e6e7;
- background-image: url("images/titlebar.png");
- background-repeat:repeat-x;
- border:1px solid #b5bcc7;
- padding: 0px 7px 3px 7px;
- min-height:17px;
- color:#131313;
+ background-color: #efefef;
+ background-image: url("images/titlebar.png");
+ background-repeat: repeat-x;
+ border: 1px solid #b5bcc7;
+ padding: 0 7px 3px 7px;
+ min-height: 17px;
}
.dj_ie6 .claro .dijitTitlePaneTitle {
- background-image: none;
+ background-image: none;
}
.claro .dijitTitlePaneTitleHover {
- background-color: #abd6ff;
- border-color: #769dc0;
+ background-color: #abd6ff;
+ border-color: #769dc0;
}
.claro .dijitTitlePaneTitleActive {
- background-color: #7dbefa;
- border-color: #769dc0;
- background-position:0px -136px;
+ background-color: #7dbefa;
+ border-color: #769dc0;
+ background-position: 0 -136px;
}
.claro .dijitTitlePaneTitleFocus {
- margin-top:3px;
- padding-bottom:2px;
+ margin-top: 3px;
+ padding-bottom: 2px;
}
.claro .dijitTitlePane .dijitArrowNode {
- background-image: url('images/spriteArrows.png');
- background-repeat: no-repeat;
- height: 8px;
- width: 7px;
+ background-image: url('images/spriteArrows.png');
+ background-repeat: no-repeat;
+ height: 8px;
+ width: 7px;
}
.claro .dijitTitlePane .dijitOpen .dijitArrowNode {
- background-position: 0px 0px;
+ background-position: 0 0;
}
.claro .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: -14px 0px;
+ background-position: -14px 0;
}
.claro .dijitTitlePaneFocused .dijitTitlePaneTextNode {
- color:#000;
+ color: #000000;
+ /* TODO: do we need this? we usually don't change text color on focus */
+
}
.claro .dijitTitlePaneContentOuter {
- background: #ffffff;
- border:1px solid #b5bcc7;
- border-top:none;
+ background: #ffffff;
+ border: 1px solid #b5bcc7;
+ border-top: none;
}
.claro .dijitTitlePaneContentInner {
- padding:10px;
+ padding: 10px;
}
.claro .dijitTitlePaneTextNode {
- margin-left: 4px;
- margin-right: 4px;
- vertical-align:text-top;
+ margin-left: 4px;
+ margin-right: 4px;
+ vertical-align: text-top;
}
diff --git a/lib/dijit/themes/claro/TitlePane.less b/lib/dijit/themes/claro/TitlePane.less
new file mode 100644
index 000000000..22bacca0f
--- /dev/null
+++ b/lib/dijit/themes/claro/TitlePane.less
@@ -0,0 +1,74 @@
+/* TitlePane
+ *
+ * Styling TitlePane means styling the TitlePane title and its content container (dijitTitlePane)
+ *
+ * TitlePane title:
+ * 1. TitlePane title (default styling):
+ * .dijitTitlePaneTitle - TitlePane's title div style: background-color, border
+ *
+ * 2. hovered TitlePane title (ie, mouse hover on a title bar)
+ * .dijitTitlePaneTitleHover - styles when mouse hover on the title div
+ *
+ * 3. active TitlePane title (ie, mouse down on a title bar)
+ * .dijitTitlePaneTitleActive - styles when mouse down on the title div
+ *
+ *
+ * TitlePane Content Container:
+ * 1. outer/inner container:
+ * .dijitTitlePaneContentOuter / dijitTitlePaneContentInner - styles for the content outer div
+ */
+
+@import "variables";
+
+.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-repeat:repeat-x;
+ border:1px solid @border-color;
+ padding: 0 7px 3px 7px;
+ min-height:17px;
+}
+.dj_ie6 .claro .dijitTitlePaneTitle {
+ background-image: none;
+}
+.claro .dijitTitlePaneTitleHover {
+ background-color: @hovered-background-color;
+ border-color: @hovered-border-color;
+}
+.claro .dijitTitlePaneTitleActive {
+ background-color: @pressed-background-color;
+ border-color: @pressed-border-color;
+ background-position:0 -136px;
+}
+.claro .dijitTitlePaneTitleFocus {
+ margin-top:3px;
+ padding-bottom:2px;
+}
+.claro .dijitTitlePane .dijitArrowNode {
+ background-image: url('images/spriteArrows.png');
+ background-repeat: no-repeat;
+ height: 8px;
+ width: 7px;
+}
+.claro .dijitTitlePane .dijitOpen .dijitArrowNode {
+ background-position: 0 0;
+}
+.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 .dijitTitlePaneContentOuter {
+ background: @pane-background-color;
+ border:1px solid @border-color;
+ border-top:none;
+}
+.claro .dijitTitlePaneContentInner {
+ padding:10px;
+}
+.claro .dijitTitlePaneTextNode {
+ margin-left: 4px;
+ margin-right: 4px;
+ vertical-align:text-top;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/claro/TitlePane_rtl.css b/lib/dijit/themes/claro/TitlePane_rtl.css
index 09ca395f7..3f68ab30e 100644
--- a/lib/dijit/themes/claro/TitlePane_rtl.css
+++ b/lib/dijit/themes/claro/TitlePane_rtl.css
@@ -1,4 +1,4 @@
-
+/* TitlePane */
.claro .dijitTitlePaneRtl .dijitClosed .dijitArrowNode {
- background-position: -7px 0px;
+ background-position: -7px 0;
}
diff --git a/lib/dijit/themes/claro/TitlePane_rtl.less b/lib/dijit/themes/claro/TitlePane_rtl.less
new file mode 100644
index 000000000..693584f67
--- /dev/null
+++ b/lib/dijit/themes/claro/TitlePane_rtl.less
@@ -0,0 +1,7 @@
+/* TitlePane */
+
+@import "variables";
+
+.claro .dijitTitlePaneRtl .dijitClosed .dijitArrowNode {
+ background-position: -7px 0;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/claro/Toolbar.css b/lib/dijit/themes/claro/Toolbar.css
index 2189dcd4d..a9e6f4f5e 100644
--- a/lib/dijit/themes/claro/Toolbar.css
+++ b/lib/dijit/themes/claro/Toolbar.css
@@ -1,133 +1,158 @@
-
+/* Toolbar
+ *
+ * Styling Toolbar means styling the toolbar container and the widget inside toolbar (dijitToolbar)
+ *
+ * 1. toolbar (default styling):
+ * .dijitToolbar - styles for outer container
+ *
+ * 2. widget inside toolbar
+ * .dijitToolbar .dijitButtonNode - Button widget
+ * .dijitComboButton - ComboButton widget
+ * .dijitDropDownButton - DropDownButton widget
+ * .dijitToggleButton - ToggleButton widget
+ *
+ * 3. hovered widget inside toolbar (ie, mouse hover on the widget inside)
+ * .dijitToolbar .dijitButtonNodeHover - styles for hovered Button widget
+ *
+ * 4. actived widget inside toolbar (ie, mouse down on the widget inside)
+ * .dijitToolbar .dijitButtonNodeActive - mouse down on Button widget
+ */
.claro .dijitToolbar {
- border-bottom: 1px solid #b5bcc7;
- background-color: #f1f1f1;
- background-image: url("images/commonHighlight.png");
- background-position:0px 0px;
- background-repeat:repeat-x;
- padding: 2px 0px 2px 4px;
- zoom: 1;
+ border-bottom: 1px solid #b5bcc7;
+ background-color: #efefef;
+ background-image: url("images/commonHighlight.png");
+ background-position: 0 0;
+ background-repeat: repeat-x;
+ padding: 2px 0 2px 4px;
+ zoom: 1;
}
.claro .dijitToolbar label {
- padding: 0px 3px 0 6px;
+ padding: 0 3px 0 6px;
}
+/** override claro/form/Button.css **/
.claro .dijitToolbar .dijitButtonNode {
- border:none;
- padding: 2px;
- background-image: url("images/commonHighlight.png");
- background-position:0 -30px;
- background-repeat:repeat-x;
- background-color:rgba(171,214,255,0);
- border-radius: 2px;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- -webkit-transition-property:background-color;
- -webkit-transition-duration:.3s, .35s;
-}
-.claro .dijitToolbar .dijitComboButton .dijitButtonNode{
- padding: 3px 2px 3px 2px;
+ border-width: 0;
+ /* on hover/active, border-->1px, padding-->1px */
+
+ padding: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ -webkit-transition-property: background-color;
+ -moz-transition-property: background-color;
+ transition-property: background-color;
+ -webkit-transition-duration: 0.3s, 0.35s;
+ -moz-transition-duration: 0.3s, 0.35s;
+ transition-duration: 0.3s, 0.35s;
+ background-image: url("images/commonHighlight.png");
+ background-position: 0 -30px;
+ background-repeat: repeat-x;
+ background-color: rgba(171, 214, 255, 0);
}
.dj_ie .claro .dijitToolbar .dijitButtonNode {
- background-color: transparent;
+ background-color: transparent;
+ /* for IE, which doesn't understand rgba(...) */
+
}
.dj_ie6 .claro .dijitToolbar .dijitButtonNode {
- background: none;
+ background: none;
+ /* because background-color: transparent above doesn't work */
+
}
-.claro .dijitToolbar .dijitComboBox .dijitButtonNode {
- padding: 0px;
+.claro .dijitToolbar .dijitComboButton .dijitStretch {
+ /* no rounded border on side adjacent to arrow */
+
+ -moz-border-radius: 2px 0 0 2px;
+ border-radius: 2px 0 0 2px;
}
-.claro .dijitToolbar .dijitComboButton {
- padding: 1px;
+.claro .dijitToolbar .dijitComboButton .dijitArrowButton {
+ /* no rounded border on side adjacent to button */
+
+ -moz-border-radius: 0 2px 2px 0;
+ border-radius: 0 2px 2px 0;
+}
+.claro .dijitToolbar .dijitComboBox .dijitButtonNode {
+ padding: 0;
}
+/* hover status */
.claro .dijitToolbar .dijitButtonHover .dijitButtonNode,
.claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
-.claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode {
- background-position:0 0;
- border:solid 1px #769dc0;
- background-color: #abd6ff;
- padding: 1px;
-}
-.claro .dijitToolbar .dijitComboButtonHover {
- background-color: #abd6ff;
- border: solid 1px #769dc0;
- padding: 0px;
-}
-.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode,
-.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
- background-position:0 0;
- padding: 2px;
-}
-.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
- background-color: #7dd6fa;
-}
-.claro .dijitToolbar .dijitButtonActive .dijitButtonNode,
-.claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode,
-.claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
- border:solid 1px #769dc0;
- background-color:#7dbefa;
- background-position:0px -177px;
- padding: 1px;
+.claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode,
+.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode {
+ background-position: 0 0;
+ border-width: 1px;
+ background-color: #abd6ff;
+ padding: 1px;
+}
+.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode, .claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
+ background-position: 0 0;
+ background-color: #f4ffff;
+}
+.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNodeHover, .claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButtonHover {
+ background-color: #abd6ff;
+}
+/* active status */
+.claro .dijitToolbar .dijitButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
+ border-width: 1px;
+ background-color: #7dbefa;
+ background-position: 0 -177px;
+ padding: 1px;
}
.claro .dijitToolbar .dijitComboButtonActive {
- -webkit-transition-duration:.2s;
- border: solid 1px #769dc0;
- padding: 0px;
+ -webkit-transition-duration: 0.2s;
+ -moz-transition-duration: 0.2s;
+ transition-duration: 0.2s;
+ border-width: 1px;
+ padding: 0;
}
-.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode {
- background-color: #7dbefa;
- background-position:0px -177px;
- padding: 2px;
+.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
+ background-color: #f4ffff;
+ background-position: 0 -177px;
+ padding: 2px;
}
-.claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonActive {
- background-color: #7dbefa;
+.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNodeActive {
+ background-color: #7dbefa;
}
-.claro .dijitToolbar .dijitToggleButtonChecked .dijitButtonNode {
- border-color: #769dc0;
- background-color:#fff;
- padding: 1px;
+.claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButtonActive {
+ background-color: #7dbefa;
}
-.dj_ie6 .claro .dijitToolbar .dijitButtonContents,
-.dj_ie7 .claro .dijitToolbar .dijitButtonContents {
- margin: -2px 0;
- padding: 0;
+/* Avoid double border between button and arrow */
+.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton, .claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
+ border-left-width: 0;
}
-.dj_ie6 .claro .dijitToolbar {
- background-image: none;
+.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
+ padding-left: 2px;
+ /* since there's no left border, don't reduce from 2px --> 1px */
+
}
-.dj_ie6 .claro .dijitToolbar .dijitButtonNode {
- margin: 1px;
- border: none;
-}
-.dj_ie6 .claro .dijitToolbar .dijitButtonHover .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNodeHover,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover,
-.dj_ie6 .claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitButtonActive .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNodeActive,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonActive,
-.dj_ie6 .claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode,
+/* toggle button checked status */
.claro .dijitToolbar .dijitToggleButtonChecked .dijitButtonNode {
- margin: 0;
- border-width: 1px;
- border-style: solid;
- background-image: none;
+ margin: 0;
+ /* remove margin and add a border */
+
+ border-width: 1px;
+ border-style: solid;
+ background-image: none;
+ border-color: #769dc0;
+ background-color: #ffffff;
+ padding: 1px;
}
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNodeHover,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNodeActive,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonActive {
- padding: 1px;
+.dj_ie6 .claro .dijitToolbar {
+ background-image: none;
}
.claro .dijitToolbarSeparator {
-
- background: url('../../icons/images/editorIconsEnabled.png');
+ /* separator icon in the editor sprite */
+
+ background: url('../../icons/images/editorIconsEnabled.png');
}
+/* Toolbar inside of disabled Editor */
.claro .dijitDisabled .dijitToolbar {
- background:none;
- background-color:#f5f5f5;
- border-bottom: 1px solid #d3d3d3;
+ background: none;
+ background-color: #efefef;
+ border-bottom: 1px solid #d3d3d3;
+}
+.claro .dijitToolbar .dijitComboBoxDisabled .dijitArrowButtonInner {
+ background-position: 0 50%;
}
diff --git a/lib/dijit/themes/claro/Toolbar.less b/lib/dijit/themes/claro/Toolbar.less
new file mode 100644
index 000000000..eb99f2f23
--- /dev/null
+++ b/lib/dijit/themes/claro/Toolbar.less
@@ -0,0 +1,157 @@
+/* Toolbar
+ *
+ * Styling Toolbar means styling the toolbar container and the widget inside toolbar (dijitToolbar)
+ *
+ * 1. toolbar (default styling):
+ * .dijitToolbar - styles for outer container
+ *
+ * 2. widget inside toolbar
+ * .dijitToolbar .dijitButtonNode - Button widget
+ * .dijitComboButton - ComboButton widget
+ * .dijitDropDownButton - DropDownButton widget
+ * .dijitToggleButton - ToggleButton widget
+ *
+ * 3. hovered widget inside toolbar (ie, mouse hover on the widget inside)
+ * .dijitToolbar .dijitButtonNodeHover - styles for hovered Button widget
+ *
+ * 4. actived widget inside toolbar (ie, mouse down on the widget inside)
+ * .dijitToolbar .dijitButtonNodeActive - mouse down on Button widget
+ */
+
+@import "variables";
+
+.claro .dijitToolbar {
+ border-bottom: 1px solid @border-color;
+ background-color: @bar-background-color;
+ background-image: url("images/commonHighlight.png");
+ background-position:0 0;
+ background-repeat:repeat-x;
+ padding: 2px 0 2px 4px;
+ zoom: 1;
+}
+
+.claro .dijitToolbar label {
+ padding: 0 3px 0 6px;
+}
+
+/** override claro/form/Button.css **/
+.claro .dijitToolbar .dijitButtonNode {
+ border-width: 0; /* on hover/active, border-->1px, padding-->1px */
+ padding: 2px;
+ .border-radius(@toolbar-button-border-radius);
+ .box-shadow(none);
+ .transition-property(background-color);
+ .transition-duration(.3s, .35s);
+
+ background-image: url("images/commonHighlight.png");
+ background-position:0 -30px;
+ background-repeat:repeat-x;
+ background-color:rgba(171,214,255,0);
+}
+.dj_ie .claro .dijitToolbar .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 */
+}
+
+.claro .dijitToolbar .dijitComboButton .dijitStretch {
+ /* no rounded border on side adjacent to arrow */
+ .border-radius(@toolbar-button-border-radius 0 0 @toolbar-button-border-radius);
+}
+.claro .dijitToolbar .dijitComboButton .dijitArrowButton {
+ /* no rounded border on side adjacent to button */
+ .border-radius(0 @toolbar-button-border-radius @toolbar-button-border-radius 0);
+}
+
+.claro .dijitToolbar .dijitComboBox .dijitButtonNode {
+ padding: 0;
+}
+
+/* hover status */
+.claro .dijitToolbar .dijitButtonHover .dijitButtonNode,
+.claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
+.claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode,
+.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode {
+ background-position:0 0;
+ border-width:1px;
+ background-color: @hovered-background-color;
+ padding: 1px;
+}
+.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode,
+.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
+ background-position:0 0;
+ background-color: @toolbar-combobutton-hovered-unhoveredsection-background-color;
+}
+.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNodeHover,
+.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButtonHover {
+ background-color: @hovered-background-color;
+}
+
+/* active status */
+.claro .dijitToolbar .dijitButtonActive .dijitButtonNode,
+.claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode,
+.claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
+ border-width: 1px;
+ background-color:@pressed-background-color;
+ background-position:0 -177px;
+ padding: 1px;
+}
+.claro .dijitToolbar .dijitComboButtonActive {
+ .transition-duration(.2s);
+ border-width: 1px;
+ padding: 0;
+}
+.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode,
+.claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
+ background-color: @toolbar-combobutton-hovered-unhoveredsection-background-color;
+ background-position:0 -177px;
+ padding: 2px;
+}
+.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNodeActive {
+ background-color: @pressed-background-color;
+}
+.claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButtonActive {
+ background-color: @pressed-background-color;
+}
+
+/* Avoid double border between button and arrow */
+.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton,
+.claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
+ border-left-width: 0;
+}
+.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
+ padding-left: 2px; /* since there's no left border, don't reduce from 2px --> 1px */
+}
+
+/* toggle button checked status */
+.claro .dijitToolbar .dijitToggleButtonChecked .dijitButtonNode {
+ margin: 0; /* remove margin and add a border */
+ border-width: 1px;
+ border-style: solid;
+ background-image: none;
+ border-color: @selected-border-color;
+ background-color: @toolbar-button-checked-background-color;
+ padding: 1px;
+}
+
+.dj_ie6 .claro .dijitToolbar {
+ background-image: none;
+}
+
+.claro .dijitToolbarSeparator {
+ /* separator icon in the editor sprite */
+ background: url('../../icons/images/editorIconsEnabled.png');
+}
+
+/* Toolbar inside of disabled Editor */
+.claro .dijitDisabled .dijitToolbar {
+ background:none;
+ background-color:@disabled-background-color;
+ border-bottom: 1px solid @disabled-border-color;
+}
+
+.claro .dijitToolbar .dijitComboBoxDisabled .dijitArrowButtonInner {
+ background-position:0 50%;
+}
+
diff --git a/lib/dijit/themes/claro/Toolbar_rtl.css b/lib/dijit/themes/claro/Toolbar_rtl.css
new file mode 100644
index 000000000..2fab1de32
--- /dev/null
+++ b/lib/dijit/themes/claro/Toolbar_rtl.css
@@ -0,0 +1,30 @@
+/* Toolbar RTL */
+/* Repeated rules from Toolbar.css to override rule from Button_rtl.css, which is loaded after Toolbar.css */
+.claro .dijitToolbar .dijitComboButtonRtl .dijitButtonNode {
+ border-width: 0;
+ padding: 2px;
+}
+.claro .dijitToolbar .dijitComboButtonRtlHover .dijitButtonNode, .claro .dijitToolbar .dijitComboButtonRtlActive .dijitButtonNode {
+ border-width: 1px;
+ padding: 1px;
+}
+.claro .dijitToolbar .dijitComboButtonRtl .dijitStretch {
+ /* no rounded border on side adjacent to arrow */
+
+ -moz-border-radius: 0 2px 2px 0;
+ border-radius: 0 2px 2px 0;
+}
+.claro .dijitToolbar .dijitComboButtonRtl .dijitArrowButton {
+ /* no rounded border on side adjacent to button */
+
+ -moz-border-radius: 2px 0 0 2px;
+ border-radius: 2px 0 0 2px;
+}
+.claro .dijitToolbar .dijitComboButtonRtlHover .dijitArrowButton, .claro .dijitToolbar .dijitComboButtonRtlActive .dijitArrowButton {
+ /* border between button and arrow */
+
+ border-left-width: 1px;
+ border-right-width: 0;
+ padding-left: 1px;
+ padding-right: 2px;
+}
diff --git a/lib/dijit/themes/claro/Toolbar_rtl.less b/lib/dijit/themes/claro/Toolbar_rtl.less
new file mode 100644
index 000000000..8d31c88f4
--- /dev/null
+++ b/lib/dijit/themes/claro/Toolbar_rtl.less
@@ -0,0 +1,32 @@
+/* Toolbar RTL */
+
+@import "variables";
+
+/* Repeated rules from Toolbar.css to override rule from Button_rtl.css, which is loaded after Toolbar.css */
+.claro .dijitToolbar .dijitComboButtonRtl .dijitButtonNode {
+ border-width: 0;
+ padding: 2px;
+}
+.claro .dijitToolbar .dijitComboButtonRtlHover .dijitButtonNode,
+.claro .dijitToolbar .dijitComboButtonRtlActive .dijitButtonNode {
+ border-width: 1px;
+ padding: 1px;
+}
+
+.claro .dijitToolbar .dijitComboButtonRtl .dijitStretch {
+ /* no rounded border on side adjacent to arrow */
+ .border-radius(0 2px 2px 0);
+}
+.claro .dijitToolbar .dijitComboButtonRtl .dijitArrowButton {
+ /* no rounded border on side adjacent to button */
+ .border-radius(2px 0 0 2px);
+}
+
+.claro .dijitToolbar .dijitComboButtonRtlHover .dijitArrowButton,
+.claro .dijitToolbar .dijitComboButtonRtlActive .dijitArrowButton {
+ /* border between button and arrow */
+ border-left-width: 1px;
+ border-right-width: 0;
+ padding-left: 1px;
+ padding-right: 2px;
+}
diff --git a/lib/dijit/themes/claro/Tree.css b/lib/dijit/themes/claro/Tree.css
index 739a4931e..069deb80a 100644
--- a/lib/dijit/themes/claro/Tree.css
+++ b/lib/dijit/themes/claro/Tree.css
@@ -1,88 +1,134 @@
-
+/* Tree
+ *
+ * Styling Tree mostly means styling the TreeRow (dijitTreeRow)
+ * There are 4 basic states to style:
+ *
+ * Tree Row:
+ * 1. tree row (default styling):
+ * .dijitTreeRow - styles for each row of the tree
+ *
+ * 2. hovered tree row (mouse hover on a tree row)
+ * .dijitTreeRowHover - styles when mouse over on one row
+ *
+ * 3. active tree row (mouse down on a tree row)
+ * .dijitTreeRowActive - styles when mouse down on one row
+ *
+ * 4. selected tree row
+ * dijitTreeRowSelected - style when the row has been selected
+ *
+ * Tree Expando:
+ * dijitTreeExpando - the expando at the left of the text of each tree row
+ *
+ * Drag and Drop on TreeNodes: (insert line on dijitTreeContent node so it'll aligned w/ target element)
+ * .dijitTreeNode .dojoDndItemBefore/.dojoDndItemAfter - use border style simulate a separate line
+ */
.claro .dijitTreeNode {
- zoom: 1;
+ zoom: 1;
+ /* force layout on IE (TODO: may not be needed anymore) */
+
}
.claro .dijitTreeIsRoot {
- background-image: none;
-}
-.claro .dijitTreeRow {
-
- padding: 4px 1px 2px 0px;
- margin-left: 1px;
- background-image: url("images/commonHighlight.png");
- background-position:0px 0px;
- background-repeat:repeat-x;
- border-color: rgba(118,157,192,0);
- background-color: rgba(171,214,255,0);
- -webkit-transition-property:background-color, border-color;
- -webkit-transition-duration:.25s ;
- -webkit-transition-timing-function: ease-out;
+ background-image: none;
+}
+/* Styling for basic tree node (unhovered, unselected)
+ * Also use this styling when dropping between items on the tree (in other words, don't
+ * use hover effect)
+ */
+.claro .dijitTreeRow, .claro .dijitTreeNode .dojoDndItemBefore, .claro .dijitTreeNode .dojoDndItemAfter {
+ /* so insert line shows up on IE when dropping after a target element */
+
+ padding: 4px 1px 2px 0;
+ margin: 0 1px;
+ /* replaced by border for selected/hovered row */
+
+ 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;
+ -webkit-transition-property: background-color, border-color;
+ -moz-transition-property: background-color, border-color;
+ transition-property: background-color, border-color;
+ -webkit-transition-duration: 0.25s;
+ -moz-transition-duration: 0.25s;
+ transition-duration: 0.25s;
+ -webkit-transition-timing-function: ease-out;
+ -moz-transition-timing-function: ease-out;
+ transition-timing-function: ease-out;
}
.dj_ie6 .claro .dijitTreeRow {
- background-image: none;
+ background-image: none;
}
.claro .dijitTreeRowSelected {
- background-repeat:repeat-x;
- background-color:#d8edff;
- padding: 3px 0px 1px;
- margin-left: 0px;
- border:solid 1px #c3e2fd;
- color:#000;
+ background-repeat: repeat-x;
+ background-color: #cfe5fa;
+ padding: 3px 0 1px;
+ margin: 0;
+ border: solid 1px #769dc0;
+ color: #000000;
}
.claro .dijitTreeRowHover {
- background-color:#abd6ff;
- padding: 3px 0px 1px;
- margin-left: 0px;
- border:solid 1px #769dc0;
- color:#000;
- -webkit-transition-duration:.25s ;
+ background-color: #abd6ff;
+ padding: 3px 0 1px;
+ margin: 0;
+ border: solid 1px #769dc0;
+ color: #000000;
+ -webkit-transition-duration: 0.25s;
+ -moz-transition-duration: 0.25s;
+ transition-duration: 0.25s;
}
.claro .dijitTreeRowActive {
- background-color:#7dbefa;
- background-position:0px -177px;
- padding: 3px 0px 1px;
- margin-left: 0px;
- border:solid 1px #769dc0;
- color:#000;
+ background-color: #7dbefa;
+ background-position: 0 -177px;
+ padding: 3px 0 1px;
+ margin-left: 0;
+ border: solid 1px #769dc0;
+ color: #000000;
}
.dj_ie6 .claro .dijitTreeRowActive {
- background-image: none;
+ background-image: none;
}
.claro .dijitTreeRowFocused {
- background-repeat: repeat;
+ background-repeat: repeat;
}
+/* expando (open/closed) icon */
.claro .dijitTreeExpando {
- background-image: url('images/treeExpandImages.png');
- width: 16px;
- height: 16px;
- background-position: -35px 0px
+ background-image: url('images/treeExpandImages.png');
+ width: 16px;
+ height: 16px;
+ background-position: -35px 0;
+ /* for dijitTreeExpandoOpened */
+
}
.dj_ie6 .claro .dijitTreeExpando {
- background-image: url('images/treeExpandImages8bit.png');
+ background-image: url('images/treeExpandImages8bit.png');
}
.claro .dijitTreeRowHover .dijitTreeExpandoOpened {
- background-position: -53px 0px;
+ background-position: -53px 0;
}
.claro .dijitTreeExpandoClosed {
- background-position: 1px 0px;
+ background-position: 1px 0;
}
.claro .dijitTreeRowHover .dijitTreeExpandoClosed {
- background-position: -17px 0px;
+ background-position: -17px 0;
}
-.claro .dijitTreeExpandoLeaf{
- background-image:none;
+.claro .dijitTreeExpandoLeaf, .dj_ie6 .claro .dijitTreeExpandoLeaf {
+ background-image: none;
}
.claro .dijitTreeExpandoLoading {
- background-image: url('images/loadingAnimation.gif');
-}
-.claro .dijitTreeNode .dojoDndItemBefore,
-.claro .dijitTreeNode .dojoDndItemAfter {
- border-bottom: none;
- border-top: none;
+ background-image: url('images/loadingAnimation.gif');
}
+/* Drag and Drop on TreeNodes
+ * Put insert line on dijitTreeContent node so it's aligned w/
+ * (ie, indented equally with) target element, even
+ * though dijitTreeRowNode is the actual "drag object"
+ */
.claro .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
- border-top: 2px solid #369;
+ border-top: 2px solid #769dc0;
}
.claro .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
- border-bottom: 2px solid #369;
+ border-bottom: 2px solid #769dc0;
}
diff --git a/lib/dijit/themes/claro/Tree.less b/lib/dijit/themes/claro/Tree.less
new file mode 100644
index 000000000..4e639ca4f
--- /dev/null
+++ b/lib/dijit/themes/claro/Tree.less
@@ -0,0 +1,133 @@
+/* Tree
+ *
+ * Styling Tree mostly means styling the TreeRow (dijitTreeRow)
+ * There are 4 basic states to style:
+ *
+ * Tree Row:
+ * 1. tree row (default styling):
+ * .dijitTreeRow - styles for each row of the tree
+ *
+ * 2. hovered tree row (mouse hover on a tree row)
+ * .dijitTreeRowHover - styles when mouse over on one row
+ *
+ * 3. active tree row (mouse down on a tree row)
+ * .dijitTreeRowActive - styles when mouse down on one row
+ *
+ * 4. selected tree row
+ * dijitTreeRowSelected - style when the row has been selected
+ *
+ * Tree Expando:
+ * dijitTreeExpando - the expando at the left of the text of each tree row
+ *
+ * Drag and Drop on TreeNodes: (insert line on dijitTreeContent node so it'll aligned w/ target element)
+ * .dijitTreeNode .dojoDndItemBefore/.dojoDndItemAfter - use border style simulate a separate line
+ */
+
+@import "variables";
+
+.claro .dijitTreeNode {
+ zoom: 1; /* force layout on IE (TODO: may not be needed anymore) */
+}
+.claro .dijitTreeIsRoot {
+ background-image: none;
+}
+
+/* Styling for basic tree node (unhovered, unselected)
+ * Also use this styling when dropping between items on the tree (in other words, don't
+ * use hover effect)
+ */
+.claro .dijitTreeRow,
+.claro .dijitTreeNode .dojoDndItemBefore,
+.claro .dijitTreeNode .dojoDndItemAfter {
+ /* so insert line shows up on IE when dropping after a target element */
+ padding: 4px 1px 2px 0;
+ margin: 0 1px; /* replaced by border for selected/hovered row */
+
+ 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;
+
+ .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;
+ padding: 3px 0 1px;
+ margin: 0;
+ border:solid 1px @selected-border-color;
+ color:@selected-text-color;
+}
+.claro .dijitTreeRowHover {
+ background-color:@hovered-background-color;
+ padding: 3px 0 1px;
+ margin: 0;
+ border:solid 1px @hovered-border-color;
+ color:@hovered-text-color;
+ .transition-duration(.25s);
+}
+.claro .dijitTreeRowActive {
+ background-color:@pressed-background-color;
+ 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 {
+ background-image: none;
+}
+.claro .dijitTreeRowFocused {
+ background-repeat: repeat;
+}
+
+/* expando (open/closed) icon */
+
+.claro .dijitTreeExpando {
+ background-image: url('images/treeExpandImages.png');
+ width: 16px;
+ height: 16px;
+ background-position: -35px 0; /* for dijitTreeExpandoOpened */
+}
+.dj_ie6 .claro .dijitTreeExpando {
+ background-image: url('images/treeExpandImages8bit.png');
+}
+.claro .dijitTreeRowHover .dijitTreeExpandoOpened {
+ background-position: -53px 0;
+}
+.claro .dijitTreeExpandoClosed {
+ background-position: 1px 0;
+}
+.claro .dijitTreeRowHover .dijitTreeExpandoClosed {
+ background-position: -17px 0;
+}
+.claro .dijitTreeExpandoLeaf,
+.dj_ie6 .claro .dijitTreeExpandoLeaf {
+ background-image:none;
+}
+.claro .dijitTreeExpandoLoading {
+ background-image: url('images/loadingAnimation.gif');
+}
+
+/* Drag and Drop on TreeNodes
+ * Put insert line on dijitTreeContent node so it's aligned w/
+ * (ie, indented equally with) target element, even
+ * though dijitTreeRowNode is the actual "drag object"
+ */
+.claro .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
+ border-top: 2px solid @dnd-dropseparator-color; // TODO: normal separator is just 1px, why is this 2px?
+}
+.claro .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
+ border-bottom: 2px solid @dnd-dropseparator-color; // TODO: normal separator is just 1px, why is this 2px?
+}
diff --git a/lib/dijit/themes/claro/claro.css b/lib/dijit/themes/claro/claro.css
index 7ed7f1856..d3cb2688c 100644
--- a/lib/dijit/themes/claro/claro.css
+++ b/lib/dijit/themes/claro/claro.css
@@ -1,4689 +1,28 @@
+@import url("../dijit.css");
+@import url("../../icons/commonIcons.css");/*sprite containing common icons to be used by all themes*/
+@import url("Common.css");
+@import url("form/Common.css");
+@import url("form/Button.css");
+@import url("form/Checkbox.css");
+@import url("form/RadioButton.css");
+@import url("form/Select.css");
+@import url("layout/TabContainer.css");
+@import url("Dialog.css");
+@import url("layout/AccordionContainer.css");
+@import url("layout/ContentPane.css");
+@import url("Calendar.css");
+@import url("Menu.css");
+@import url("form/Slider.css");
+@import url("ColorPalette.css");
+@import url("InlineEditBox.css");
+@import url("ProgressBar.css");
+@import url("TimePicker.css");
+@import url("layout/BorderContainer.css");
+@import url("Tree.css");
+@import url("Toolbar.css");
+@import url("Editor.css");/*in order to test button or menu item with icon */
+@import url("../../icons/editorIcons.css"); /*sprite for editor icons to be used by all themes*/
+@import url("TitlePane.css");
+@import url("form/NumberSpinner.css");
-.dijitReset {
-
- margin:0;
- border:0;
- padding:0;
- line-height:normal;
- font: inherit;
- color: inherit;
-}
-.dijit_a11y .dijitReset {
- -moz-appearance: none;
-}
-.dijitInline {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
- border:0;
- padding:0;
- vertical-align:middle;
- #vertical-align: auto;
-}
-.dijitHidden {
-
- display: none !important;
-}
-.dijitVisible {
-
- display: block !important;
- position: relative;
-}
-.dijitInputContainer {
-
- #zoom: 1;
- overflow: hidden;
- float: none !important;
- position:relative;
-}
-.dj_ie INPUT.dijitTextBox,
-.dj_ie .dijitTextBox INPUT {
- font-size: 100%;
-}
-.dijitTextBox .dijitSpinnerButtonContainer,
-.dijitTextBox .dijitArrowButtonContainer,
-.dijitTextBox .dijitValidationContainer {
- float: right;
- text-align: center;
-}
-.dijitTextBox INPUT.dijitInputField {
-
- padding-left: 0 !important;
- padding-right: 0 !important;
-}
-.dijitTextBox .dijitValidationContainer {
- display: none;
-}
-.dijitInlineTable {
-
- display:inline-table;
- display:inline-block;
- #zoom: 1;
- #display:inline;
- box-sizing: content-box; -moz-box-sizing: content-box;
- border:0;
- padding:0;
-}
-.dijitTeeny {
- font-size:1px;
- line-height:1px;
-}
-.dijitOffScreen {
- position: absolute;
- visibility: hidden;
- left: 50%;
- top: -10000px;
-}
-.dijitPopup {
- position: absolute;
- background-color: transparent;
- margin: 0;
- border: 0;
- padding: 0;
-}
-.dijit_a11y .dijitPopup,
-.dijit_ally .dijitPopup DIV,
-.dijit_a11y .dijitPopup TABLE,
-.dijit_a11y .dijitTooltipContainer {
- background-color: white !important;
-}
-.dijitPositionOnly {
-
- padding: 0 !important;
- border: 0 !important;
- background-color: transparent !important;
- background-image: none !important;
- height: auto !important;
- width: auto !important;
-}
-.dijitNonPositionOnly {
-
- float: none !important;
- position: static !important;
- margin: 0 0 0 0 !important;
- vertical-align: middle !important;
-}
-.dijitBackgroundIframe {
-
- position: absolute;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- border: 0;
- padding: 0;
- margin: 0;
-}
-.dijitDisplayNone {
-
- display:none !important;
-}
-.dijitContainer {
-
- overflow: hidden;
-}
-.dijit_a11y * {
- background-image:none !important;
-}
-.dijit_a11y .dijitIcon,
-.dijit_a11y DIV.dijitArrowButtonInner,
-.dijit_a11y SPAN.dijitArrowButtonInner,
-.dijit_a11y IMG.dijitArrowButtonInner,
-.dijit_a11y .dijitCalendarIncrementControl {
-
- display: none;
-}
-.dijitSpinner DIV.dijitArrowButtonInner {
- display: block;
-}
-.dijit_a11y .dijitA11ySideArrow {
- display: inline !important;
- cursor: pointer;
-}
-.dijit_a11y .dijitCalendarDateLabel {
- padding: 1px;
-}
-.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
- border-style: dotted !important;
- border-width: 1px;
- padding: 0px;
-}
-.dijit_a11y .dijitCalendarDateTemplate {
- padding-bottom: 0.1em !important;
-}
-.dijit_a11y .dijit * {
- background:white !important;
- color:black !important;
-}
-.dijit_a11y .dijitButtonNode {
- border-color: black!important;
- border-style: outset!important;
- border-width: medium!important;
-}
-.dijit_a11y .dijitTextBoxReadOnly .dijitInputField,
-.dijit_a11y .dijitTextBoxReadOnly .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
-.dijitButtonNode * {
- vertical-align: middle;
-}
-.dijitButtonNode .dijitArrowButtonInner {
-
- background: no-repeat center;
- width: 12px;
- height: 12px;
- direction: ltr;
-}
-.dijitLeft {
-
- background-position:left top;
- background-repeat:no-repeat;
-}
-.dijitStretch {
-
- white-space:nowrap;
- background-repeat:repeat-x;
-}
-.dijitRight {
-
- #display:inline;
- background-position:right top;
- background-repeat:no-repeat;
-}
-.dijitToggleButton,
-.dijitButton,
-.dijitDropDownButton,
-.dijitComboButton {
-
- margin: 0.2em;
-}
-.dijitButtonContents {
- display: block;
-}
-td.dijitButtonContents {
- display: table-cell;
-}
-.dijitButtonNode IMG {
-
- vertical-align:middle;
-
-}
-TABLE.dijitComboButton {
-
- border-collapse: collapse;
- border:0;
- padding:0;
- margin:0;
-}
-.dijitToolbar .dijitComboButton {
-
- border-collapse: separate;
-}
-.dijitToolbar .dijitToggleButton,
-.dijitToolbar .dijitButton,
-.dijitToolbar .dijitDropDownButton,
-.dijitToolbar .dijitComboButton {
- margin: 0;
-}
-.dijitToolbar .dijitButtonContents {
-
- padding: 1px 2px;
-}
-.dj_ie .dijitComboButton {
-
- margin-bottom: -3px;
-}
-.dj_webkit .dijitToolbar .dijitDropDownButton {
- padding-left: 0.3em;
-}
-.dj_gecko .dijitToolbar .dijitButtonNode::-moz-focus-inner {
- padding:0;
-}
-.dijitButtonNode {
-
- border:1px solid gray;
- margin:0;
- line-height:normal;
- vertical-align: middle;
- #vertical-align: auto;
- text-align:center;
- white-space: nowrap;
-}
-.dj_webkit .dijitSpinner .dijitSpinnerButtonContainer {
-
- line-height:inherit;
-}
-.dijitTextBox .dijitButtonNode {
- border-width: 0;
-}
-.dijitButtonNode,
-.dijitButtonNode * {
- cursor: pointer;
-}
-.dj_ie .dijitButtonNode {
-
- zoom: 1;
-}
-.dj_ie .dijitButtonNode button {
-
- overflow: visible;
-}
-DIV.dijitArrowButton {
- float: right;
-}
-.dijitTextBox {
- border: solid black 1px;
- #overflow: hidden;
- width: 15em;
- vertical-align: middle;
- #vertical-align: auto;
-}
-.dijitTextBoxReadOnly,
-.dijitTextBoxDisabled {
- color: gray;
-}
-.dj_webkit .dijitTextBoxDisabled INPUT {
- color: #eee;
-}
-.dj_webkit TEXTAREA.dijitTextAreaDisabled {
- color: #333;
-}
-.dj_gecko .dijitTextBoxReadOnly INPUT,
-.dj_gecko .dijitTextBoxDisabled INPUT {
- -moz-user-input: none;
-}
-.dijitPlaceHolder {
-
- color: #AAAAAA;
- font-style: italic;
- position: absolute;
- top: 0;
- left: 0;
- #filter: "";
-}
-.dijitTimeTextBox {
- width: 8em;
-}
-.dijitTextBox INPUT:focus {
- outline: none;
-}
-.dijitTextBoxFocused {
- outline: auto 5px -webkit-focus-ring-color;
-}
-.dijitTextBox INPUT {
- float: left;
-}
-.dijitInputInner {
-
- border:0 !important;
- vertical-align:middle !important;
- background-color:transparent !important;
- width:100% !important;
-
- padding-left: 0 !important;
- padding-right: 0 !important;
- margin-left: 0 !important;
- margin-right: 0 !important;
-}
-.dijit_a11y .dijitTextBox INPUT {
- margin: 0 !important;
-}
-.dijitTextBoxError INPUT.dijitValidationInner,
-.dijitTextBox INPUT.dijitArrowButtonInner {
-
- text-indent: -1em !important;
- direction: ltr !important;
- text-align: left !important;
- height: auto !important;
- #text-indent: 0 !important;
- #letter-spacing: -5em !important;
- #text-align: right !important;
-}
-.dj_ie .dijitTextBox INPUT,
-.dj_ie INPUT.dijitTextBox {
- overflow-y: visible;
- line-height: normal;
-}
-.dj_ie7 .dijitTextBox INPUT.dijitValidationInner,
-.dj_ie7 .dijitTextBox INPUT.dijitArrowButtonInner {
- line-height: 86%;
-}
-.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%;
-}
-.dijit_a11y INPUT.dijitValidationInner,
-.dijit_a11y INPUT.dijitArrowButtonInner {
-
- text-indent: 0 !important;
- width: 1em !important;
- #text-align: left !important;
-}
-.dijitTextBoxError .dijitValidationContainer {
- display: inline;
- cursor: default;
-}
-.dijitSpinner .dijitSpinnerButtonContainer,
-.dijitComboBox .dijitArrowButtonContainer {
-
- border-width: 0 0 0 1px !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
-
- border-width: 0;
-}
-.dj_ie .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
- clear: both;
-}
-.dijit_a11y .dijitTextBox .dijitValidationContainer,
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBox .dijitArrowButtonContainer {
-
- border: solid black !important;
- border-width: 0 0 0 1px !important;
-}
-.dj_ie .dijitToolbar .dijitComboBox {
-
- vertical-align: middle;
-}
-.dijitTextBox .dijitSpinnerButtonContainer {
- width: 1em;
- position: relative !important;
- overflow: hidden;
-}
-.dijitSpinner .dijitSpinnerButtonInner {
- width:1em;
- visibility:hidden !important;
- overflow-x:hidden;
-}
-.dijitComboBox .dijitButtonNode,
-.dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 0;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border: 0 none !important;
-}
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner,
-.dijit_a11y .dijitSpinnerButtonContainer INPUT {
- width: 1em !important;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner {
- margin: 0 auto !important;
-}
-.dj_ie .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.3em !important;
- padding-right: 0.3em !important;
- margin-left: 0.3em !important;
- margin-right: 0.3em !important;
- width: 1.4em !important;
-}
-.dj_ie7 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.0em !important;
- padding-right: 0.0em !important;
- width: 1em !important;
-}
-.dj_ie6 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- margin-left: 0.1em !important;
- margin-right: 0.1em !important;
- width: 1em !important;
-}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- margin-left: 0 !important;
- margin-right: 0 !important;
- width: 2em !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
-
- padding: 0;
- position: absolute !important;
- right: 0;
- float: none;
- height: 50%;
- width: 100%;
- bottom: auto;
- left: 0;
- right: auto;
-}
-.dj_iequirks .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: auto;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitArrowButton {
- overflow: visible !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitDownArrowButton {
- top: 50%;
- border-top-width: 1px !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitUpArrowButton {
- #bottom: 50%;
- top: 0;
-}
-.dijitSpinner .dijitArrowButtonInner {
- margin: auto;
- overflow-x: hidden;
- height: 100% !important;
-}
-.dj_iequirks .dijitSpinner .dijitArrowButtonInner {
- height: auto !important;
-}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- -moz-transform: scale(0.5);
- -moz-transform-origin: center top;
- -webkit-transform: scale(0.5);
- -webkit-transform-origin: center top;
- -o-transform: scale(0.5);
- -o-transform-origin: center top;
- transform: scale(0.5);
- transform-origin: left top;
- padding-top: 0;
- padding-bottom: 0;
- padding-left: 0 !important;
- padding-right: 0 !important;
- width: 100%;
-}
-.dj_ie .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- zoom: 50%;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButtonInner {
- overflow: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 100%;
-}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 1em;
-}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- visibility: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- vertical-align:top;
- visibility: visible;
-}
-.dijit_a11y .dijitSpinnerButtonContainer {
- width: 1em;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 1px 0px 0px 0px;
- border-style: solid !important;
-}
-.dijitCheckBox,
-.dijitRadio,
-.dijitCheckBoxInput {
- padding: 0;
- border: 0;
- width: 16px;
- height: 16px;
- background-position:center center;
- background-repeat:no-repeat;
- overflow: hidden;
-}
-.dijitCheckBox INPUT,
-.dijitRadio INPUT {
- margin: 0;
- padding: 0;
- display: block;
-}
-.dijitCheckBoxInput {
-
- opacity: 0.01;
-}
-.dj_ie .dijitCheckBoxInput {
- filter: alpha(opacity=0);
-}
-.dijit_a11y .dijitCheckBox,
-.dijit_a11y .dijitRadio {
-
- width: auto !important;
- height: auto !important;
-}
-.dijit_a11y .dijitCheckBoxInput {
- opacity: 1;
- filter: none;
- width: auto;
- height: auto;
-}
-.dijitProgressBarEmpty {
-
- position:relative;overflow:hidden;
- border:1px solid black;
- z-index:0;
-}
-.dijitProgressBarFull {
-
- position:absolute;
- overflow:hidden;
- z-index:-1;
- top:0;
- width:100%;
-}
-.dj_ie6 .dijitProgressBarFull {
- height:1.6em;
-}
-.dijitProgressBarTile {
-
- position:absolute;
- overflow:hidden;
- top:0;
- left:0;
- bottom:0;
- right:0;
- margin:0;
- padding:0;
- width:auto;
- height:auto;
- background-color:#aaa;
- background-attachment: fixed;
-}
-.dijit_a11y .dijitProgressBarTile {
-
- border-width:2px;
- border-style:solid;
- background-color:transparent !important;
-}
-.dj_ie6 .dijitProgressBarTile {
-
- position:static;
-
- height:1.6em;
-}
-.dijitProgressBarIndeterminate .dijitProgressBarLabel {
- visibility:hidden;
-}
-.dijitProgressBarIndeterminate .dijitProgressBarTile {
-
-}
-.dijitProgressBarIndeterminateHighContrastImage {
- display:none;
-}
-.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
- display:block;
- position:absolute;
- top:0;
- bottom:0;
- margin:0;
- padding:0;
- width:100%;
- height:auto;
-}
-.dijitProgressBarLabel {
- display:block;
- position:static;
- width:100%;
- text-align:center;
- background-color:transparent !important;
-}
-.dijitTooltip {
- position: absolute;
- z-index: 2000;
- display: block;
-
- left: 50%;
- top: -10000px;
- overflow: visible;
-}
-.dijitTooltipContainer {
- border: solid black 2px;
- background: #b8b5b5;
- color: black;
- font-size: small;
-}
-.dijitTooltipFocusNode {
- padding: 2px 2px 2px 2px;
-}
-.dijitTooltipConnector {
- position: absolute;
-}
-.dijit_a11y .dijitTooltipConnector {
- display: none;
-}
-.dijitTooltipData {
- display:none;
-}
-.dijitLayoutContainer {
- position: relative;
- display: block;
- overflow: hidden;
-}
-body .dijitAlignTop,
-body .dijitAlignBottom,
-body .dijitAlignLeft,
-body .dijitAlignRight {
- position: absolute;
- overflow: hidden;
-}
-body .dijitAlignClient { position: absolute; }
-.dijitBorderContainer, .dijitBorderContainerNoGutter {
- position:relative;
- overflow: hidden;
-}
-.dijitBorderContainerPane,
-.dijitBorderContainerNoGutterPane {
- position: absolute !important;
- z-index: 2;
-}
-.dijitBorderContainer > .dijitTextArea {
-
- resize: none;
-}
-.dijitGutter {
-
- position: absolute;
- font-size: 1px;
-}
-.dijitSplitter {
- position: absolute;
- overflow: hidden;
- z-index: 10;
- background-color: #fff;
- border-color: gray;
- border-style: solid;
- border-width: 0;
-}
-.dj_ie .dijitSplitter {
- z-index: 1;
-}
-.dijitSplitterActive {
- z-index: 11 !important;
-}
-.dijitSplitterCover {
- position:absolute;
- z-index:-1;
- top:0;
- left:0;
- width:100%;
- height:100%;
-}
-.dijitSplitterCoverActive {
- z-index:3 !important;
-}
-.dj_ie .dijitSplitterCover {
- background: white;
- filter: alpha(opacity=0);
-}
-.dijitSplitterH {
- height: 7px;
- border-top:1px;
- border-bottom:1px;
- cursor: ns-resize;
-}
-.dijitSplitterV {
- width: 7px;
- border-left:1px;
- border-right:1px;
- cursor: ew-resize;
-}
-.dijitSplitContainer {
- position: relative;
- overflow: hidden;
- display: block;
-}
-.dj_ff3 .dijit_a11y div.dijitSplitter:focus {
- outline-style:dotted;
- outline-width: 2px;
-}
-.dijitSplitPane {
- position: absolute;
-}
-.dijitSplitContainerSizerH,
-.dijitSplitContainerSizerV {
- position:absolute;
- font-size: 1px;
- cursor: move;
- cursor: w-resize;
- background-color: ThreeDFace;
- border: 1px solid;
- border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
- margin: 0;
-}
-.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
- overflow:hidden;
- position:absolute;
- top:49%;
-}
-.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
- position:absolute;
- left:49%;
-}
-.dijitSplitterShadow,
-.dijitSplitContainerVirtualSizerH,
-.dijitSplitContainerVirtualSizerV {
- font-size: 1px;
- background-color: ThreeDShadow;
- -moz-opacity: 0.5;
- opacity: 0.5;
- filter: Alpha(Opacity=50);
- margin: 0;
-}
-.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
- cursor: w-resize;
-}
-.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
- cursor: n-resize;
-}
-.dijit_a11y .dijitSplitterH {
- border-top:1px solid #d3d3d3 !important;
- border-bottom:1px solid #d3d3d3 !important;
-}
-.dijit_a11y .dijitSplitterV {
- border-left:1px solid #d3d3d3 !important;
- border-right:1px solid #d3d3d3 !important;
-}
-.dijitContentPane {
- display: block;
- overflow: auto;
-}
-.dijitContentPaneSingleChild {
-
- overflow: hidden;
-}
-.dijitTitlePane {
- display: block;
- overflow: hidden;
-}
-.dijitTitlePaneTitle {
- cursor: pointer;
-}
-.dijitFixedOpen {
-
- cursor: default;
-}
-.dijitTitlePaneTitle * {
- vertical-align: middle;
-}
-.dijitTitlePane .dijitArrowNodeInner {
-
- display: none;
-}
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
-
- display:inline !important;
- font-family: monospace;
-}
-.dijit_a11y .dijitTitlePane .dijitArrowNode {
-
- display:none;
-}
-.dj_ie6 .dijitTitlePaneContentOuter,
-.dj_ie6 .dijitTitlePane .dijitTitlePaneTitle {
-
- zoom: 1;
-}
-.dijitColorPalette {
- border: 1px solid #999;
- background: #fff;
- position: relative;
-}
-img.dijitColorPaletteUnder {
-
- border-style: none;
- position: absolute;
- left: 0;
- top: 0;
-}
-.dijitColorPalette .dijitPaletteTable {
-
- padding: 2px 3px 3px 3px;
- position: relative;
- overflow: hidden;
- outline: 0;
- border-collapse: separate;
-}
-.dj_ie6 .dijitColorPalette .dijitPaletteTable,
-.dj_ie7 .dijitColorPalette .dijitPaletteTable,
-.dj_iequirks .dijitColorPalette .dijitPaletteTable {
-
- padding: 0;
- margin: 2px 3px 3px 3px;
-}
-.dijitColorPalette .dijitPaletteCell {
-
- height: 20px;
- width: 20px;
- font-size: 1px;
- vertical-align: middle;
- text-align: center;
-}
-.dijitColorPalette .dijitPaletteImg {
-
- width: 16px;
- height: 14px;
- border: 1px solid #999;
- cursor: default;
- vertical-align: middle;
-}
-.dj_iequirks .dijitColorPalette .dijitPaletteImg {
- margin: 1px;
-}
-.dijitPaletteTable td {
- padding: 0px;
-}
-.dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
-
- border: 1px solid #000;
-}
-.dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
-.dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
- border: 2px solid #000;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteTable,
-.dijit_a11y .dijitColorPalette .dijitPaletteTable * {
-
- background-color: transparent !important;
-}
-.dj_gecko .dijit_a11y .dijitColorPalette .dijitPaletteCellFocused .dijitPaletteImg {
- border: 3px dotted #000;
- margin: -1px;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
- border: 2px solid #000 !important;
-}
-.dijitAccordionContainer {
- border:1px solid #b7b7b7;
- border-top:0 !important;
-}
-.dijitAccordionTitle {
- cursor: pointer;
-}
-.dijitAccordionTitleSelected {
- cursor: default;
-}
-.dijitAccordionTitle .arrowTextUp,
-.dijitAccordionTitle .arrowTextDown {
- display: none;
- font-size: 0.65em;
- font-weight: normal !important;
-}
-.dijit_a11y .dijitAccordionTitle .arrowTextUp,
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextDown {
- display: inline;
-}
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextUp {
- display: none;
-}
-.dj_ie6 .dijitAccordionTitle,
-.dj_iequirks .dijitAccordionTitle {
-
- zoom: 1;
-}
-.dijitCalendarContainer {
- width: auto;
-}
-.dijitCalendarContainer th, .dijitCalendarContainer td {
- padding: 0;
-}
-.dijitCalendarNextYear {
- margin:0 0 0 0.55em;
-}
-.dijitCalendarPreviousYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarIncrementControl {
- vertical-align: middle;
-}
-.dijitCalendarIncrementControl,
-.dijitCalendarDateTemplate,
-.dijitCalendarMonthLabel,
-.dijitCalendarPreviousYear,
-.dijitCalendarNextYear {
- cursor: pointer;
-}
-.dijitCalendarDisabledDate {
- color: gray;
- text-decoration: line-through;
- cursor: default;
-}
-.dijitSpacer {
-
- position: relative;
- height: 1px;
- overflow: hidden;
- visibility: hidden;
-}
-.dijitMenu {
- border:1px solid black;
- background-color:white;
-}
-.dijitMenuTable {
- border-collapse:collapse;
- border-width:0;
- background-color:white;
-}
-.dj_webkit .dijitMenuTable td[colspan="2"]{
- border-right:hidden;
-}
-.dijitMenuItem {
- text-align: left;
- white-space: nowrap;
- padding:.1em .2em;
- cursor:pointer;
-}
-.dijitMenuPassive .dijitMenuItemHover,
-.dijitMenuItemSelected {
-
- background-color:black;
- color:white;
-}
-.dijitMenuItemIcon, .dijitMenuExpand {
- background-repeat: no-repeat;
-}
-.dijitMenuItemDisabled * {
-
- opacity:0.5;
- cursor:default;
-}
-.dj_ie .dijit_a11y .dijitMenuItemDisabled,
-.dj_ie .dijit_a11y .dijitMenuItemDisabled td,
-.dj_ie .dijitMenuItemDisabled *,
-.dj_ie .dijitMenuItemDisabled td {
- color:gray !important;
- filter: alpha(opacity=35);
-}
-.dijitMenuItemLabel {
- position: relative;
- vertical-align: middle;
-}
-.dijit_a11y .dijitMenuItemSelected {
- border: 1px dotted black !important;
-}
-.dj_ff3 .dijit_a11y .dijitMenuItem td {
- padding: none !important;
- background:none !important;
-}
-.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
- border-width: 1px;
- border-style: solid;
-}
-.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
- position:static;
-}
-.dijitMenuExpandA11y {
- display: none;
-}
-.dijit_a11y .dijitMenuExpandA11y {
- display: inline;
-}
-.dijitMenuSeparator td {
- border: 0;
- padding: 0;
-}
-.dijitMenuSeparatorTop {
- height: 50%;
- margin: 0;
- margin-top:3px;
- font-size: 1px;
-}
-.dijitMenuSeparatorBottom {
- height: 50%;
- margin: 0;
- margin-bottom:3px;
- font-size: 1px;
-}
-.dijitCheckedMenuItemIconChar {
- vertical-align: middle;
- visibility:hidden;
-}
-.dijitCheckedMenuItemChecked .dijitCheckedMenuItemIconChar {
- visibility: visible;
-}
-.dijit_a11y .dijitCheckedMenuItemIconChar {
- display:inline !important;
-}
-.dijit_a11y .dijitCheckedMenuItemIcon {
- display: none;
-}
-.dj_ie .dijit_a11y .dijitMenuBar .dijitMenuItem {
-
- margin: 0px;
-}
-.dijitStackController .dijitToggleButtonChecked * {
- cursor: default;
-}
-.dijitTabContainerNoLayout {
- width: 100%;
-}
-.dijitTabContainerBottom-tabs,
-.dijitTabContainerTop-tabs,
-.dijitTabContainerLeft-tabs,
-.dijitTabContainerRight-tabs {
- overflow: visible !important;
-}
-.dijitTabContainerBottom-container,
-.dijitTabContainerTop-container,
-.dijitTabContainerLeft-container,
-.dijitTabContainerRight-container {
- z-index:0;
- overflow: hidden;
- border: 1px solid black;
-}
-.nowrapTabStrip {
- width: 50000px;
- display: block;
- position: relative;
-}
-.dijitTabListWrapper {
- overflow: hidden;
-}
-.dijit_a11y .tabStripButton img {
-
- display: none;
-}
-.dijitTabContainerTop-tabs {
- border-bottom: 1px solid black;
-}
-.dijitTabContainerTop-container {
- border-top: 0px;
-}
-.dijitTabContainerLeft-tabs {
- border-right: 1px solid black;
- float: left;
-}
-.dijitTabContainerLeft-container {
- border-left: 0px;
-}
-.dijitTabContainerBottom-tabs {
- border-top: 1px solid black;
-}
-.dijitTabContainerBottom-container {
- border-bottom: 0px;
-}
-.dijitTabContainerRight-tabs {
- border-left: 1px solid black;
- float: left;
-}
-.dijitTabContainerRight-container {
- border-right: 0px;
-}
-DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
- cursor: auto;
-}
-.dijitTab {
- position:relative;
- cursor:pointer;
- white-space:nowrap;
- z-index:3;
-}
-.dijitTab * {
-
- vertical-align: middle;
-}
-.dijitTabChecked {
- cursor: default;
-}
-.dijitTabContainerTop-tabs .dijitTab {
- top: 1px;
-}
-.dijitTabContainerBottom-tabs .dijitTab {
- top: -1px;
-}
-.dijitTabContainerLeft-tabs .dijitTab {
- left: 1px;
-}
-.dijitTabContainerRight-tabs .dijitTab {
- left: -1px;
-}
-.dijitTabContainerTop-tabs .dijitTab,
-.dijitTabContainerBottom-tabs .dijitTab {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
-}
-.dijitTabInnerDiv {
- position:relative;
-}
-.tabStripButton {
- z-index: 12;
-}
-.dijitTabButtonDisabled .tabStripButton {
- display: none;
-}
-.dijitTabCloseButton {
- margin-left: 1em;
-}
-.dijitTabCloseText {
- display:none;
-}
-.dijit_a11y .dijitTabCloseButton {
- background-image: none !important;
- width: auto !important;
- height: auto !important;
- border: thin dotted;
-}
-.dijit_a11y .dijitTabCloseButtonHover {
- border:thin solid;
-}
-.dijit_a11y .dijitTabCloseText {
- display: inline;
-}
-.dijit_a11y .dijitTabChecked {
-
- border-style:dashed !important;
-}
-.dijit_a11y .dijitTabInnerDiv {
- border-left:none !important;
- }
-.dijitTabPane,
-.dijitStackContainer-child,
-.dijitAccordionContainer-child {
-
- border: none !important;
-}
-.dijitInlineEditBoxDisplayMode {
- border: 1px solid transparent;
- cursor: text;
-}
-.dijit_a11y .dijitInlineEditBoxDisplayMode,
-.dj_ie6 .dijitInlineEditBoxDisplayMode {
-
- border: none;
-}
-.dijitInlineEditBoxDisplayModeHover,
-.dijit_a11y .dijitInlineEditBoxDisplayModeHover,
-.dj_ie6 .dijitInlineEditBoxDisplayModeHover {
-
- background-color: #e2ebf2;
- border: solid 1px black;
-}
-.dijitInlineEditBoxDisplayModeDisabled {
- cursor: default;
-}
-.dijitTreeIndent {
-
- width: 19px;
-}
-.dijitTreeRow, .dijitTreeContent {
- white-space: nowrap;
-}
-.dijitTreeRow img {
-
- vertical-align: middle;
-}
-.dijitTreeContent {
- cursor: default;
-}
-.dijitExpandoText {
- display: none;
-}
-.dijit_a11y .dijitExpandoText {
- display: inline;
- padding-left: 10px;
- padding-right: 10px;
- font-family: monospace;
- border-style: solid;
- border-width: thin;
- cursor: pointer;
-}
-.dijitTreeLabel {
- margin: 0px 4px;
-}
-.dijitDialog {
- position: absolute;
- z-index: 999;
- overflow: hidden;
-}
-.dijitDialogTitleBar {
- cursor: move;
-}
-.dijitDialogFixed .dijitDialogTitleBar {
- cursor:default;
-}
-.dijitDialogCloseIcon {
- cursor: pointer;
-}
-.dijitDialogUnderlayWrapper {
- position: absolute;
- left: 0;
- top: 0;
- z-index: 998;
- display: none;
- background: transparent !important;
-}
-.dijitDialogUnderlay {
- background: #eee;
- opacity: 0.5;
-}
-.dj_ie .dijitDialogUnderlay {
- filter: alpha(opacity=50);
-}
-.dijit_a11y .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitDialog {
- opacity: 1 !important;
- background-color: white !important;
-}
-.dijitDialog .closeText {
- display:none;
-
- position:absolute;
-}
-.dijit_a11y .dijitDialog .closeText {
- display:inline;
-}
-.dijitSliderMoveable {
- z-index:99;
- position:absolute !important;
- display:block;
- vertical-align:middle;
-}
-.dijitSliderMoveableH {
- right:0;
-}
-.dijitSliderMoveableV {
- right:50%;
-}
-.dijit_a11y DIV.dijitSliderImageHandle,
-.dijitSliderImageHandle {
- margin:0;
- padding:0;
- position:relative !important;
- border:8px solid gray;
- width:0;
- height:0;
- cursor: pointer;
-}
-.dj_iequirks .dijit_a11y .dijitSliderImageHandle {
- font-size: 0;
-}
-.dj_ie7 .dijitSliderImageHandle {
- overflow: hidden;
-}
-.dj_ie7 .dijit_a11y .dijitSliderImageHandle {
- overflow: visible;
-}
-.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
- border:4px solid #000;
- height:8px;
- width:8px;
-}
-.dijitSliderImageHandleV {
- top:-8px;
- right: -50%;
-}
-.dijitSliderImageHandleH {
- left:50%;
- top:-5px;
- vertical-align:top;
-}
-.dijitSliderBar {
- border-style:solid;
- border-color:black;
- cursor: pointer;
-}
-.dijitSliderBarContainerV {
- position:relative;
- height:100%;
- z-index:1;
-}
-.dijitSliderBarContainerH {
- position:relative;
- z-index:1;
-}
-.dijitSliderBarH {
- height:4px;
- border-width:1px 0;
-}
-.dijitSliderBarV {
- width:4px;
- border-width:0 1px;
-}
-.dijitSliderProgressBar {
- background-color:red;
- z-index:1;
-}
-.dijitSliderProgressBarV {
- position:static !important;
- height:0%;
- vertical-align:top;
- text-align:left;
-}
-.dijitSliderProgressBarH {
- position:absolute !important;
- width:0%;
- vertical-align:middle;
- overflow:visible;
-}
-.dijitSliderRemainingBar {
- overflow:hidden;
- background-color:transparent;
- z-index:1;
-}
-.dijitSliderRemainingBarV {
- height:100%;
- text-align:left;
-}
-.dijitSliderRemainingBarH {
- width:100% !important;
-}
-.dijitSliderBumper {
- overflow:hidden;
- z-index:1;
-}
-.dijitSliderBumperV {
- width:4px;
- height:8px;
- border-width:0 1px;
-}
-.dijitSliderBumperH {
- width:8px;
- height:4px;
- border-width:1px 0;
-}
-.dijitSliderBottomBumper,
-.dijitSliderLeftBumper {
- background-color:red;
-}
-.dijitSliderTopBumper,
-.dijitSliderRightBumper {
- background-color:transparent;
-}
-.dijitSliderDecoration {
- text-align:center;
-}
-.dijitSliderV TD {
- position: relative;
-}
-.dijitSliderDecorationH {
- width: 100%;
-}
-.dijitSliderDecorationV {
- height: 100%;
-}
-.dijitSliderButton {
- font-family:monospace;
- margin:0;
- padding:0;
- display:block;
-}
-.dijit_a11y .dijitSliderButtonInner {
- visibility:visible !important;
-}
-.dijitSliderButtonContainer {
- text-align:center;
- height:0;
-}
-.dijitSliderButtonContainer * {
- cursor: pointer;
-}
-.dijitSlider .dijitButtonNode {
- padding:0;
- display:block;
-}
-.dijitRuleContainer {
- position:relative;
- overflow:visible;
-}
-.dijitRuleContainerV {
- height:100%;
- line-height:0;
- float:left;
- text-align:left;
-}
-.dj_opera .dijitRuleContainerV {
- line-height:2%;
-}
-.dj_ie .dijitRuleContainerV {
- line-height:normal;
-}
-.dj_gecko .dijitRuleContainerV {
- margin:0 0 1px 0;
-}
-.dijitRuleMark {
- position:absolute;
- border:1px solid black;
- line-height:0;
- height:100%;
-}
-.dijitRuleMarkH {
- width:0;
- border-top-width:0 !important;
- border-bottom-width:0 !important;
- border-left-width:0 !important;
-}
-.dijitRuleLabelContainer {
- position:absolute;
-}
-.dijitRuleLabelContainerH {
- text-align:center;
- display:inline-block;
-}
-.dijitRuleLabelH {
- position:relative;
- left:-50%;
-}
-.dijitRuleLabelV {
-
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
-}
-.dijitRuleMarkV {
- height:0;
- border-right-width:0 !important;
- border-bottom-width:0 !important;
- border-left-width:0 !important;
- width:100%;
- left:0;
-}
-.dj_ie .dijitRuleLabelContainerV {
- margin-top:-.55em;
-}
-.dijit_a11y .dijitSliderReadOnly,
-.dijit_a11y .dijitSliderDisabled {
- opacity:0.6;
-}
-.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
-.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
- filter: alpha(opacity=40);
-}
-.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
- font-family: monospace;
- font-size: 1em;
- line-height: 1em;
- height: auto;
- width: auto;
- margin: 0px 4px;
-}
-.dijit_a11y .dijitButtonContents .dijitButtonText,
-.dijit_a11y .dijitTab .tabLabel {
- display: inline !important;
-}
-.dijitTextArea {
- width:100%;
- overflow-y: auto;
-}
-.dijitTextArea[cols] {
- width:auto;
-}
-.dj_ie .dijitTextAreaCols {
- width:auto;
-}
-.dijitToolbarSeparator {
- height: 18px;
- width: 5px;
- padding: 0 1px;
- margin: 0;
-}
-.dijitIEFixedToolbar {
- position:absolute;
-
- top: expression(eval((document.documentElement||document.body).scrollTop));
-}
-.dijitEditor {
- display: block;
-}
-.dijitEditorDisabled,
-.dijitEditorReadOnly {
- color: gray;
-}
-.dijitTimePickerItemInner {
- text-align:center;
- border:0;
- padding:2px 8px 2px 8px;
-}
-.dijitTimePickerTick,
-.dijitTimePickerMarker {
- border-bottom:1px solid gray;
-}
-.dijitTimePicker .dijitDownArrowButton {
- border-top: none !important;
-}
-.dijitTimePickerTick {
- color:#CCC;
-}
-.dijitTimePickerMarker {
- color:black;
- background-color:#CCC;
-}
-.dijitTimePickerItemSelected {
- font-weight:bold;
- color:#333;
- background-color:#b7cdee;
-}
-.dijitTimePickerItemHover {
- background-color:gray;
- color:white;
- cursor:pointer;
-}
-.dijit_a11y .dijitTimePickerItemSelected .dijitTimePickerItemInner {
- border: solid 4px black;
-}
-.dijit_a11y .dijitTimePickerItemHover .dijitTimePickerItemInner {
- border: dashed 4px black;
-}
-.dijitToggleButtonIconChar {
-
- display:none !important;
-}
-.dijit_a11y .dijitToggleButton .dijitToggleButtonIconChar {
- display:inline !important;
- visibility:hidden;
-}
-.dj_ie6 .dijitToggleButtonIconChar, .dj_ie6 .tabStripButton .dijitButtonText {
- font-family: "Arial Unicode MS";
-}
-.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
- display: inline !important;
- visibility:visible !important;
-}
-.dijitArrowButtonChar {
- display:none !important;
-}
-.dijit_a11y .dijitArrowButtonChar {
- display:inline !important;
-}
-.dijit_a11y .dijitDropDownButton .dijitArrowButtonInner,
-.dijit_a11y .dijitComboButton .dijitArrowButtonInner {
- display:none !important;
-}
-.dijitSelect {
- margin: 0.2em;
- border-collapse: collapse;
-}
-.dj_ie .dijitSelect,
-.dj_ie7 .dijitSelect,
-.dj_iequirks .dijitSelect {
- vertical-align: middle;
-}
-.dj_ie8 .dijitSelect .dijitButtonText {
- vertical-align: top;
-}
-.dijitToolbar .dijitSelect {
- margin: 0;
-}
-.dj_webkit .dijitToolbar .dijitSelect {
- padding-left: 0.3em;
-}
-.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
-.dijitSelect .dijitButtonContents {
- padding: 0px;
- background: transparent none;
- white-space: nowrap;
- text-align: left;
-}
-.dijitSelectFixedWidth .dijitButtonContents {
- width: 100%;
-}
-.dijitSelectMenu .dijitMenuItemIcon {
-
- display:none;
-}
-.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
-.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
-
- position: static;
-}
-.dijitSelectLabel *
-{
- vertical-align: baseline;
-}
-.dijitSelectSelectedOption * {
- font-weight: bold;
-}
-.dijitSelectMenu {
- border-width: 1px;
-}
-.dijitSelectMenu .dijitMenuTable {
- margin: 0px;
- background-color: transparent;
-}
-.dijitForceStatic {
- position: static !important;
-}
-.dijitReadOnly *,
-.dijitDisabled *,
-.dijitReadOnly,
-.dijitDisabled {
-
- cursor: default;
-}
-.claro {
- font-family:Verdana,Arial,Helvetica,sans-serif;
- font-size: .688em;
- color: #131313;
-}
-h1 {
- font-size: 1.545em;
- font-weight: normal;
- line-height: 1em;
- margin-top: 1em;
- margin-bottom:0.727em;
-}
-.claro .dijitDialog h1 {
- margin-top:0em;
-}
-h2 {
- font-size: 1.364em;
- line-height: 1.455em;
- margin-top:1em;
- margin-bottom:0.60em;
- font-weight: normal;
-}
-h3, h4, h5, h6 {
- font-size:1.091em;
- font-weight: normal;
- line-height: 1.5em;
- margin-top: 1.5em;
- margin-bottom: 0;
-}
-p {
- font-size: 1em;
- line-height: 1.3em;
-}
-blockquote {
- font-size: 0.916em;
- margin-top: 3.272em;
- margin-bottom: 3.272em;
- line-height: 1.636em;
- padding: 1.636em;
- border-top: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
-}
-ol li, ul li {
- font-size: 1em;
- line-height: 1.5em;
- margin: 0;
-}
-pre, code {
- font-size:115%;
- *font-size:100%;
- font-family:inherit;
- background-color: #efefef;
- border: 1px solid #ccc;
-}
-pre {
- border-width: 1px 0;
- padding: 1.5em;
-}
-table { font-size:100%; }
-table.dojoTabular {
- border-collapse: collapse;
- border-spacing: 0;
- border: 1px solid #ccc;
- margin: 0 1.5em;
-}
-.dojoTabular th {
- text-align: center;
- font-weight: bold;
-}
-table.dojoTabular thead, table.dojoTabular tfoot {
- background-color: #efefef;
- border: 1px solid #ccc;
- border-width: 1px 0;
-}
-table.dojoTabular thead tr th,
-table.dojoTabular thead tr td,
-table.dojoTabular tbody tr td,
-table.dojoTabular tfoot tr td {
- padding: 0.25em 0.5em;
-}
-
-.dijitIconSave,
-.dijitIconPrint,
-.dijitIconCut,
-.dijitIconCopy,
-.dijitIconClear,
-.dijitIconDelete,
-.dijitIconUndo,
-.dijitIconEdit,
-.dijitIconNewTask,
-.dijitIconEditTask,
-.dijitIconEditProperty,
-.dijitIconTask,
-.dijitIconFilter,
-.dijitIconConfigure,
-.dijitIconSearch,
-.dijitIconApplication,
-.dijitIconBookmark,
-.dijitIconChart,
-.dijitIconConnector,
-.dijitIconDatabase,
-.dijitIconDocuments,
-.dijitIconMail,
-.dijitLeaf,
-.dijitIconFile,
-.dijitIconFunction,
-.dijitIconKey,
-.dijitIconPackage,
-.dijitIconSample,
-.dijitIconTable,
-.dijitIconUsers,
-.dijitFolderClosed,
-.dijitIconFolderClosed,
-.dijitFolderOpened,
-.dijitIconFolderOpen,
-.dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActEnabled.png);
- width: 16px;
- height: 16px;
-}
-.dj_ie6 .dijitIconSave,
-.dj_ie6 .dijitIconPrint,
-.dj_ie6 .dijitIconCut,
-.dj_ie6 .dijitIconCopy,
-.dj_ie6 .dijitIconClear,
-.dj_ie6 .dijitIconDelete,
-.dj_ie6 .dijitIconUndo,
-.dj_ie6 .dijitIconEdit,
-.dj_ie6 .dijitIconNewTask,
-.dj_ie6 .dijitIconEditTask,
-.dj_ie6 .dijitIconEditProperty,
-.dj_ie6 .dijitIconTask,
-.dj_ie6 .dijitIconFilter,
-.dj_ie6 .dijitIconConfigure,
-.dj_ie6 .dijitIconSearch,
-.dj_ie6 .dijitIconApplication,
-.dj_ie6 .dijitIconBookmark,
-.dj_ie6 .dijitIconChart,
-.dj_ie6 .dijitIconConnector,
-.dj_ie6 .dijitIconDatabase,
-.dj_ie6 .dijitIconDocuments,
-.dj_ie6 .dijitIconMail,
-.dj_ie6 .dijitLeaf,
-.dj_ie6 .dijitIconFile,
-.dj_ie6 .dijitIconFunction,
-.dj_ie6 .dijitIconKey,
-.dj_ie6 .dijitIconPackage,
-.dj_ie6 .dijitIconSample,
-.dj_ie6 .dijitIconTable,
-.dj_ie6 .dijitIconUsers,
-.dj_ie6 .dijitFolderClosed,
-.dj_ie6 .dijitIconFolderClosed,
-.dj_ie6 .dijitFolderOpened,
-.dj_ie6 .dijitIconFolderOpen,
-.dj_ie6 .dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActEnabled8bit.png);
-}
-.dijitDisabled .dijitIconSave,
-.dijitDisabled .dijitIconPrint,
-.dijitDisabled .dijitIconCut,
-.dijitDisabled .dijitIconCopy,
-.dijitDisabled .dijitIconClear,
-.dijitDisabled .dijitIconDelete,
-.dijitDisabled .dijitIconUndo,
-.dijitDisabled .dijitIconEdit,
-.dijitDisabled .dijitIconNewTask,
-.dijitDisabled .dijitIconEditTask,
-.dijitDisabled .dijitIconEditProperty,
-.dijitDisabled .dijitIconTask,
-.dijitDisabled .dijitIconFilter,
-.dijitDisabled .dijitIconConfigure,
-.dijitDisabled .dijitIconSearch,
-.dijitDisabled .dijitIconApplication,
-.dijitDisabled .dijitIconBookmark,
-.dijitDisabled .dijitIconChart,
-.dijitDisabled .dijitIconConnector,
-.dijitDisabled .dijitIconDatabase,
-.dijitDisabled .dijitIconDocuments,
-.dijitDisabled .dijitIconMail,
-.dijitDisabled .dijitLeaf,
-.dijitDisabled .dijitIconFile,
-.dijitDisabled .dijitIconFunction,
-.dijitDisabled .dijitIconKey,
-.dijitDisabled .dijitIconPackage,
-.dijitDisabled .dijitIconSample,
-.dijitDisabled .dijitIconTable,
-.dijitDisabled .dijitIconUsers,
-.dijitDisabled .dijitFolderClosed,
-.dijitDisabled .dijitIconFolderClosed,
-.dijitDisabled .dijitFolderOpened,
-.dijitDisabled .dijitIconFolderOpen,
-.dijitDisabled .dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActDisabled.png);
-}
-.dijitIconSave { background-position: 0px; }
-.dijitIconPrint { background-position: -16px; }
-.dijitIconCut { background-position: -32px; }
-.dijitIconCopy { background-position: -48px; }
-.dijitIconClear { background-position: -64px; }
-.dijitIconDelete { background-position: -80px; }
-.dijitIconUndo { background-position: -96px; }
-.dijitIconEdit { background-position: -112px; }
-.dijitIconNewTask { background-position: -128px; }
-.dijitIconEditTask { background-position: -144px; }
-.dijitIconEditProperty { background-position: -166px; }
-.dijitIconTask { background-position: -176px; }
-.dijitIconFilter { background-position: -192px; }
-.dijitIconConfigure { background-position: -208px; }
-.dijitIconSearch { background-position: -224px; }
-.dijitIconError { background-position: -496px; }
-.dijitIconApplication { background-position: -240px; }
-.dijitIconBookmark { background-position: -256px; }
-.dijitIconChart { background-position: -272px; }
-.dijitIconConnector { background-position: -288px; }
-.dijitIconDatabase { background-position: -304px; }
-.dijitIconDocuments { background-position: -320px; }
-.dijitIconMail { background-position: -336px; }
-.dijitIconFile, .dijitLeaf { background-position: -352px; }
-.dijitIconFunction { background-position: -368px; }
-.dijitIconKey { background-position: -384px; }
-.dijitIconPackage{ background-position: -400px; }
-.dijitIconSample { background-position: -416px; }
-.dijitIconTable { background-position: -432px; }
-.dijitIconUsers { background-position: -448px; }
-.dijitIconFolderClosed, .dijitFolderClosed { background-position: -464px; }
-.dijitIconFolderOpen, .dijitFolderOpened { background-position: -480px; }
-.claro .dijitPopup {
- box-shadow: 0px 1px 5px rgba(0,0,0,0.25);
- -webkit-box-shadow: 0px 1px 5px rgba(0,0,0,0.25);
- -moz-box-shadow: 0px 1px 5px rgba(0,0,0,0.25);
-}
-.claro .dijitTooltipDialogPopup {
-
- box-shadow: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
-}
-.claro .dijitComboBoxHighlightMatch {
- background-color:#a5beda;
-}
-.claro .dijitFocusedLabel {
-
- outline: 1px dotted #666666;
-}
-.claro .dijitContentPaneLoading {
- background:url(images/loadingAnimation.gif) no-repeat left center;
- padding-left:25px;
-}
-.claro .dijitContentPaneError {
- background:url(../../icons/images/commonIconsObjActEnabled.png) no-repeat left center;
- background-position: -496px;
- no-repeat left center;
- padding-left:25px;
-}
-.claro .dojoDndItemBefore,
-.claro .dojoDndItemAfter{
- border-top: 1px solid #769DC0;
-}
-.claro .dojoDndItemOver {
- cursor:pointer;
- }
-.claro table.dojoDndAvatar {
- border: 1px solid #b5bcc7;
- border-collapse: collapse;
- background-color: #fff;
- -webkit-box-shadow:0px 1px 3px rgba(0, 0, 0, .25);
-}
-.claro .dojoDndAvatarHeader td {
- height: 20px;
- padding-left:21px;
-}
-.claro.dojoDndMove .dojoDndAvatarHeader, .claro.dojoDndCopy .dojoDndAvatarHeader {
- background-image: url(images/dnd.png);
- background-repeat: no-repeat;
- background-position:2px -122px;
-}
-.claro .dojoDndAvatarItem td {
- padding: 5px;
-}
-.claro.dojoDndMove .dojoDndAvatarHeader {
- background-color: #f58383;
- background-position:2px -103px;
-}
-.claro.dojoDndCopy .dojoDndAvatarHeader {
- background-color: #f58383;
- background-position:2px -68px;
-}
-.claro.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader {
- background-color: #97e68d;
- background-position:2px -33px;
-}
-.claro.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader {
- background-color: #97e68d;
- background-position:2px 2px;
-}
-.claro .dijitTextBoxError .dijitValidationContainer {
- background-color: #d46363;
- background-image: url(form/images/error.png);
- background-position: top center;
- border: solid #d46464 0px;
- border-left-width: 1px;
- width: 9px;
-}
-.claro .dijitTextBoxError .dijitValidationIcon {
- width: 0px;
- background-color: transparent !important;
-}
-.claro .dijitTextBox .dijitInputContainer,
-.claro .dijitTextArea,
-.claro .dijitInputField .dijitPlaceHolder {
- padding: 2px;
-}
-.claro .dijitTextBox,
-.claro .dijitTextBox .dijitButtonNode {
-
- border-color: #b5bcc7;
- -webkit-transition-property:background-color, border;
- -webkit-transition-duration:.35s;
-}
-.claro .dijitTextBox {
- background-color: #f7fcff;
-}
-.claro .dijitTextBoxHover,
-.claro .dijitTextBoxHover .dijitButtonNode {
- border-color: #769dc0;
- -webkit-transition-duration:.25s;
-}
-.claro .dijitTextBoxHover {
- background-color: #e9f4fe;
- background-image: url(form/images/textBox_back.png);
- background-repeat: repeat-x;
-}
-.claro .dijitTextBoxError,
-.claro .dijitTextBoxError .dijitButtonNode {
- border-color: #d46464;
-}
-.claro .dijitTextBoxError,
-.claro .dijitTextBoxError .dijitInputContainer {
- background-color: #fdf7f7;
-}
-.claro .dijitTextBoxFocused,
-.claro .dijitTextBoxFocused .dijitButtonNode {
- border-color:#769dc0;
- -webkit-transition-duration:.1s;
-}
-.claro .dijitTextBoxFocused {
- background-color: #fff;
- background-image: url(form/images/textBox_back.png);
- background-repeat: repeat-x;
-}
-.claro .dijitTextBoxFocused .dijitInputContainer {
- background: #fff;
-}
-.claro .dijitTextBoxErrorFocused,
-.claro .dijitTextBoxErrorFocused .dijitButtonNode {
- border-color: #ce4f4f;
-}
-.claro .dijitTextBoxDisabled,
-.claro .dijitTextBoxDisabled .dijitButtonNode {
- border-color: #d3d3d3;
-}
-.claro .dijitTextBoxDisabled {
- background-color: #efefef;
- background-image: none;
- color: #818181;
-}
-.claro .dijitComboBox .dijitArrowButtonInner {
- background-image: url(form/images/commonFormArrows.png);
- background-position:-35px 53%;
- background-repeat: no-repeat;
- margin: 0px;
- width:16px;
- height:100%;
- border: 1px solid #fff;
-}
-.claro .dijitTextBox .dijitInputField {
- padding-top: 1px;
- padding-bottom: 1px;
-}
-.claro .dijitTextBox .dijitInputInner {
-
- padding: 1px 2px 1px 0;
-}
-.claro .dijitTextBox .dijitValidationContainer {
- padding: 0 0 2px 0;
-}
-.claro .dijitComboBox .dijitButtonNode {
- background-color: #ebeef4;
- background-image: url(form/images/formHighlight.png);
- background-repeat:repeat-x;
-}
-.claro .dijitComboBoxHover .dijitButtonNode {
- background-color:#abd6ff;
-}
-.claro .dijitComboBoxHover .dijitArrowButtonInner {
- background-position:-70px 53%;
-}
-.claro .dijitComboBoxFocused .dijitButtonNode {
- background-color:#7dbefa;
- background-position:0px -177px;
- padding: 1px;
-}
-.claro .dijitComboBoxFocused .dijitArrowButtonInner {
- background-position:-70px 53%;
- border: 0px none;
-}
-.claro div.dijitComboBoxDisabled .dijitArrowButtonInner {
-
- background-position:0px 50%;
- background-color:#f1f1f1;
-}
-.dj_ff3 .claro .dijitInputField input[type="hidden"] {
- display: none;
- height: 0;
- width: 0;
-}
-.dj_ie6 .claro .dijitTextBox,
-.dj_ie6 .claro .dijitComboBox .dijitButtonNode {
- background-image: none;
-}
-.dj_quirks .claro .dijitComboBox .dijitArrowButtonInner {
- border: 0px;
-}
-.dj_quirks .claro .dijitComboBox .dijitArrowButtonContainer {
- padding: 1px;
-}
-.claro .dijitButtonNode {
-
- -webkit-transition-property:background-color;
- -webkit-transition-duration:.3s;
-}
-.claro .dijitButton .dijitButtonNode,
-.claro .dijitDropDownButton .dijitButtonNode,
-.claro .dijitComboButton .dijitButtonNode,
-.claro .dijitToggleButton .dijitButtonNode {
-
- border: 1px solid #769dc0;
- padding:2px 4px 4px 4px;
- background-image: url(form/images/button.png);
- background-position: center top;
- background-repeat: repeat-x;
- background-color: #e4f2ff;
- border-radius: 4px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- box-shadow:0px 1px 1px rgba(0,0,0,0.15);
- -webkit-box-shadow:0px 1px 1px rgba(0,0,0,0.15);
- -moz-box-shadow: 0px 1px 1px rgba(0,0,0,0.15);
-}
-.claro .dijitComboButton .dijitArrowButton {
- border-left-width: 0px;
- padding: 4px 2px 4px 2px;
-}
-.claro .dijitArrowButtonInner {
- width: 15px;
- height: 15px;
- margin: 0 auto;
- background-image:url(form/images/buttonArrows.png);
- background-repeat:no-repeat;
- background-position:-51px 53%;
-}
-.claro .dijitLeftArrowButton .dijitArrowButtonInner {
- background-position: -77px 53%;
-}
-.claro .dijitRightArrowButton .dijitArrowButtonInner {
- background-position: -26px 53%;
-}
-.claro .dijitUpArrowButton .dijitArrowButtonInner {
- background-position: 0px 53%;
-}
-.claro .dijitDisabled .dijitArrowButtonInner {
- background-position: -151px 53%;
-}
-.claro .dijitDisabled .dijitLeftArrowButton .dijitArrowButtonInner {
- background-position: -177px 53%;
-}
-.claro .dijitDisabled .dijitRightArrowButton .dijitArrowButtonInner {
- background-position: -126px 53%;
-}
-.claro .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner {
- background-position: -100px 53%;
-}
-.claro .dijitButtonText {
- padding: 0 0.3em;
- text-align: center;
-}
-.claro .dijitDisabled .dijitButtonText {
- color: #7F7F7F;
-}
-.claro .dijitButtonHover .dijitButtonNode,
-.claro .dijitDropDownButtonHover .dijitButtonNode,
-.claro .dijitComboButton .dijitButtonNodeHover,
-.claro .dijitComboButton .dijitDownArrowButtonHover,
-.claro .dijitToggleButtonHover .dijitButtonNode {
- background-color: #afd9ff;
- color:#000;
- -webkit-transition-duration:.2s;
-}
-.claro .dijitButtonActive .dijitButtonNode,
-.claro .dijitDropDownButtonActive .dijitButtonNode,
-.claro .dijitComboButtonActive .dijitButtonNode,
-.claro .dijitToggleButtonActive .dijitButtonNode {
- background-color: #99cfff;
- box-shadow:0px 0px 0px rgba(0,0,0,0);
- -webkit-box-shadow:0px 0px 0px rgba(0,0,0,0);
- -moz-box-shadow: 0px 0px 0px rgba(0,0,0,0);
- -webkit-transition-duration:.1s;
-}
-.claro .dijitButtonDisabled,
-.claro .dijitDropDownButtonDisabled,
-.claro .dijitComboButtonDisabled,
-.claro .dijitToggleButtonDisabled {
- background-image: none;
- outline: none;
-}
-.claro .dijitButtonDisabled .dijitButtonNode,
-.claro .dijitDropDownButtonDisabled .dijitButtonNode,
-.claro .dijitComboButtonDisabled .dijitButtonNode,
-.claro .dijitToggleButtonDisabled .dijitButtonNode {
- background-position:0px -149px;
- background-color: #e3e3e3;
- border: solid 1px #c9c9c9;
- color: #696969;
- box-shadow:0px 0px 0px rgba(0,0,0,0);
- -webkit-box-shadow:0px 0px 0px rgba(0,0,0,0);
- -moz-box-shadow: 0px 0px 0px rgba(0,0,0,0);
-}
-.claro .dijitComboButtonDisabled .dijitArrowButton{
- border-left-width: 0px;
-}
-.claro table.dijitComboButton {
- border-collapse: separate;
-}
-.dj_ie6 .claro .dijitButtonNode {
- background-image: none;
-}
-.claro .dijitComboButton .dijitStretch {
- -moz-border-radius: 4px 0px 0px 4px;
- -webkit-border-top-left-radius: 4px;
- -webkit-border-top-right-radius: 0px;
- -webkit-border-bottom-right-radius: 0px;
- -webkit-border-bottom-left-radius: 4px;
-}
-.claro .dijitComboButton .dijitArrowButton {
- -moz-border-radius: 0px 4px 4px 0px;
- -webkit-border-top-left-radius: 0px;
- -webkit-border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 0px;
-}
-.claro .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url(images/checkmarkNoBorder.png);
-}
-.dj_ie6 .claro .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url(images/checkmarkNoBorder.gif);
-}
-.claro .dijitCheckBox,
-.claro .dijitCheckBoxIcon {
- background-image: url(form/images/checkboxRadioButtonStates.png);
- background-repeat: no-repeat;
- width: 15px;
- height: 16px;
- margin: 0 2px 0 0;
- padding: 0;
-}
-.dj_ie6 .claro .dijitCheckBox,
-.dj_ie6 .claro .dijitCheckBoxIcon {
- background-image: url(form/images/checkboxAndRadioButtons_IE6.png);
-}
-.claro .dijitCheckBox,
-.claro .dijitToggleButton .dijitCheckBoxIcon {
-
- background-position: -15px;
-}
-.claro .dijitCheckBoxChecked,
-.claro .dijitToggleButtonChecked .dijitCheckBoxIcon {
-
- background-position: -0px;
-}
-.claro .dijitCheckBoxDisabled {
-
- background-position: -75px;
-}
-.claro .dijitCheckBoxCheckedDisabled {
-
- background-position: -60px;
-}
-.claro .dijitCheckBoxHover {
-
- background-position: -45px;
-}
-.claro .dijitCheckBoxCheckedHover {
-
- background-position: -30px;
-}
-.claro .dijitToggleButton .dijitRadio,
-.claro .dijitToggleButton .dijitRadioIcon {
- background-image: url(form/images/checkboxRadioButtonStates.png);
-}
-.dj_ie6 .claro .dijitToggleButton .dijitRadio,
-.dj_ie6 .claro .dijitToggleButton .dijitRadioIcon {
- background-image: url(form/images/checkboxAndRadioButtons_IE6.png);
-}
-.claro .dijitRadio,
-.claro .dijitRadioIcon {
- background-image: url(form/images/checkboxRadioButtonStates.png);
- background-repeat: no-repeat;
- width: 15px;
- height: 15px;
- margin: 0px 2px 0px 0px;
- padding: 0px;
-}
-.dj_ie6 .claro .dijitRadio,
-.dj_ie6 .claro .dijitRadioIcon {
- background-image: url(form/images/checkboxAndRadioButtons_IE6.png);
-}
-.claro .dijitRadio{
-
- background-position: -105px;
-}
-.claro .dijitToggleButton .dijitRadioIcon {
-
- background-position: -107px;
-}
-.claro .dijitRadioDisabled {
-
- background-position: -165px;
-}
-.claro .dijitRadioHover {
-
- background-position: -135px;
-}
-.claro .dijitRadioChecked{
- background-position: -90px;
-}
-.claro .dijitToggleButtonChecked .dijitRadioIcon {
- background-position: -92px;
-}
-.claro .dijitRadioCheckedHover{
- background-position: -120px;
-}
-.claro .dijitRadioCheckedDisabled {
-
- background-position: -150px;
-}
-.claro .dijitSelect .dijitButtonText {
- padding: 0px 5px 2px 5px;
-}
-.claro .dijitSelect {
- border: 1px solid #b5bcc7;
- background-color: #f7fcff;
- border-collapse: separate;
-}
-.dj_ie6 .claro .dijitSelect,
-.dj_ie6 .claro .dijitSelect .dijitButtonNode {
- background-image:none;
-}
-.claro .dijitSelect .dijitButtonContents {
- border: 0px solid #b5bcc7;
- border-right-width: 1px;
-}
-.claro .dijitSelect .dijitArrowButton {
- padding: 0;
- border: 1px solid #fff;
- border-top:none;
- background-color:#ebeef4;
- background-image: url(form/images/formHighlight.png);
- background-repeat:repeat-x;
-}
-.claro .dijitSelect .dijitArrowButton .dijitArrowButtonInner {
- background-image: url(form/images/commonFormArrows.png);
- background-position:-35px 70%;
- background-repeat: no-repeat;
- width:16px;
- height:16px;
- display:block;
-}
-.claro .dijitSelectHover {
- border: 1px solid #769dc0;
- background-color: #e9f4fe;
- background-image: url(form/images/textBox_back.png);
- background-repeat: repeat-x;
-}
-.claro .dijitSelectHover .dijitButtonContents {
- border-color:#81a5c6;
-}
-.claro .dijitSelectHover .dijitArrowButton {
- background-color:#abd6ff;
-}
-.claro .dijitSelectHover .dijitArrowButton .dijitArrowButtonInner {
- background-position:-70px 70%;
-}
-.claro .dijitSelectFocused {
- border: 1px solid #769dc0;
-}
-.claro .dijitSelectFocused .dijitButtonContents {
- border-color:#81a5c6;
-}
-.claro .dijitSelectFocused .dijitArrowButton {
- background-color:#7dbefa;
- background-position:0px -177px;
- border: none;
- padding: 0px 1px;
-}
-.claro .dijitSelectFocused .dijitArrowButton .dijitArrowButtonInner {
- background-position:-70px 70%;
- margin-bottom: 1px;
-}
-.claro .dijitSelectDisabled {
- border: 1px solid #d3d3d3;
- background-color: #efefef;
- background-image: none;
- color: #818181;
-}
-.claro .dijitSelectDisabled .dijitArrowButton {
- background-color: #efefef;
-}
-.claro .dijitSelectDisabled .dijitArrowButton .dijitArrowButtonInner {
- background-position:0px 70%
-}
-.claro .dijitSelectMenu td.dijitMenuItemIconCell,
-.claro .dijitSelectMenu td.dijitMenuArrowCell {
-
- display: none;
-}
-.claro .dijitSelectMenu td.dijitMenuItemLabel {
-
- padding-left: 5px;
- padding-right: 5px;
-}
-.claro .dijitSelectMenu .dijitMenuSeparatorTop {
- border-bottom:1px solid #769dc0;
-}
-.claro .dijitTabPaneWrapper {
- background:#fff;
-}
-.claro .dijitTabPaneWrapper,
-.claro .dijitTabContainerTop-tabs,
-.claro .dijitTabContainerBottom-tabs,
-.claro .dijitTabContainerLeft-tabs,
-.claro .dijitTabContainerRight-tabs {
-
- border-color: #b5bcc7;
-}
-.claro .dijitTabCloseButton {
- background: url(layout/images/tabClose.png) no-repeat;
- width: 14px;
- height: 14px;
- margin-left: 5px;
- margin-right:-3px;
-}
-.claro .dijitTabCloseButtonHover {
- background-position:-14px;
-}
-.claro .dijitTabCloseButtonActive {
- background-position:-28px;
-}
-.claro .dijitTabSpacer {
-
- display: none;
-}
-.claro .dijitTabInnerDiv {
- background-color:#e6e6e7;
- -webkit-transition-property:background-color, border;
- -webkit-transition-duration:.35s;
- color:#4a4a4a;
-}
-.claro .dijitTabHover .dijitTabInnerDiv {
- background-color:#a9d6ff;
- -webkit-transition-duration:.25s;
- color:#000;
-}
-.claro .dijitTabActive .dijitTabInnerDiv {
- background-color:#8bc4f9;
- color:#000;
- -webkit-transition-duration:.1s;
-}
-.claro .dijitTabChecked .dijitTabInnerDiv {
- background-color:#b2d4f3;
- color:#000;
-}
-.claro .dijitTabContent {
- border: 1px solid #b5bcc7;
-}
-.claro .dijitTabHover .dijitTabContent,
-.claro .dijitTabActive .dijitTabContent {
- border-color: #769dc0;
-}
-.claro .dijitTabChecked .dijitTabContent {
- color:#000;
- border-color: #b5bcc7;
-}
-.claro .tabStripButton .dijitTabInnerDiv {
- background-color: transparent;
-}
-.claro .tabStripButton .dijitTabContent {
- border: none;
-}
-.claro .dijitTabContainerTop-tabs .dijitTab {
- top: 1px;
- margin-right: 1px;
- padding-top: 3px;
-}
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTab {
- top: 3px;
-}
-.claro .dijitTabContainerTop-tabs .dijitTabContent {
- padding:3px 8px 3px 4px;
- border-bottom: 1px;
- background-image:url(layout/images/tabTop.png);
- background-position:0px 0px;
- background-repeat:repeat-x;
- min-width: 60px;
- text-align: center;
-}
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- padding-bottom: 4px;
- padding-top: 6px;
-}
-.dj_ie .claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- border-bottom: none;
-}
-.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv {
- background-image:url(layout/images/tabTop.png);
- background-position:0px -248px;
- background-position:bottom;
- background-repeat:repeat-x;
- box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.04);
- -webkit-box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.04);
- -moz-box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.04);
-}
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-image:none;
- box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.05);
- -webkit-box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.05);
-}
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- background-position:0px -102px;
- background-repeat:repeat-x;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTab {
- top: -1px;
- margin-right: 1px;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabContent {
- padding:3px 8px 4px 4px;
- border-top: none;
- background-image: url(layout/images/tabBottom.png);
- background-position:0px -249px;
- background-repeat: repeat-x;
- background-position:bottom;
- min-width: 60px;
- text-align: center;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTab {
- padding-bottom: 3px;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background-image: url(layout/images/tabBottom.png);
- background-position: top;
- background-repeat: repeat-x;
- box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.04);
- -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.04);
- -moz-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.04);
-
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabContent {
- padding-bottom: 7px;
- padding-top: 4px;
- background-position:0px -119px;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabChecked {
- padding-bottom: 0;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-image:none;
- box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05);
- -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05);
-}
-.claro .dijitTabContainerLeft-tabs .dijitTab {
- left: 1px;
- margin-bottom: 1px;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background-image: url(layout/images/tabLeft.png);
- background-position: -347px -340px;
- background-repeat: repeat-y;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabContent {
- padding:3px 8px 4px 4px;
- background-image: url(layout/images/tabLeft.png);
- background-repeat: repeat-y;
- background-position:0px 0px;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabContent {
- padding-right: 9px;
- border-right: none;
- background-image: none;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-position:0px -179px;
- background-repeat:repeat-y;
- box-shadow: -1px 0px 2px rgba(0, 0, 0, .05);
- -webkit-box-shadow: -1px 0px 2px rgba(0, 0, 0, .05);
- -moz-box-shadow: -1px 0px 2px rgba(0, 0, 0, 0.05);
-}
-.claro .dijitTabContainerRight-tabs .dijitTab {
- left: -1px;
- margin-bottom: 1px;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv {
- background-image: url(layout/images/tabRight.png);
- background-repeat: repeat-y;
- background-position: -1px -347px;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabContent {
- padding:3px 8px 4px 4px;
- background-image: url(layout/images/tabRight.png);
- background-position:right top;
- background-repeat: repeat-y;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabContent {
- padding-left: 5px;
- border-left: none;
- background-image: none;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-position:-348px -179px;
- box-shadow: 1px 0px 2px rgba(0, 0, 0, 0.07);
- -webkit-box-shadow: 1px 0px 2px rgba(0, 0, 0, 0.07);
- -moz-box-shadow: 1px 0px 2px rgba(0, 0, 0, 0.07);
-}
-.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerTop-tabs .dijitTabContent {
- border-radius: 2px 2px 0px 0px;
- -moz-border-radius: 2px 2px 0px 0px;
- -webkit-border-top-left-radius:2px;
- -webkit-border-top-right-radius:2px;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerBottom-tabs .dijitTabContent{
- border-radius: 0px 0px 2px 2px;
- -moz-border-radius: 0px 0px 2px 2px;
- -webkit-border-bottom-right-radius:2px;
- -webkit-border-bottom-left-radius:2px;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerLeft-tabs .dijitTabContent{
- border-radius: 2px 0px 0px 2px;
- -moz-border-radius: 2px 0px 0px 2px;
- -webkit-border-top-left-radius:2px;
- -webkit-border-bottom-left-radius:2px;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerRight-tabs .dijitTabContent{
- border-radius: 0px 2px 2px 0px;
- -moz-border-radius: 0px 2px 2px 0px;
- -webkit-border-top-right-radius:2px;
- -webkit-border-bottom-right-radius:2px;
-}
-.claro .tabStripButton {
- background-color:#deecf9;
- border: 1px solid #b5bcc7;
-}
-.claro .dijitTabListContainer-top .tabStripButton {
- padding: 4px 3px;
- margin-top:7px;
- background-image: url(layout/images/tabTop.png);
- background-position:0px 0px;
-}
-.claro .dijitTabListContainer-bottom .tabStripButton {
- padding:5px 3px;
- margin-bottom:4px;
- background-image: url(layout/images/tabTop.png);
- background-position:0px -248px;
- background-position:bottom;
-}
-.claro .tabStripButtonHover {
- background-color:#a6d2fb;
-}
-.claro .tabStripButtonActive {
- background-color:#7dbefa;
-}
-.claro .dijitTabStripIcon {
- height:15px;
- width:15px;
- margin: 0 auto;
- background:url(form/images/buttonArrows.png) no-repeat -75px 50%;
- background-color: transparent;
-}
-.claro .dijitTabStripSlideRightIcon{
- background-position: -24px 50%;
-}
-.claro .dijitTabStripMenuIcon {
- background-position: -51px 50%;
-}
-.claro .dijitTabListContainer-top .tabStripButtonDisabled,
-.claro .dijitTabListContainer-bottom .tabStripButtonDisabled {
- background-color:#dddddd;
- border:1px solid #c9c9c9;
-}
-.claro .tabStripButtonDisabled .dijitTabStripSlideLeftIcon {
- background-position:-175px 50%;
-}
-.claro .tabStripButtonDisabled .dijitTabStripSlideRightIcon {
- background-position: -124px 50%;
-}
-.claro .tabStripButtonDisabled .dijitTabStripMenuIcon {
- background-position: -151px 50%;
-}
-.claro .dijitTabContainerNested .dijitTabListWrapper {
- height: auto;
-}
-.claro .dijitTabContainerNested .dijitTabContainerTop-tabs {
- border-bottom:solid 1px #b5bcc7;
- padding:1px 2px 4px;
- margin-top:-2px;
-}
-.claro .dijitTabContainerTabListNested .dijitTabContent {
- background:rgba(255, 255, 255, 0) none repeat scroll 0 0;
- border: none;
- padding: 4px;
- border-color: rgba(118,157,192,0);
- -webkit-transition-property:background-color, border-color;
- -webkit-transition-duration:.3s;
-}
-.claro .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv {
-
- background: none;
- border: none;
- top: 0px;
- box-shadow: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
-}
-.claro .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent {
- background-color:#eaf4fc;
- border-radius: 2px 2px 2px 2px;
- -moz-border-radius: 2px 2px 2px 2px;
- -webkit-border-radius:2px;
- border:solid 1px #c8dff3;
- padding: 3px;
- webkit-transition-duration:.2s;
-}
-.claro .dijitTabContainerTabListNested .dijitTabHover .tabLabel {
- text-decoration: none;
-}
-.claro .dijitTabContainerTabListNested .dijitTabActive .dijitTabContent {
- border-radius: 2px 2px 2px 2px;
- -moz-border-radius: 2px 2px 2px 2px;
- -webkit-border-radius:2px;
- border:solid 1px #a8c7e2;
- padding: 3px;
- background:#b9d9f5 url(layout/images/tabNested.png) repeat-x;
- -webkit-transition-duration:.1s;
-}
-.claro .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent {
- border-radius: 2px 2px 2px 2px;
- -moz-border-radius: 2px 2px 2px 2px;
- -webkit-border-radius:2px;
- padding: 3px;
- border:solid 1px #a8c7e2;
- background-position: 0px 105px;
- background-color:#d4e8f9;
-}
-.claro .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
- text-decoration: none;
- background-image:none;
-}
-.claro .dijitTabPaneWrapperNested {
- border: none;
-}
-.dj_ie6 .claro .dijitTabContent,
-.dj_ie6 .claro .dijitTabInnerDiv,
-.dj_ie6 .dijitTabListContainer-top .tabStripButton,
-.dj_ie6 .dijitTabListContainer-bottom .tabStripButton{
- background-image: none;
-}
-.claro .dijitDialog {
- border: 1px solid #769dc0;
- box-shadow:0px 1px 5px rgba(0,0,0,0.25);
- -webkit-box-shadow:0px 1px 5px rgba(0,0,0,0.25);
- -moz-box-shadow: 0px 1px 5px rgba(0,0,0,0.25);
-}
-.claro .dijitDialogPaneContent {
- background: #fff repeat-x top left;
- border-top: 1px solid #769dc0;
- padding:10px 8px;
- position: relative;
-}
-.claro .dijitDialogPaneContentArea {
-
- margin: -10px -8px;
- padding: 10px 8px;
-}
-.claro .dijitDialogPaneActionBar {
-
- background-color: #f2f2f2;
- padding: 3px 5px 2px 7px;
- text-align: right;
- border-top: 1px solid #cdcdcd;
- margin: 10px -8px -10px;
-}
-.claro .dijitDialogPaneActionBar .dijitButton {
- float: none;
-}
-.claro .dijitDialogTitleBar {
-
- border: 1px solid #fff;
- border-top:none;
- background-color: #abd6ff;
- background-image: url(images/titlebar.png);
- background-repeat:repeat-x;
- padding: 5px 7px 4px 7px;
-}
-.claro .dijitDialogTitle {
-
- padding: 0px 1px;
- font-size:1.091em;
-}
-.claro .dijitDialogCloseIcon {
-
- background: url(images/dialogCloseIcon.png);
- background-repeat:no-repeat;
- position: absolute;
- right: 5px;
- height: 15px;
- width: 21px;
-}
-.dj_ie6 .claro .dijitDialogCloseIcon {
- background-image: url(images/dialogCloseIcon8bit.png);
-}
-.claro .dijitDialogCloseIconHover {
- background-position:-21px;
-}
-.claro .dijitDialogCloseIconActive {
- background-position:-42px;
-}
-.claro .dijitTooltip,
-.claro .dijitTooltipDialog {
-
- background: transparent;
-}
-.dijitTooltipBelow {
-
- padding-top: 13px;
- padding-left:3px;
- padding-right:3px;
-}
-.dijitTooltipAbove {
-
- padding-bottom: 13px;
- padding-left:3px;
- padding-right:3px;
-}
-.claro .dijitTooltipContainer {
-
- background-color:#fff;
- background-image:url(images/tooltip.png);
- background-repeat:repeat-x;
- background-position:-575px 100%;
- border:1px solid #769DC0;
- padding:6px 8px;
- border-radius: 4px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- box-shadow:0px 1px 3px rgba(0,0,0,0.25);
- -webkit-box-shadow:0px 1px 3px rgba(0,0,0,0.25);
- -moz-box-shadow: 0px 1px 3px rgba(0,0,0,0.25);
- font-size: 1em;
-}
-.dj_ie6 .claro .dijitTooltipContainer {
- background-image: none;
-}
-.claro .dijitTooltipConnector {
-
- border: 0px;
- z-index: 2;
- background-image:url(images/tooltip.png);
- background-repeat:no-repeat;
- width:16px;
- height:14px;
-}
-.dj_ie6 .claro .dijitTooltipConnector {
- background-image:url(images/tooltip8bit.png);
-}
-.claro .dijitTooltipABRight .dijitTooltipConnector {
-
- left: auto !important;
- right: 3px;
-}
-.claro .dijitTooltipBelow .dijitTooltipConnector {
-
- top: 0px;
- left: 3px;
- background-position:-31px 0%;
- width:16px;
- height:14px;
-}
-.claro .dijitTooltipAbove .dijitTooltipConnector {
-
- bottom: 0px;
- left: 3px;
- background-position:-15px 0%;
- width:16px;
- height:14px;
-}
-.dj_ie7 .claro .dijitTooltipAbove .dijitTooltipConnector,
-.dj_ie6 .claro .dijitTooltipAbove .dijitTooltipConnector {
- bottom: -1px;
-}
-.claro .dijitTooltipLeft {
- padding-right: 14px;
-}
-.dj_ie6 .claro .dijitTooltipLeft {
- padding-left: 15px;
-}
-.claro .dijitTooltipLeft .dijitTooltipConnector {
-
- right: 0px;
- bottom: 3px;
- background-position:0px 0%;
- width:16px;
- height:14px;
-}
-.claro .dijitTooltipRight {
- padding-left: 14px;
-}
-.claro .dijitTooltipRight .dijitTooltipConnector {
-
- left: 0px;
- bottom: 3px;
- background-position:-48px 0%;
- width:16px;
- height:14px;
-}
-.claro .dijitDialogUnderlay {
- background: #fff;
-}
-.claro .dijitAccordionContainer {
- border:none;
-}
-.claro .dijitAccordionInnerContainer {
- background-color: #e6e6e7;
- border:solid 1px #b5bcc7;
- margin-bottom:1px;
- -webkit-transition-property:background-color,border;
- -webkit-transition-duration:.3s;
- -webkit-transition-timing-function:linear;
-}
-.claro .dijitAccordionTitle {
- background-color: transparent;
- background-image: url(layout/images/accordion.png);
- background-position:0px 0px;
- background-repeat:repeat-x;
- padding: 5px 7px 2px 7px;
- min-height:17px;
- color:#4a4a4a;
-}
-.dj_ie6 .claro .dijitAccordionTitle {
- background-image: none;
-}
-.claro .dijitAccordionContainer .dijitAccordionContainer-child {
- background-color:#fff;
-
- border:1px solid #92bce1 !important;
- margin: 0px 2px 2px;
- padding: 9px;
-}
-.claro .dijitAccordionInnerContainerActive {
- border:1px solid #769DC0;
- background-color:#7dbefa;
- -webkit-transition-duration:.1s;
-}
-.claro .dijitAccordionInnerContainerActive .dijitAccordionTitle {
- background-position:0px -136px;
- color:#000;
-}
-.claro .dijitAccordionInnerContainerSelected {
- border-color:#92bce1;
- background-color: #cde8ff;
-}
-.claro .dijitAccordionInnerContainerSelected .dijitAccordionTitle {
- color:#000;
- background-position: 0 0;
-}
-.claro .dijitAccordionInnerContainerHover dijitAccordionTitle {
-
- color:#000;
-}
-.claro .dijitAccordionInnerContainerHover,
-.claro .dijitAccordionInnerContainerSelectedActive {
- border:1px solid #769DC0;
- background-color:#9dcfff;
- -webkit-transition-duration:.2s;
-}
-.claro .dijitAccordionInnerContainerSelectedHover .dijitAccordionContainer-child,
-.claro .dijitAccordionInnerContainerSelectedActive .dijitAccordionContainer-child {
- background-color:#ffffff;
- border:1px solid #769DC0 !important;
- -webkit-box-shadow:inset 0px 0px 3px rgba(0, 0, 0, .25);
- -moz-box-shadow:inset 0px 0px 3px rgba(0, 0, 0, .25);
-}
-.claro .dijitContentPane {
- padding: 8px;
-}
-.claro .dijitTabContainerTop-dijitContentPane,
-.claro .dijitTabContainerLeft-dijitContentPane,
-.claro .dijitTabContainerBottom-dijitContentPane,
-.claro .dijitTabContainerRight-dijitContentPane,
-.claro .dijitAccordionContainer-dijitContentPane {
- background-color: #fff;
- padding: 8px;
-}
-.claro .dijitSplitContainer-dijitContentPane,
-.claro .dijitBorderContainer-dijitContentPane {
- background-color: #fff;
- padding: 8px;
-}
-.claro .dijitCalendar {
- border:solid 1px #b5bcc7;
- background-color:#d4ebff;
- background-image:url(images/calendarContainerImages.png);
- background-position:0px -448px;
- background-repeat:repeat-x;
- text-align:center;
- padding:6px 5px 3px 5px;
- -moz-border-radius:4px;
- -webkit-border-radius:4px;
-}
-.dj_ie6 .claro .dijitCalendar {
- background-image:none;
-}
-.claro .dijitCalendar img {
- border:none;
-}
-.claro .dijitCalendarHover,
-.claro .dijitCalendarActive {
- background-color: #b7dcff;
- border:solid 1px #769dc0;
-}
-.claro .dijitCalendarMonthContainer th {
- text-align:center;
- padding-bottom:4px;
- vertical-align:middle;
-}
-.claro .dijitCalendarMonthLabelSpacer {
- display:none;
-}
-.claro .dijitCalendarMonthLabel {
- color:#000000;
- font-size: 1.091em;
- display: block;
-}
-.claro .dijitCalendarIncrementControl {
- width:18px;
- height:16px;
- background-image: url(images/calendarArrows.png);
- background-repeat: no-repeat;
-}
-.dj_ie6 .claro .dijitCalendarIncrementControl {
- background-image: url(images/calendarArrows8bit.png);
-}
-.claro .dijitCalendarIncrease {
- background-position:-18px 0px;
-}
-.claro .dijitCalendarArrowHover .dijitCalendarDecrease {
- background-position:-36px 0px;
-}
-.claro .dijitCalendarArrowHover .dijitCalendarIncrease {
- background-position:-55px 0px;
-}
-.claro .dijitCalendarArrowActive .dijitCalendarDecrease {
- background-position:-72px 0px;
-}
-.claro .dijitCalendarArrowActive .dijitCalendarIncrease {
- background-position:-91px 0px;
-}
-.claro .dijitA11ySideArrow {
-
- display: none;
-}
-.claro .dijitDayLabels th {
- padding:0px 4px 0px 4px;
- border-bottom:solid 1px #99b5cd;
- font-weight:bold;
- text-align:center;
-}
-.claro .dijitCalendarDayLabelTemplate {
- padding-bottom:0em;
- text-align:center;
- border-bottom:1px solid #99B5CD;
- font-size:0.909em;
- padding:0 3px 2px;
-}
-.claro .dijitCalendarDateTemplate {
- text-align:center;
- background-color:#fff;
- background-image:url(images/calendarContainerImages.png);
- background-position:0px 0px;
- background-repeat:repeat-x;
- border-bottom: 1px solid #dadde1;
- padding-top:0px;
- font-size:0.909em;
- font-family: Arial;
- font-weight:bold;
- letter-spacing:.05em;
- text-align:center;
-}
-.dj_ie6 .claro .dijitCalendarDateTemplate {
- background-image: none;
-}
-.claro .dijitCalendarPreviousMonth,
-.claro .dijitCalendarNextMonth {
- background-color:#ebf3f9;
- background-image:none;
- border-bottom:solid 1px #d2dae8;
- color:#547da1;
-}
-.claro .dijitCalendarDateTemplate .dijitCalendarDateLabel {
- text-decoration:none;
- display:block;
- padding:3px 5px 3px 4px;
- border:solid 1px #fff;
- color:#1e1e1e;
- background-color:rgba(171,212,251,0);
- -webkit-transition-property:background-color, border;
- -webkit-transition-duration:.35s;
-}
-.claro .dijitCalendarPreviousMonth .dijitCalendarDateLabel,
-.claro .dijitCalendarNextMonth .dijitCalendarDateLabel{
- color:#547da1;
- border-color:#ebf3f9;
-}
-.claro .dijitCalendarYearContainer {
- vertical-align:middle;
-}
-.claro .dijitCalendarYearControl {
- padding: 1px 2px 2px 2px;
-}
-.claro .dijitCalendarYearLabel {
- padding:2px 0px 0px 0px;
- margin:0;
-}
-.claro .dijitCalendarYearLabel span {
-
- vertical-align:middle;
-}
-.claro .dijitCalendarSelectedYear {
- padding:0px 3px;
-}
-.claro .dijitCalendarNextYear,
-.claro .dijitCalendarPreviousYear {
- padding: 1px 6px 1px 6px;
- font-size:0.909em;
-}
-.claro .dijitCalendarSelectedYear {
- font-size:1.091em;
- color:#000;
-}
-.claro .dijitCalendarHoveredDate .dijitCalendarDateLabel{
- background-color:#abd4fb;
- border:solid 1px #729dc2;
- color:#000;
- -webkit-transition-duration:.2s;
-}
-.claro .dijitCalendarNextYearHover,
-.claro .dijitCalendarPreviousYearHover {
- color:#000;
- border:solid 1px #fefefe;
- padding: 0px 5px 0px 5px;
- background-color:#eaf4fe;
-}
-.claro .dijitCalendarNextYearActive,
-.claro .dijitCalendarPreviousYearActive {
- border: solid 1px #87b3d9;
- padding: 0px 5px 0px 5px;
- background-color:#90bde6;
-}
-.claro .dijitCalendarActiveDate .dijitCalendarDateLabel {
- background-image:url(images/calendarContainerImages.png);
- background-position:0px -300px;
- background-color:#75b5f0;
- border:solid 1px #fff;
- -webkit-transition-duration:.1s;
-}
-.dj_ie6 .claro .dijitCalendarActiveDate .dijitCalendarDateLabel {
- background-image:none;
-}
-.claro .dijitCalendarSelectedDate .dijitCalendarDateLabel {
- color:#000;
- background-color:#e7f4ff;
- border-color:#accfed;
-}
-.claro .dijitCalendarDisabledDate .dijitCalendarDateLabel {
- text-decoration:line-through;
-
-
- background-color: transparent;
- border-width: 0px;
- padding: 4px 6px 4px 5px;
- color: #547DA1;
-}
-.claro .dijitCalendarMonthContainer .dijitMenu{
-
- top: 20px !important;
- left: 0px;
- border-color: #769dc0;
- background-color: #fff;
- text-align:center;
- background-image: none;
-}
-.claro .dijitCalendarMonthContainer .dijitMenu .dijitCalendarMonthLabel{
- border-top: solid 1px #fff;
- border-bottom: solid 1px #fff;
- padding: 2px 20px;
-}
-.claro .dijitCalendarMonthContainer .dijitMenu .dijitMenuItemHover {
- background-color: #abd6ff;
- border-color: #769dc0;
- border-width:1px 0px;
- background-image: url(images/commonHighlight.png);
- background-repeat:repeat-x;
-}
-.claro .dijitMenuBar {
- border: 1px solid #b5bcc7;
- margin: 0px;
- padding: 0px;
- background-color: #e6e6e7;
- background-image: url(images/commonHighlight.png);
- background-position:0px 0px;
- background-repeat:repeat-x;
-}
-.dj_ie6 .claro .dijitMenuBar {
- background-image:none;
-}
-.claro .dijitMenu {
- background-repeat:repeat-y;
- background-color:#fff;
- border: 1px solid #769dc0;
-
- margin: -1px 0;
-}
-.claro .dijitMenuBar .dijitMenuItem {
- padding: 6px 10px 7px;
- background-position:0px 100px;
- color:#4a4a4a;
- margin:-1px;
-}
-.claro .dijitMenuItem {
- background-image: url(images/menuHighlight.png);
- background-position:0px -40px;
- background-repeat:repeat-x;
-}
-.claro .dijitMenuTable {
- border-collapse:separate;
- border-spacing:0 0;
- padding:0px;
-}
-.claro .dijitMenuItem td{
- padding:1px;
-}
-.claro .dijitMenuPassive .dijitMenuItemHover,
-.claro .dijitMenuPassive .dijitMenuItemSelected {
- background-color: #abd6ff;
- border:solid 1px #769dc0;
- background-position:0px 0px;
- color:#000;
- padding: 5px 9px 6px;
-}
-.claro .dijitMenuPassive .dijitMenuItemActive{
- background-position:0px -177px;
-}
-.dj_ie6 .claro .dijitMenuItem,
-.dj_ie6 .claro .dijitMenuPassive .dijitMenuItem {
- background-image: none;
-}
-.claro .dijitMenuActive .dijitMenuItemHover,
-.claro .dijitMenuActive .dijitMenuItemSelected {
- border:solid 1px #769dc0;
- padding: 5px 9px 6px;
- background-color: #9dcfff;
- background-position:0px 0px;
- color:#000;
-}
-.dj_ie .claro .dijitMenuActive .dijitMenuItemHover,
-.dj_ie .claro .dijitMenuActive .dijitMenuItemSelected,
-.dj_ie .claro .dijitMenuPassive .dijitMenuItemHover,
-.dj_ie .claro .dijitMenuPassive .dijitMenuItemSelected {
- padding-top: 6px;
- padding-bottom: 5px;
- margin-top: -3px;
-}
-.claro .dijitMenuActive .dijitMenuItemActive{
- background-color: #7dbefa;
- background-position:0px -177px;
-}
-.claro .dijitMenuItemActive {
- background-position:0px -177px;
-}
-.claro td.dijitMenuItemIconCell {
- padding: 2px;
- margin: 0px 0px 0px 4px;
-}
-.claro td.dijitMenuItemLabel {
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.claro .dijitMenuExpand {
- width: 7px;
- height: 7px;
- background-image: url(images/spriteArrows.png);
- background-position: -14px 0px;
- margin-right:3px;
-}
-.claro .dijitMenuItemDisabled .dijitMenuItemIconCell {
- opacity:1;
-}
-.claro .dijitMenuSeparatorTop {
- height: auto;
- margin-top:1px;
- border-bottom: 1px solid #b5bcc7
-}
-.claro .dijitMenuSeparatorBottom{
- height: auto;
- margin-bottom:1px;
-}
-.claro .dijitCheckedMenuItemIconChar {
- display: none;
-}
-.claro .dijitCheckedMenuItemIcon {
- 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);
-}
-.claro .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
- background-position: 0 50%;
-}
-.claro .dijitComboBoxMenu {
- margin-left:0px;
- background-image: none;
-}
-.claro .dijitComboBoxMenu .dijitMenuItem{
- padding:2px 0px;
- text-indent:6px;
- border-width:1px 0px 1px 0px;
- border-style:solid;
- border-color:#fff;
-}
-.claro .dijitComboBoxMenu .dijitMenuItemSelected {
- color:#000;
- border-color:#768dc0;
- background-color:#abd6ff;
-}
-.claro .dijitComboBoxMenuActive .dijitMenuItemSelected {
- background-position:0px -177px;
- background-color:#7dbefa;
-}
-.claro .dijitMenuPreviousButton, .claro .dijitMenuNextButton {
- font-style: italic;
-}
-.claro .dijitSliderBar {
- border-style: solid;
- outline: 1px;
-}
-.claro .dijitSliderFocused .dijitSliderBar {
- border-color: #769dc0;
-}
-.claro .dijitSliderHover .dijitSliderBar {
- border-color: #769dc0;
-}
-.claro .dijitSliderDisabled .dijitSliderBar {
- background-image: none;
- border-color: #d3d3d3;
-}
-.claro .dijitRuleLabelsContainerH {
- padding: 2px 0px;
-}
-.claro .dijitSlider .dijitSliderProgressBarH,
-.claro .dijitSlider .dijitSliderLeftBumper{
- background-image: url(form/images/sliderHorizontal.png);
- background-repeat:repeat-x;
- background-position:0 -20px;
- border-color: #b5bcc7;
- background-color: #cfe5fa;
-}
-.claro .dijitSlider .dijitSliderRemainingBarH,
-.claro .dijitSlider .dijitSliderRightBumper{
- background-image: url(form/images/sliderHorizontal.png);
- background-repeat:repeat-x;
- background-position:0 -11px;
- border-color: #b5bcc7;
- background-color: #fff;
-}
-.claro .dijitSliderRightBumper {
- border-right: solid 1px #b5bcc7;
-}
-.claro .dijitSliderLeftBumper {
- border-left: solid 1px #b5bcc7;
-}
-.claro .dijitSliderHover .dijitSliderProgressBarH,
-.claro .dijitSliderHover .dijitSliderLeftBumper{
- background-position:0 -20px;
- background-color: #abd6ff;
- border-color: #769dc0;
-}
-.claro .dijitSliderHover .dijitSliderRemainingBarH,
-.claro .dijitSliderHover .dijitSliderRightBumper{
- background-position:0 0px;
- background-color: #fff;
- border-color: #769dc0;
-}
-.claro .dijitSliderFocused .dijitSliderProgressBarH,
-.claro .dijitSliderFocused .dijitSliderLeftBumper{
- background-position:0 -30px;
- background-color: #abd6ff;
- border-color: #769dc0;
-}
-.claro .dijitSliderFocused .dijitSliderRemainingBarH,
-.claro .dijitSliderFocused .dijitSliderRightBumper{
- background-position:0 -9px;
- background-color: #fff;
- border-color: #769dc0;
-}
-.claro .dijitSliderDisabled .dijitSliderProgressBarH,
-.claro .dijitSliderDisabled .dijitSliderLeftBumper{
- background-color: #cdcdcd;
- background-image:none;
-}
-.claro .dijitSliderDisabled .dijitSliderRemainingBarH,
-.claro .dijitSliderDisabled .dijitSliderRightBumper{
- background-color: #efefef;
-}
-.claro .dijitRuleLabelsContainerV {
- padding: 0px 2px;
-}
-.claro .dijitSlider .dijitSliderProgressBarV,
-.claro .dijitSlider .dijitSliderBottomBumper{
- background-image: url(form/images/sliderVertical.png);
- background-repeat:repeat-y;
- background-position:-36px 0;
- border-color: #b5bcc7;
- background-color: #cfe5fa;
-}
-.claro .dijitSlider .dijitSliderRemainingBarV,
-.claro .dijitSlider .dijitSliderTopBumper{
- background-image: url(form/images/sliderVertical.png);
- background-repeat:repeat-y;
- background-position:-3px 0;
- border-color: #b5bcc7;
- background-color: #fff;
-}
-.claro .dijitSliderBottomBumper {
- border-bottom: solid 1px #b5bcc7;
-}
-.claro .dijitSliderTopBumper {
- border-top: solid 1px #b5bcc7;
-}
-.claro .dijitSliderHover .dijitSliderProgressBarV,
-.claro .dijitSliderHover .dijitSliderBottomBumper{
- background-position:-36px 0;
- background-color: #abd6ff;
-}
-.claro .dijitSliderHover .dijitSliderRemainingBarV,
-.claro .dijitSliderHover .dijitSliderTopBumper{
- background-position:0 0;
- background-color: #fff;
-}
-.claro .dijitSliderFocused .dijitSliderProgressBarV,
-.claro .dijitSliderFocused .dijitSliderBottomBumper{
- background-position:-56px 0;
- background-color: #abd6ff;
-}
-.claro .dijitSliderFocused .dijitSliderRemainingBarV,
-.claro .dijitSliderFocused .dijitSliderTopBumper{
- background-position:-18px 0;
- background-color: #fff;
-}
-.claro .dijitSliderDisabled .dijitSliderProgressBarV,
-.claro .dijitSliderDisabled .dijitSliderBottomBumper{
- background-color: #cdcdcd;
-}
-.claro .dijitSliderDisabled .dijitSliderRemainingBarV,
-.claro .dijitSliderDisabled .dijitSliderTopBumper{
- background-color: #efefef;
-}
-.claro .dijitSliderImageHandleH {
- border: 0px;
- width: 18px;
- height: 16px;
- background-image: url(form/images/sliderThumbs.png);
- background-repeat:no-repeat;
- background-position:0 0;
-}
-.claro .dijitSliderHover .dijitSliderImageHandleH {
- background-position:-18px 0;
-}
-.claro .dijitSliderFocused .dijitSliderImageHandleH {
- background-position:-36px 0;
-}
-.claro .dijitSliderProgressBarH .dijitSliderThumbHover{
- background-position:-36px 0;
-}
-.claro .dijitSliderProgressBarH .dijitSliderThumbActive{
- background-position:-36px 0;
-}
-.claro .dijitSliderReadOnly .dijitSliderImageHandleH,
-.claro .dijitSliderDisabled .dijitSliderImageHandleH {
- background-position:-54px 0;
-}
-.claro .dijitSliderImageHandleV {
- border: 0px;
- width: 18px;
- height: 16px;
- background-image: url(form/images/sliderThumbs.png);
- background-repeat:no-repeat;
- background-position:-289px 0;
-}
-.claro .dijitSliderHover .dijitSliderImageHandleV {
- background-position:-307px 0;
-}
-.claro .dijitSliderFocused .dijitSliderImageHandleV {
- background-position:-325px 0;
-}
-.claro .dijitSliderProgressBarV .dijitSliderThumbHover{
- background-position:-325px 0;
-}
-.claro .dijitSliderProgressBarV .dijitSliderThumbActive{
- background-position:-325px 0;
-}
-.claro .dijitSliderReadOnly .dijitSliderImageHandleV,
-.claro .dijitSliderDisabled .dijitSliderImageHandleV {
- background-position:-343px 0;
-}
-.claro .dijitSliderButtonContainerH{
- padding: 1px 3px 1px 2px;
-}
-.claro .dijitSliderButtonContainerV{
- padding: 3px 1px 2px 1px;
-}
-.claro .dijitSliderDecrementIconH,
-.claro .dijitSliderIncrementIconH,
-.claro .dijitSliderDecrementIconV,
-.claro .dijitSliderIncrementIconV {
- background-image: url(form/images/commonFormArrows.png);
- background-repeat:no-repeat;
- background-color: #e9ecf2;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border: solid 1px #b5bcc7;
- font-size: 1px;
-}
-.claro .dijitSliderDecrementIconH,
-.claro .dijitSliderIncrementIconH {
- height: 12px;
- width: 9px;
-}
-.claro .dijitSliderDecrementIconV,
-.claro .dijitSliderIncrementIconV {
- height: 9px;
- width: 12px;
-}
-.claro .dijitSliderActive .dijitSliderDecrementIconH,
-.claro .dijitSliderActive .dijitSliderIncrementIconH,
-.claro .dijitSliderActive .dijitSliderDecrementIconV,
-.claro .dijitSliderActive .dijitSliderIncrementIconV,
-.claro .dijitSliderHover .dijitSliderDecrementIconH,
-.claro .dijitSliderHover .dijitSliderIncrementIconH,
-.claro .dijitSliderHover .dijitSliderDecrementIconV,
-.claro .dijitSliderHover .dijitSliderIncrementIconV {
- border: solid 1px #769dc0;
- background-color:#fff;
-}
-.claro .dijitSliderDecrementIconH {
- background-position:-357px 50%;
-}
-.claro .dijitSliderActive .dijitSliderDecrementIconH
-.claro .dijitSliderHover .dijitSliderDecrementIconH {
- background-position:-393px 50%;
-}
-.claro .dijitSliderIncrementIconH {
- background-position:-251px 50%;
-}
-.claro .dijitSliderActive .dijitSliderIncrementIconH
-.claro .dijitSliderHover .dijitSliderIncrementIconH {
- background-position:-283px 50%;
-}
-.claro .dijitSliderDecrementIconV {
- background-position:-38px 50%;
-}
-.claro .dijitSliderActive .dijitSliderDecrementIconV
-.claro .dijitSliderHover .dijitSliderDecrementIconV {
- background-position:-73px 50%;
-}
-.claro .dijitSliderIncrementIconV {
- background-position:-143px 49%;
-}
-.claro .dijitSliderActive .dijitSliderIncrementIconV
-.claro .dijitSliderHover .dijitSliderIncrementIconV {
- background-position:-178px 49%;
-}
-.claro .dijitSliderButtonContainerV .dijitSliderDecrementButtonHover,
-.claro .dijitSliderButtonContainerH .dijitSliderDecrementButtonHover,
-.claro .dijitSliderButtonContainerV .dijitSliderIncrementButtonHover,
-.claro .dijitSliderButtonContainerH .dijitSliderIncrementButtonHover {
- background-color: #cce3fc;
-}
-.claro .dijitSliderButtonContainerV .dijitSliderDecrementButtonActive,
-.claro .dijitSliderButtonContainerH .dijitSliderDecrementButtonActive,
-.claro .dijitSliderButtonContainerV .dijitSliderIncrementButtonActive,
-.claro .dijitSliderButtonContainerH .dijitSliderIncrementButtonActive {
- background-color: #a5d0fc;
- border-color:#6591b9;
-}
-.claro .dijitSliderButtonInner {
- visibility: hidden;
-}
-.claro .dijitSliderDisabled .dijitSliderBar{
- border-color: #d3d3d3;
-}
-.claro .dijitSliderReadOnly *,.claro .dijitSliderDisabled * {
- border-color: #d3d3d3;
- color: #bdbdbd;
-}
-.claro .dijitSliderReadOnly .dijitSliderDecrementIconH,
-.claro .dijitSliderDisabled .dijitSliderDecrementIconH {
- background-position:-321px 50%;
- background-color:#e9e9e9;
-}
-.claro .dijitSliderReadOnly .dijitSliderIncrementIconH,
-.claro .dijitSliderDisabled .dijitSliderIncrementIconH {
- background-position:-215px 50%;
- background-color:#e9e9e9;
-}
-.claro .dijitSliderReadOnly .dijitSliderDecrementIconV,
-.claro .dijitSliderDisabled .dijitSliderDecrementIconV {
- background-position:-3px 49%;
- background-color:#e9e9e9;
-}
-.claro .dijitSliderReadOnly .dijitSliderIncrementIconV,
-.claro .dijitSliderDisabled .dijitSliderIncrementIconV {
- background-position:-107px 49%;
- background-color:#e9e9e9;
-}
-.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarH,
-.dj_ie6 .claro .dijitSlider .dijitSliderLeftBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarH,
-.dj_ie6 .claro .dijitSlider .dijitSliderRightBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarV,
-.dj_ie6 .claro .dijitSlider .dijitSliderTopBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarV,
-.dj_ie6 .claro .dijitSlider .dijitSliderBottomBumper {
- background-image:none;
-}
-.claro .dijitColorPalette {
- outline: 1px solid #769dc0;
- border: 1px solid #c0ccdf;
- background:#fff;
- -moz-border-radius: 0px;
-}
-.claro .dijitColorPalette .dijitPaletteImg {
-
- border: 1px solid #cecece;
-}
-.claro .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
- border: 1px solid #000;
-}
-.claro .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
-.claro .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
- border: 2px solid #000;
-}
-.claro .dijitInlineEditBoxDisplayMode {
- border: 1px solid transparent;
-}
-.claro .dijitInlineEditBoxDisplayModeHover {
- background-color: #e2f1ff;
- border: solid 1px #769dc0;
-}
-.dj_ie6 .claro .dijitInlineEditBoxDisplayMode {
- border: none;
-}
-
-.claro .dijitProgressBar {
- margin:2px 0px 2px 0px;
-}
-.claro .dijitProgressBarEmpty {
-
- background:#fff url(images/progressBarEmpty.png) repeat-none left;
- border-color: #769dc0;
-}
-.claro .dijitProgressBarTile {
-
- background:#9dcfff url(images/progressBarFull.png) repeat-x top;
-}
-.dj_ie6 .claro .dijitProgressBarTile {
- background-image: none;
-}
-.claro .dijitProgressBarFull {
- border-right:1px solid #769dc0;
-}
-.claro .dijitProgressBarLabel {
-
- color:#293a4b;
-}
-.claro .dijitProgressBarIndeterminate .dijitProgressBarTile {
-
- background:#cad2de url(images/progressBarAnim.gif) repeat-x top;
-}
-.claro .dijitTimePicker .dijitButtonNode {
- padding: 0 0;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
-}
-.claro .dijitTimePicker{
- border:1px #b5bcc7 solid;
- border-top:none;
- border-bottom:none;
- background-color:#fff;
-}
-.claro .dijitTimePickerItem{
-
- background-image: url(images/commonHighlight.png);
- background-position:0px -1px;
- background-repeat:repeat-x;
- border-top:solid 1px #b5bcc7;
- border-bottom:solid 1px #b5bcc7;
- margin-right:-1px;
- margin-left:-1px;
- margin-top:-1px;
-}
-.dj_ie6 .claro .dijitTimePickerItem {
- background-image: none;
-}
-.claro .dijitTimePickerTick {
-
- color:#7a7a7a;
- background-color:#f2f2f2;
- font-size:0.818em;
-}
-.claro .dijitTimePickerMarker {
-
- color:#000;
- background-color:#e3f2ff;
- font-size: 1em;
- white-space: nowrap;
-}
-.claro .dijitTimePickerTickHover,
-.claro .dijitTimePickerMarkerHover,
-.claro .dijitTimePickerMarkerSelected,
-.claro .dijitTimePickerTickSelected {
- background-color: #83c0fa;
- color:#000;
- border:solid 1px #b5bcc7;
- margin-left:-7px;
- margin-right:-7px;
-}
-.claro .dijitTimePickerMarkerSelected,
-.claro .dijitTimePickerTickSelected {
- font-size: 1em;
- }
-.dj_ie .claro .dijitTimePickerTickHover,
-.dj_ie .claro .dijitTimePickerMarkerHover,
-.dj_ie .claro .dijitTimePickerMarkerSelected,
-.dj_ie .claro .dijitTimePickerTickSelected {
- width: 114%;
-}
-.dj_ie6 .claro .dijitTimePickerTickHover,
-.dj_ie6 .claro .dijitTimePickerMarkerHover,
-.dj_ie6 .claro .dijitTimePickerMarkerSelected,
-.dj_ie6 .claro .dijitTimePickerTickSelected {
- position: relative;
- zoom: 1;
-}
-.claro .dijitTimePickerTick .dijitTimePickerItemInner {
- padding:1px;
- margin:0px;
-}
-.claro .dijitTimePicker .dijitButtonNode {
- border-left:none;
- border-right:none;
- border-color:#b5bcc7;
- background-color: #f6f7fa;
- background-image: url(images/commonHighlight.png);
- background-position:0px -1px;
- background-repeat:repeat-x;
-}
-.dj_ie6 .claro .dijitTimePicker .dijitButtonNode {
- background-image: none;
-}
-.claro .dijitTimePicker .dijitArrowButtonInner{
- height: 100%;
- background-image: url(form/images/commonFormArrows.png);
- background-repeat: no-repeat;
- background-position:-140px 45%;
-}
-.claro .dijitTimePicker .dijitDownArrowButton .dijitArrowButtonInner{
- background-position:-35px 45%;
-}
-.claro .dijitTimePicker .dijitUpArrowHover,
-.claro .dijitTimePicker .dijitDownArrowHover {
- background-color: #abd6ff;
-}
-.claro .dijitTimePicker .dijitUpArrowHover .dijitArrowButtonInner {
- background-position:-175px 45%;
-}
-.claro .dijitTimePicker .dijitDownArrowHover .dijitArrowButtonInner {
- background-position:-70px 45%;
-}
-.claro .dijitBorderContainer {
- border: 1px #b5bcc7 solid;
- padding: 5px;
-}
-.claro .dijitSplitContainer-child,
-.claro .dijitBorderContainer-child {
-
- border: 1px #b5bcc7 solid;
-}
-.claro .dijitBorderContainer-dijitTabContainerTop,
-.claro .dijitBorderContainer-dijitTabContainerBottom,
-.claro .dijitBorderContainer-dijitTabContainerLeft,
-.claro .dijitBorderContainer-dijitTabContainerRight,
-.claro .dijitBorderContainer-dijitAccordionContainer {
-
- border: none;
-}
-.claro .dijitBorderContainer-dijitBorderContainer {
-
- border: 1px #c0ccdf solid;
- padding: 5px;
-}
-.claro .dijitSplitterH,
-.claro .dijitGutterH {
- background:none;
- border:0;
- height:5px;
-}
-.claro .dijitSplitterH .dijitSplitterThumb {
- background:#dde2e9 none;
- height:1px;
- top:2px;
- width:19px;
-}
-.claro .dijitSplitterV,
-.claro .dijitGutterV {
- background:none;
- border:0;
- width:5px;
- margin: 0;
-}
-.claro .dijitSplitterV .dijitSplitterThumb {
- background:#dde2e9 none;
- height:19px;
- left:2px;
- width:1px;
- margin: 0;
-}
-.claro .dijitSplitterHHover {
- font-size: 1px;
- background: url(layout/images/splitterHorizontalHover.png) no-repeat center top;
-}
-.claro .dijitSplitterHHover .dijitSplitterThumb {
- background:#769dc0 none;
-}
-.claro .dijitSplitterVHover {
- font-size: 1px;
- background: url(layout/images/splitterVerticalHover.png) no-repeat center left;
-}
-.claro .dijitSplitterVHover .dijitSplitterThumb {
- background:#769dc0 none;
-}
-.dj_ie6 .dijitSplitterHHover,
-.dj_ie6 .claro .dijitSplitterVHover {
- background-color:#cfe9ff;
- background-image:none;
-}
-.claro .dijitSplitterHActive {
- font-size: 1px;
- background-color:#abd4fb;
- border-top:blue;
-}
-.claro .dijitSplitterVActive {
- font-size: 1px;
- background-color:#abd4fb;
-}
-.claro .dijitTreeNode {
- zoom: 1;
-}
-.claro .dijitTreeIsRoot {
- background-image: none;
-}
-.claro .dijitTreeRow {
-
- padding: 4px 1px 2px 0px;
- margin-left: 1px;
- background-image: url(images/commonHighlight.png);
- background-position:0px 0px;
- background-repeat:repeat-x;
- border-color: rgba(118,157,192,0);
- background-color: rgba(171,214,255,0);
- -webkit-transition-property:background-color, border-color;
- -webkit-transition-duration:.25s ;
- -webkit-transition-timing-function: ease-out;
-}
-.dj_ie6 .claro .dijitTreeRow {
- background-image: none;
-}
-.claro .dijitTreeRowSelected {
- background-repeat:repeat-x;
- background-color:#d8edff;
- padding: 3px 0px 1px;
- margin-left: 0px;
- border:solid 1px #c3e2fd;
- color:#000;
-}
-.claro .dijitTreeRowHover {
- background-color:#abd6ff;
- padding: 3px 0px 1px;
- margin-left: 0px;
- border:solid 1px #769dc0;
- color:#000;
- -webkit-transition-duration:.25s ;
-}
-.claro .dijitTreeRowActive {
- background-color:#7dbefa;
- background-position:0px -177px;
- padding: 3px 0px 1px;
- margin-left: 0px;
- border:solid 1px #769dc0;
- color:#000;
-}
-.dj_ie6 .claro .dijitTreeRowActive {
- background-image: none;
-}
-.claro .dijitTreeRowFocused {
- background-repeat: repeat;
-}
-.claro .dijitTreeExpando {
- background-image: url(images/treeExpandImages.png);
- width: 16px;
- height: 16px;
- background-position: -35px 0px
-}
-.dj_ie6 .claro .dijitTreeExpando {
- background-image: url(images/treeExpandImages8bit.png);
-}
-.claro .dijitTreeRowHover .dijitTreeExpandoOpened {
- background-position: -53px 0px;
-}
-.claro .dijitTreeExpandoClosed {
- background-position: 1px 0px;
-}
-.claro .dijitTreeRowHover .dijitTreeExpandoClosed {
- background-position: -17px 0px;
-}
-.claro .dijitTreeExpandoLeaf{
- background-image:none;
-}
-.claro .dijitTreeExpandoLoading {
- background-image: url(images/loadingAnimation.gif);
-}
-.claro .dijitTreeNode .dojoDndItemBefore,
-.claro .dijitTreeNode .dojoDndItemAfter {
- border-bottom: none;
- border-top: none;
-}
-.claro .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
- border-top: 2px solid #369;
-}
-.claro .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
- border-bottom: 2px solid #369;
-}
-
-.claro .dijitToolbar {
- border-bottom: 1px solid #b5bcc7;
- background-color: #f1f1f1;
- background-image: url(images/commonHighlight.png);
- background-position:0px 0px;
- background-repeat:repeat-x;
- padding: 2px 0px 2px 4px;
- zoom: 1;
-}
-.claro .dijitToolbar label {
- padding: 0px 3px 0 6px;
-}
-.claro .dijitToolbar .dijitButtonNode {
- border:none;
- padding: 2px;
- background-image: url(images/commonHighlight.png);
- background-position:0 -30px;
- background-repeat:repeat-x;
- background-color:rgba(171,214,255,0);
- border-radius: 2px;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- -webkit-transition-property:background-color;
- -webkit-transition-duration:.3s, .35s;
-}
-.claro .dijitToolbar .dijitComboButton .dijitButtonNode{
- padding: 3px 2px 3px 2px;
-}
-.dj_ie .claro .dijitToolbar .dijitButtonNode {
- background-color: transparent;
-}
-.dj_ie6 .claro .dijitToolbar .dijitButtonNode {
- background: none;
-}
-.claro .dijitToolbar .dijitComboBox .dijitButtonNode {
- padding: 0px;
-}
-.claro .dijitToolbar .dijitComboButton {
- padding: 1px;
-}
-.claro .dijitToolbar .dijitButtonHover .dijitButtonNode,
-.claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
-.claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode {
- background-position:0 0;
- border:solid 1px #769dc0;
- background-color: #abd6ff;
- padding: 1px;
-}
-.claro .dijitToolbar .dijitComboButtonHover {
- background-color: #abd6ff;
- border: solid 1px #769dc0;
- padding: 0px;
-}
-.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode,
-.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
- background-position:0 0;
- padding: 2px;
-}
-.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
- background-color: #7dd6fa;
-}
-.claro .dijitToolbar .dijitButtonActive .dijitButtonNode,
-.claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode,
-.claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
- border:solid 1px #769dc0;
- background-color:#7dbefa;
- background-position:0px -177px;
- padding: 1px;
-}
-.claro .dijitToolbar .dijitComboButtonActive {
- -webkit-transition-duration:.2s;
- border: solid 1px #769dc0;
- padding: 0px;
-}
-.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode {
- background-color: #7dbefa;
- background-position:0px -177px;
- padding: 2px;
-}
-.claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonActive {
- background-color: #7dbefa;
-}
-.claro .dijitToolbar .dijitToggleButtonChecked .dijitButtonNode {
- border-color: #769dc0;
- background-color:#fff;
- padding: 1px;
-}
-.dj_ie6 .claro .dijitToolbar .dijitButtonContents,
-.dj_ie7 .claro .dijitToolbar .dijitButtonContents {
- margin: -2px 0;
- padding: 0;
-}
-.dj_ie6 .claro .dijitToolbar {
- background-image: none;
-}
-.dj_ie6 .claro .dijitToolbar .dijitButtonNode {
- margin: 1px;
- border: none;
-}
-.dj_ie6 .claro .dijitToolbar .dijitButtonHover .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNodeHover,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover,
-.dj_ie6 .claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitButtonActive .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNodeActive,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonActive,
-.dj_ie6 .claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode,
-.claro .dijitToolbar .dijitToggleButtonChecked .dijitButtonNode {
- margin: 0;
- border-width: 1px;
- border-style: solid;
- background-image: none;
-}
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNodeHover,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNodeActive,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonActive {
- padding: 1px;
-}
-.claro .dijitToolbarSeparator {
-
- background: url(../../icons/images/editorIconsEnabled.png);
-}
-.claro .dijitDisabled .dijitToolbar {
- background:none;
- background-color:#f5f5f5;
- border-bottom: 1px solid #d3d3d3;
-}
-.claro .dijitEditorIFrameContainer{
- padding:3px 3px 1px 10px;
-}
-.claro .dijitEditorIFrame {
- background-color: #fff;
-}
-.claro .dijitEditor {
- border: 1px solid #b5bcc7;
-}
-.claro .dijitEditor .dijitEditorIFrameContainer{
- background-color: #fff;
- 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: #eef7ff;
-}
-.claro .dijitEditorFocused .dijitEditorIFrameContainer,
-.claro .dijitEditorFocused .dijitEditorIFrameContainer .dijitEditorIFrame{
-
- background-color: #fff;
-}
-.claro .dijitEditorDisabled {
- border: 1px solid #d3d3d3;
- color: #818181;
-}
-.claro .dijitDisabled .dijitEditorIFrame,
-.claro .dijitDisabled .dijitEditorIFrameContainer {
- background-color: #efefef;
- background-image: none;
-}
-.dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled.png);
- background-repeat: no-repeat;
- width: 18px;
- height: 18px;
- text-align: center;
-}
-.dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled.png);
-}
-.dijitEditorIconSep { background-position: 0px; }
-.dijitEditorIconSave { background-position: -18px; }
-.dijitEditorIconPrint { background-position: -36px; }
-.dijitEditorIconCut { background-position: -54px; }
-.dijitEditorIconCopy { background-position: -72px; }
-.dijitEditorIconPaste { background-position: -90px; }
-.dijitEditorIconDelete { background-position: -108px; }
-.dijitEditorIconCancel { background-position: -126px; }
-.dijitEditorIconUndo { background-position: -144px; }
-.dijitEditorIconRedo { background-position: -162px; }
-.dijitEditorIconSelectAll { background-position: -180px; }
-.dijitEditorIconBold { background-position: -198px; }
-.dijitEditorIconItalic { background-position: -216px; }
-.dijitEditorIconUnderline { background-position: -234px; }
-.dijitEditorIconStrikethrough { background-position: -252px; }
-.dijitEditorIconSuperscript { background-position: -270px; }
-.dijitEditorIconSubscript { background-position: -288px; }
-.dijitEditorIconJustifyCenter { background-position: -306px; }
-.dijitEditorIconJustifyFull { background-position: -324px; }
-.dijitEditorIconJustifyLeft { background-position: -342px; }
-.dijitEditorIconJustifyRight { background-position: -360px; }
-.dijitEditorIconIndent { background-position: -378px; }
-.dijitEditorIconOutdent { background-position: -396px; }
-.dijitEditorIconListBulletIndent { background-position: -414px; }
-.dijitEditorIconListBulletOutdent { background-position: -432px; }
-.dijitEditorIconListNumIndent { background-position: -450px; }
-.dijitEditorIconListNumOutdent { background-position: -468px; }
-.dijitEditorIconTabIndent { background-position: -486px; }
-.dijitEditorIconLeftToRight { background-position: -504px; }
-.dijitEditorIconRightToLeft, .dijitEditorIconToggleDir { background-position: -522px; }
-.dijitEditorIconBackColor { background-position: -540px; }
-.dijitEditorIconForeColor { background-position: -558px; }
-.dijitEditorIconHiliteColor { background-position: -576px; }
-.dijitEditorIconNewPage { background-position: -594px; }
-.dijitEditorIconInsertImage { background-position: -612px; }
-.dijitEditorIconInsertTable { background-position: -630px; }
-.dijitEditorIconSpace { background-position: -648px; }
-.dijitEditorIconInsertHorizontalRule { background-position: -666px; }
-.dijitEditorIconInsertOrderedList { background-position: -684px; }
-.dijitEditorIconInsertUnorderedList { background-position: -702px; }
-.dijitEditorIconCreateLink { background-position: -720px; }
-.dijitEditorIconUnlink { background-position: -738px; }
-.dijitEditorIconViewSource { background-position: -756px; }
-.dijitEditorIconRemoveFormat { background-position: -774px; }
-.dijitEditorIconFullScreen { background-position: -792px; }
-.dijitEditorIconWikiword { background-position: -810px; }
-
-.claro .dijitTitlePaneTitle {
- background-color: #e6e6e7;
- background-image: url(images/titlebar.png);
- background-repeat:repeat-x;
- border:1px solid #b5bcc7;
- padding: 0px 7px 3px 7px;
- min-height:17px;
- color:#131313;
-}
-.dj_ie6 .claro .dijitTitlePaneTitle {
- background-image: none;
-}
-.claro .dijitTitlePaneTitleHover {
- background-color: #abd6ff;
- border-color: #769dc0;
-}
-.claro .dijitTitlePaneTitleActive {
- background-color: #7dbefa;
- border-color: #769dc0;
- background-position:0px -136px;
-}
-.claro .dijitTitlePaneTitleFocus {
- margin-top:3px;
- padding-bottom:2px;
-}
-.claro .dijitTitlePane .dijitArrowNode {
- background-image: url(images/spriteArrows.png);
- background-repeat: no-repeat;
- height: 8px;
- width: 7px;
-}
-.claro .dijitTitlePane .dijitOpen .dijitArrowNode {
- background-position: 0px 0px;
-}
-.claro .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: -14px 0px;
-}
-.claro .dijitTitlePaneFocused .dijitTitlePaneTextNode {
- color:#000;
-}
-.claro .dijitTitlePaneContentOuter {
- background: #ffffff;
- border:1px solid #b5bcc7;
- border-top:none;
-}
-.claro .dijitTitlePaneContentInner {
- padding:10px;
-}
-.claro .dijitTitlePaneTextNode {
- margin-left: 4px;
- margin-right: 4px;
- vertical-align:text-top;
-}
-.claro .dijitSpinnerButtonContainer {
- overflow: hidden;
- position: relative;
- width: auto;
- padding: 0 2px;
-}
-.claro .dijitSpinnerButtonContainer .dijitSpinnerButtonInner {
- border-width: 1px 0;
- border-style: solid none;
-}
-.claro .dijitSpinner .dijitArrowButton {
- width:auto;
- background-color: #ebeef4;
- background-image: url(form/images/formHighlight.png);
- background-position:0px 0px;
- background-repeat:repeat-x;
- overflow: hidden;
-}
-.dj_iequirks .claro .dijitSpinner .dijitArrowButton {
- overflow: visible;
-}
-.claro .dijitSpinner .dijitSpinnerButtonInner {
- width: 15px;
-}
-.claro .dijitSpinner .dijitArrowButtonInner {
- border:solid 1px #fff;
- border-bottom-width: 0;
- background-image: url(form/images/commonFormArrows.png);
- background-repeat: no-repeat;
- height: 100%;
- width:15px;
- padding-left: 1px;
- padding-right: 1px;
-
- background-position:-139px center;
-
- display: block;
- margin: -1px 0px -1px 0px;
- #margin-top: 0;
-}
-.dj_iequirks .claro .dijitSpinner .dijitArrowButtonInner {
- width: 19px;
-}
-.claro .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
- background-position:-34px;
-}
-.claro .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding: 0;
-}
-.claro .dijitUpArrowButtonActive,
-.claro .dijitDownArrowButtonActive {
- background-color:#abd6ff;
-}
-.claro .dijitSpinner .dijitUpArrowButtonHover,
-.claro .dijitSpinner .dijitDownArrowButtonHover,
-.claro .dijitSpinnerFocused .dijitArrowButton {
- background-color: #a0d1ff;
-}
-.claro .dijitSpinner .dijitUpArrowButtonHover .dijitArrowButtonInner {
- background-position:-174px;
-}
-.claro .dijitSpinner .dijitDownArrowButtonHover .dijitArrowButtonInner {
- background-position:-69px;
-}
-.claro .dijitSpinnerFocused {
- background-color: #fff;
- background-image: none;
-}
-.claro .dijitSpinner .dijitDownArrowButtonActive,
-.claro .dijitSpinner .dijitUpArrowButtonActive {
- background-color: #3299f9;
- background-position:0px -177px;
-}
-.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner,
-.claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
-
- border: 0px;
- padding: 1px;
- margin-right:2px;
- margin-bottom:1px;
-}
-.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner {
- background-position:-173px;
-}
-.claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
- background-position:-68px;
-}
-.claro .dijitSpinnerDisabled .dijitArrowButtonInner {
- background-color: #f1f1f1;
-}
-.claro .dijitSpinnerDisabled .dijitUpArrowButton .dijitArrowButtonInner {
- background-position:-104px;
-}
-.claro .dijitSpinnerDisabled .dijitDownArrowButton .dijitArrowButtonInner {
- background-position:1px;
-}
-.dj_ie7 .claro .dijitSpinner {
- overflow:visible;
-}
-.dijitRtl .dijitPlaceHolder {
- left: auto;
- right: 0;
-}
-.dijitMenuItemRtl {
- text-align: right;
-}
-.dj_iequirks .dijitComboButtonRtl BUTTON {
-
- float:left;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitComboBoxRtl .dijitArrowButtonContainer {
-
- border-right-width: 1px !important;
- border-right-style: solid !important;
- border-left-width: 0px !important;
- border-left-style: none !important;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijit_a11y .dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBoxRtl .dijitArrowButtonContainer {
- border-right: 1px solid black !important;
- border-left: 0px none black !important;
-}
-.dijitSpinnerRtl .dijitSpinnerButtonContainer .dijitArrowButton {
- right: 0;
- left: auto;
-}
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitArrowButtonContainer {
- float: left;
-}
-.dijitCalendarRtl .dijitCalendarNextYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarRtl .dijitCalendarPreviousYear {
- margin:0 0 0 0.55em;
-}
-.dijitSliderRtl .dijitSliderImageHandleV {
- left:auto;
-}
-.dijitSliderRtl .dijitSliderImageHandleH {
- left:-50%;
-}
-.dijitSliderRtl .dijitSliderMoveableH {
- right:auto;
- left:0;
-}
-.dijitSliderRtl .dijitRuleContainerV {
- float:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleContainerV {
- text-align:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelV {
- text-align:left;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelH {
- zoom:1;
-}
-.dijitSliderRtl .dijitSliderProgressBarH {
-
- float:right;
- right:0;
- left:auto;
-}
-.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
- background-position:right;
- padding-right:25px;
-}
-.dijitTabRtl .dijitTabCloseButton {
- margin-left: 0px;
- margin-right: 1em;
-}
-.dj_ie .dijitTimePickerRtl .dijitTimePickerItem {
- width:100%;
-}
-.dijitColorPaletteRtl .dijitColorPaletteUnder {
-
- left: auto;
- right: 0;
-}
-.dijitSelectRtl .dijitButtonContents {
- text-align: right;
-}
-.claro .dijitTextBoxRtlError .dijitValidationContainer {
- border-left-width: 0px;
- border-right-width: 1px;
-}
-.claro .dijitComboButtonRtl .dijitStretch {
- -moz-border-radius: 0px 4px 4px 0px;
- -webkit-border-top-left-radius: 0px;
- -webkit-border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 0px;
-}
-.claro .dijitComboButtonRtl .dijitArrowButton {
- -moz-border-radius: 4px 0px 0px 4px;
- -webkit-border-top-left-radius:4px;
- -webkit-border-top-right-radius:0px;
- -webkit-border-bottom-right-radius:0px;
- -webkit-border-bottom-left-radius:4px;
- padding:3px 0px 4px;
- border-left-width: 1px;
- border-right-width: 0px;
-}
-.claro .dijitTabContainerTop-tabs .dijitTabRtl,
-.claro .dijitTabContainerBottom-tabs .dijitTabRtl {
- margin-right: 0;
- margin-left: 1px;
-}
-.claro .dijitTabRtl {
- -moz-box-orient:horizontal;
- text-align: right;
-}
-.dj_ie7 .claro .dijitTabRtl .dijitTabContent {
- display: block;
- left: 0;
-}
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl,
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabCheckedRtl {
- top: 1px;
-}
-.dj_ie7 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie8 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie6 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie6 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_iequirks .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_iequirks .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv {
- float:left;
-}
-.dj_ie6 .claro .dijitTabRtl .tabLabel,
-.dj_ie6 .claro .dijitTabContainerRight-tabs .dijitTabRtl,
-.dj_ie6 .claro .dijitTabContainerLeft-tabs .dijitTabRtl,
-.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerLeft-tabs .dijitTabRtl .dijitTabInnerDiv {
-
- zoom:1;
-}
-.dj_ie6 .claro .dijitTabRtl .dijitTabCloseButton,
-.dj_ie7 .claro .dijitTabRtl .dijitTabCloseButton,
-.dj_iequirks .claro .dijitTabRtl .dijitTabCloseButton {
- margin-right:5px;
-}
-.dj_ie6 .claro .dijitTabContainerRightRtl .dijitTabContainerRight-tabs,
-.dj_ie6 .claro .dijitTabContainerLeftRtl .dijitTabContainerLeft-tabs {
- width:1%;
-}
-.dj_ie6 .dijitTabContainerTopStrip,
-.dj_ie6 .dijitTabContainerBottomStrip {
- position:absolute;
-}
-.dj_iequirks .claro .dijitTabContainerTopRtl .dijitTabContainerTopStrip {
- padding-top: 10px;
-}
-.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtlChecked .dijitTabInnerDiv {
- background-position:-341px -179px;
-}
-.dj_ie6 .dijitTabContainerTopRtl .dijitTabStripIcon,
-.dj_ie6 .dijitTabContainerBottomRtl .dijitTabStripIcon {
- position: relative;
-}
-.dj_ie6-rtl .claro .dijitTabContainerTop-tabs {
-
- padding-left: 3px;
-}
-.dj_iequirks-rtl .claro .dijitTabListWrapper {
-
- border-left: 1px solid #fff;
- border-right: 1px solid #fff;
-}
-.claro .dijitSliderRtl .dijitSliderProgressBarH,
-.claro .dijitSliderRtl .dijitSliderRemainingBarH,
-.claro .dijitSliderRtl .dijitSliderLeftBumper,
-.claro .dijitSliderRtl .dijitSliderRightBumper,
-.claro .dijitSliderRtl .dijitSliderTopBumper {
- background-position: top right;
-}
-.claro .dijitSliderRtl .dijitSliderProgressBarV,
-.claro .dijitSliderRtl .dijitSliderRemainingBarV,
-.claro .dijitSliderRtl .dijitSliderBottomBumper {
- background-position: bottom right;
-}
-.claro .dijitSliderRtl .dijitSliderLeftBumper {
- border-left-width: 0px;
- border-right-width: 1px;
-}
-.claro .dijitSliderRtl .dijitSliderRightBumper {
- border-left-width: 1px;
- border-right-width: 0px;
-}
-.claro .dijitSliderRtl .dijitSliderIncrementIconH {
- background-position:-357px 50%;
-}
-.claro .dijitSliderRtl .dijitSliderDecrementIconH {
- background-position:-251px 50%;
-}
-.claro .dijitSelectRtl .dijitButtonContents {
- border-right-width: 0px;
- border-left-width: 1px;
-}
-.claro .dijitDialogRtl .dijitDialogCloseIcon {
- right: auto;
- left: 5px;
-}
-.claro .dijitDialogRtl .dijitDialogPaneActionBar {
- text-align: left;
- padding: 3px 7px 2px 5px;
-}
-.claro .dijitEditorRtl .dijitEditorIFrameContainer{
- padding:3px 10px 1px 3px;
-}
-.dijitEditorRtl .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitToolbarRtl .dijitToolbarSeparator {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitRtl .dijitIconSave,
-.dijitRtl .dijitIconPrint,
-.dijitRtl .dijitIconCut,
-.dijitRtl .dijitIconCopy,
-.dijitRtl .dijitIconClear,
-.dijitRtl .dijitIconDelete,
-.dijitRtl .dijitIconUndo,
-.dijitRtl .dijitIconEdit,
-.dijitRtl .dijitIconNewTask,
-.dijitRtl .dijitIconEditTask,
-.dijitRtl .dijitIconEditProperty,
-.dijitRtl .dijitIconTask,
-.dijitRtl .dijitIconFilter,
-.dijitRtl .dijitIconConfigure,
-.dijitRtl .dijitIconSearch,
-.dijitRtl .dijitIconApplication,
-.dijitRtl .dijitIconBookmark,
-.dijitRtl .dijitIconChart,
-.dijitRtl .dijitIconConnector,
-.dijitRtl .dijitIconDatabase,
-.dijitRtl .dijitIconDocuments,
-.dijitRtl .dijitIconMail,
-.dijitRtl .dijitLeaf,
-.dijitRtl .dijitIconFile,
-.dijitRtl .dijitIconFunction,
-.dijitRtl .dijitIconKey,
-.dijitRtl .dijitIconPackage,
-.dijitRtl .dijitIconSample,
-.dijitRtl .dijitIconTable,
-.dijitRtl .dijitIconUsers,
-.dijitRtl .dijitFolderClosed,
-.dijitRtl .dijitIconFolderClosed,
-.dijitRtl .dijitFolderOpened,
-.dijitRtl .dijitIconFolderOpen,
-.dijitRtl .dijitIconError, .dijitRtl .dijitContentPaneError {
- background-image: url(../../icons/images/commonIconsObjActEnabled_rtl.png);
- width: 16px;
- height: 16px;
-}
-.dj_ie6 .dijitRtl .dijitIconSave,
-.dj_ie6 .dijitRtl .dijitIconPrint,
-.dj_ie6 .dijitRtl .dijitIconCut,
-.dj_ie6 .dijitRtl .dijitIconCopy,
-.dj_ie6 .dijitRtl .dijitIconClear,
-.dj_ie6 .dijitRtl .dijitIconDelete,
-.dj_ie6 .dijitRtl .dijitIconUndo,
-.dj_ie6 .dijitRtl .dijitIconEdit,
-.dj_ie6 .dijitRtl .dijitIconNewTask,
-.dj_ie6 .dijitRtl .dijitIconEditTask,
-.dj_ie6 .dijitRtl .dijitIconEditProperty,
-.dj_ie6 .dijitRtl .dijitIconTask,
-.dj_ie6 .dijitRtl .dijitIconFilter,
-.dj_ie6 .dijitRtl .dijitIconConfigure,
-.dj_ie6 .dijitRtl .dijitIconSearch,
-.dj_ie6 .dijitRtl .dijitIconApplication,
-.dj_ie6 .dijitRtl .dijitIconBookmark,
-.dj_ie6 .dijitRtl .dijitIconChart,
-.dj_ie6 .dijitRtl .dijitIconConnector,
-.dj_ie6 .dijitRtl .dijitIconDatabase,
-.dj_ie6 .dijitRtl .dijitIconDocuments,
-.dj_ie6 .dijitRtl .dijitIconMail,
-.dj_ie6 .dijitRtl .dijitLeaf,
-.dj_ie6 .dijitRtl .dijitIconFile,
-.dj_ie6 .dijitRtl .dijitIconFunction,
-.dj_ie6 .dijitRtl .dijitIconKey,
-.dj_ie6 .dijitRtl .dijitIconPackage,
-.dj_ie6 .dijitRtl .dijitIconSample,
-.dj_ie6 .dijitRtl .dijitIconTable,
-.dj_ie6 .dijitRtl .dijitIconUsers,
-.dj_ie6 .dijitRtl .dijitFolderClosed,
-.dj_ie6 .dijitRtl .dijitIconFolderClosed,
-.dj_ie6 .dijitRtl .dijitFolderOpened,
-.dj_ie6 .dijitRtl .dijitIconFolderOpen,
-.dj_ie6 .dijitRtl .dijitIconError, .dj_ie6 .dijitRtl .dijitContentPaneError {
- background-image: url(../../icons/images/commonIconsObjActEnabled8bit_rtl.png);
-}
-.dijitRtl .dijitDisabled .dijitIconSave,
-.dijitRtl .dijitDisabled .dijitIconPrint,
-.dijitRtl .dijitDisabled .dijitIconCut,
-.dijitRtl .dijitDisabled .dijitIconCopy,
-.dijitRtl .dijitDisabled .dijitIconClear,
-.dijitRtl .dijitDisabled .dijitIconDelete,
-.dijitRtl .dijitDisabled .dijitIconUndo,
-.dijitRtl .dijitDisabled .dijitIconEdit,
-.dijitRtl .dijitDisabled .dijitIconNewTask,
-.dijitRtl .dijitDisabled .dijitIconEditTask,
-.dijitRtl .dijitDisabled .dijitIconEditProperty,
-.dijitRtl .dijitDisabled .dijitIconTask,
-.dijitRtl .dijitDisabled .dijitIconFilter,
-.dijitRtl .dijitDisabled .dijitIconConfigure,
-.dijitRtl .dijitDisabled .dijitIconSearch,
-.dijitRtl .dijitDisabled .dijitIconApplication,
-.dijitRtl .dijitDisabled .dijitIconBookmark,
-.dijitRtl .dijitDisabled .dijitIconChart,
-.dijitRtl .dijitDisabled .dijitIconConnector,
-.dijitRtl .dijitDisabled .dijitIconDatabase,
-.dijitRtl .dijitDisabled .dijitIconDocuments,
-.dijitRtl .dijitDisabled .dijitIconMail,
-.dijitRtl .dijitDisabled .dijitLeaf,
-.dijitRtl .dijitDisabled .dijitIconFile,
-.dijitRtl .dijitDisabled .dijitIconFunction,
-.dijitRtl .dijitDisabled .dijitIconKey,
-.dijitRtl .dijitDisabled .dijitIconPackage,
-.dijitRtl .dijitDisabled .dijitIconSample,
-.dijitRtl .dijitDisabled .dijitIconTable,
-.dijitRtl .dijitDisabled .dijitIconUsers,
-.dijitRtl .dijitDisabled .dijitFolderClosed,
-.dijitRtl .dijitDisabled .dijitIconFolderClosed,
-.dijitRtl .dijitDisabled .dijitFolderOpened,
-.dijitRtl .dijitDisabled .dijitIconFolderOpen,
-.dijitRtl .dijitDisabled .dijitIconError, .dijitRtl .dijitDisabled .dijitContentPaneError {
- background-image: url(../../icons/images/commonIconsObjActDisabled_rtl.png);
-}
-.dijitRtl .dijitContentPaneLoading {
- background:url(../../icons/images/loadingAnimation_rtl.gif) no-repeat;
-}
-.claro .dijitTitlePaneRtl .dijitClosed .dijitArrowNode {
- background-position: -7px 0px;
-}
-.claro .dijitMenuItemRtl .dijitMenuExpand {
- background-position: -7px 0px;
- margin-right: 0px;
- margin-left: 3px;
-}
-.claro .dijitMenuItemRtl .dijitMenuItemIcon {
- margin:0px 4px 0px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarIncrease{
- background-position: 0px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarDecrease {
- background-position: -18px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarArrowHover .dijitCalendarIncrease {
- background-position: -36px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarArrowHover .dijitCalendarDecrease {
- background-position: -55px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarArrowActive .dijitCalendarIncrease {
- background-position: -72px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarArrowActive .dijitCalendarDecrease {
- background-position: -91px 0px;
-}
-.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerTickHover,
-.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerMarkerHover,
-.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerMarkerSelected,
-.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerTickSelected {
- margin-left:-6px;
- margin-right:-8px;
- width: 114%;
-}
+@import url("claro_rtl.css");
diff --git a/lib/dijit/themes/claro/claro_rtl.css b/lib/dijit/themes/claro/claro_rtl.css
index 01a0342cd..6f85707f5 100644
--- a/lib/dijit/themes/claro/claro_rtl.css
+++ b/lib/dijit/themes/claro/claro_rtl.css
@@ -1,380 +1,16 @@
-
-.dijitRtl .dijitPlaceHolder {
- left: auto;
- right: 0;
-}
-.dijitMenuItemRtl {
- text-align: right;
-}
-.dj_iequirks .dijitComboButtonRtl BUTTON {
-
- float:left;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitComboBoxRtl .dijitArrowButtonContainer {
-
- border-right-width: 1px !important;
- border-right-style: solid !important;
- border-left-width: 0px !important;
- border-left-style: none !important;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijit_a11y .dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBoxRtl .dijitArrowButtonContainer {
- border-right: 1px solid black !important;
- border-left: 0px none black !important;
-}
-.dijitSpinnerRtl .dijitSpinnerButtonContainer .dijitArrowButton {
- right: 0;
- left: auto;
-}
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitArrowButtonContainer {
- float: left;
-}
-.dijitCalendarRtl .dijitCalendarNextYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarRtl .dijitCalendarPreviousYear {
- margin:0 0 0 0.55em;
-}
-.dijitSliderRtl .dijitSliderImageHandleV {
- left:auto;
-}
-.dijitSliderRtl .dijitSliderImageHandleH {
- left:-50%;
-}
-.dijitSliderRtl .dijitSliderMoveableH {
- right:auto;
- left:0;
-}
-.dijitSliderRtl .dijitRuleContainerV {
- float:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleContainerV {
- text-align:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelV {
- text-align:left;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelH {
- zoom:1;
-}
-.dijitSliderRtl .dijitSliderProgressBarH {
-
- float:right;
- right:0;
- left:auto;
-}
-.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
- background-position:right;
- padding-right:25px;
-}
-.dijitTabRtl .dijitTabCloseButton {
- margin-left: 0px;
- margin-right: 1em;
-}
-.dj_ie .dijitTimePickerRtl .dijitTimePickerItem {
- width:100%;
-}
-.dijitColorPaletteRtl .dijitColorPaletteUnder {
-
- left: auto;
- right: 0;
-}
-.dijitSelectRtl .dijitButtonContents {
- text-align: right;
-}
-.claro .dijitTextBoxRtlError .dijitValidationContainer {
- border-left-width: 0px;
- border-right-width: 1px;
-}
-.claro .dijitComboButtonRtl .dijitStretch {
- -moz-border-radius: 0px 4px 4px 0px;
- -webkit-border-top-left-radius: 0px;
- -webkit-border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 0px;
-}
-.claro .dijitComboButtonRtl .dijitArrowButton {
- -moz-border-radius: 4px 0px 0px 4px;
- -webkit-border-top-left-radius:4px;
- -webkit-border-top-right-radius:0px;
- -webkit-border-bottom-right-radius:0px;
- -webkit-border-bottom-left-radius:4px;
- padding:3px 0px 4px;
- border-left-width: 1px;
- border-right-width: 0px;
-}
-.claro .dijitTabContainerTop-tabs .dijitTabRtl,
-.claro .dijitTabContainerBottom-tabs .dijitTabRtl {
- margin-right: 0;
- margin-left: 1px;
-}
-.claro .dijitTabRtl {
- -moz-box-orient:horizontal;
- text-align: right;
-}
-.dj_ie7 .claro .dijitTabRtl .dijitTabContent {
- display: block;
- left: 0;
-}
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl,
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabCheckedRtl {
- top: 1px;
-}
-.dj_ie7 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie8 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie6 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie6 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_iequirks .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_iequirks .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv {
- float:left;
-}
-.dj_ie6 .claro .dijitTabRtl .tabLabel,
-.dj_ie6 .claro .dijitTabContainerRight-tabs .dijitTabRtl,
-.dj_ie6 .claro .dijitTabContainerLeft-tabs .dijitTabRtl,
-.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerLeft-tabs .dijitTabRtl .dijitTabInnerDiv {
-
- zoom:1;
-}
-.dj_ie6 .claro .dijitTabRtl .dijitTabCloseButton,
-.dj_ie7 .claro .dijitTabRtl .dijitTabCloseButton,
-.dj_iequirks .claro .dijitTabRtl .dijitTabCloseButton {
- margin-right:5px;
-}
-.dj_ie6 .claro .dijitTabContainerRightRtl .dijitTabContainerRight-tabs,
-.dj_ie6 .claro .dijitTabContainerLeftRtl .dijitTabContainerLeft-tabs {
- width:1%;
-}
-.dj_ie6 .dijitTabContainerTopStrip,
-.dj_ie6 .dijitTabContainerBottomStrip {
- position:absolute;
-}
-.dj_iequirks .claro .dijitTabContainerTopRtl .dijitTabContainerTopStrip {
- padding-top: 10px;
-}
-.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtlChecked .dijitTabInnerDiv {
- background-position:-341px -179px;
-}
-.dj_ie6 .dijitTabContainerTopRtl .dijitTabStripIcon,
-.dj_ie6 .dijitTabContainerBottomRtl .dijitTabStripIcon {
- position: relative;
-}
-.dj_ie6-rtl .claro .dijitTabContainerTop-tabs {
-
- padding-left: 3px;
-}
-.dj_iequirks-rtl .claro .dijitTabListWrapper {
-
- border-left: 1px solid #fff;
- border-right: 1px solid #fff;
-}
-.claro .dijitSliderRtl .dijitSliderProgressBarH,
-.claro .dijitSliderRtl .dijitSliderRemainingBarH,
-.claro .dijitSliderRtl .dijitSliderLeftBumper,
-.claro .dijitSliderRtl .dijitSliderRightBumper,
-.claro .dijitSliderRtl .dijitSliderTopBumper {
- background-position: top right;
-}
-.claro .dijitSliderRtl .dijitSliderProgressBarV,
-.claro .dijitSliderRtl .dijitSliderRemainingBarV,
-.claro .dijitSliderRtl .dijitSliderBottomBumper {
- background-position: bottom right;
-}
-.claro .dijitSliderRtl .dijitSliderLeftBumper {
- border-left-width: 0px;
- border-right-width: 1px;
-}
-.claro .dijitSliderRtl .dijitSliderRightBumper {
- border-left-width: 1px;
- border-right-width: 0px;
-}
-.claro .dijitSliderRtl .dijitSliderIncrementIconH {
- background-position:-357px 50%;
-}
-.claro .dijitSliderRtl .dijitSliderDecrementIconH {
- background-position:-251px 50%;
-}
-.claro .dijitSelectRtl .dijitButtonContents {
- border-right-width: 0px;
- border-left-width: 1px;
-}
-.claro .dijitDialogRtl .dijitDialogCloseIcon {
- right: auto;
- left: 5px;
-}
-.claro .dijitDialogRtl .dijitDialogPaneActionBar {
- text-align: left;
- padding: 3px 7px 2px 5px;
-}
-.claro .dijitEditorRtl .dijitEditorIFrameContainer{
- padding:3px 10px 1px 3px;
-}
-.dijitEditorRtl .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitToolbarRtl .dijitToolbarSeparator {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitRtl .dijitIconSave,
-.dijitRtl .dijitIconPrint,
-.dijitRtl .dijitIconCut,
-.dijitRtl .dijitIconCopy,
-.dijitRtl .dijitIconClear,
-.dijitRtl .dijitIconDelete,
-.dijitRtl .dijitIconUndo,
-.dijitRtl .dijitIconEdit,
-.dijitRtl .dijitIconNewTask,
-.dijitRtl .dijitIconEditTask,
-.dijitRtl .dijitIconEditProperty,
-.dijitRtl .dijitIconTask,
-.dijitRtl .dijitIconFilter,
-.dijitRtl .dijitIconConfigure,
-.dijitRtl .dijitIconSearch,
-.dijitRtl .dijitIconApplication,
-.dijitRtl .dijitIconBookmark,
-.dijitRtl .dijitIconChart,
-.dijitRtl .dijitIconConnector,
-.dijitRtl .dijitIconDatabase,
-.dijitRtl .dijitIconDocuments,
-.dijitRtl .dijitIconMail,
-.dijitRtl .dijitLeaf,
-.dijitRtl .dijitIconFile,
-.dijitRtl .dijitIconFunction,
-.dijitRtl .dijitIconKey,
-.dijitRtl .dijitIconPackage,
-.dijitRtl .dijitIconSample,
-.dijitRtl .dijitIconTable,
-.dijitRtl .dijitIconUsers,
-.dijitRtl .dijitFolderClosed,
-.dijitRtl .dijitIconFolderClosed,
-.dijitRtl .dijitFolderOpened,
-.dijitRtl .dijitIconFolderOpen,
-.dijitRtl .dijitIconError, .dijitRtl .dijitContentPaneError {
- background-image: url(../../icons/images/commonIconsObjActEnabled_rtl.png);
- width: 16px;
- height: 16px;
-}
-.dj_ie6 .dijitRtl .dijitIconSave,
-.dj_ie6 .dijitRtl .dijitIconPrint,
-.dj_ie6 .dijitRtl .dijitIconCut,
-.dj_ie6 .dijitRtl .dijitIconCopy,
-.dj_ie6 .dijitRtl .dijitIconClear,
-.dj_ie6 .dijitRtl .dijitIconDelete,
-.dj_ie6 .dijitRtl .dijitIconUndo,
-.dj_ie6 .dijitRtl .dijitIconEdit,
-.dj_ie6 .dijitRtl .dijitIconNewTask,
-.dj_ie6 .dijitRtl .dijitIconEditTask,
-.dj_ie6 .dijitRtl .dijitIconEditProperty,
-.dj_ie6 .dijitRtl .dijitIconTask,
-.dj_ie6 .dijitRtl .dijitIconFilter,
-.dj_ie6 .dijitRtl .dijitIconConfigure,
-.dj_ie6 .dijitRtl .dijitIconSearch,
-.dj_ie6 .dijitRtl .dijitIconApplication,
-.dj_ie6 .dijitRtl .dijitIconBookmark,
-.dj_ie6 .dijitRtl .dijitIconChart,
-.dj_ie6 .dijitRtl .dijitIconConnector,
-.dj_ie6 .dijitRtl .dijitIconDatabase,
-.dj_ie6 .dijitRtl .dijitIconDocuments,
-.dj_ie6 .dijitRtl .dijitIconMail,
-.dj_ie6 .dijitRtl .dijitLeaf,
-.dj_ie6 .dijitRtl .dijitIconFile,
-.dj_ie6 .dijitRtl .dijitIconFunction,
-.dj_ie6 .dijitRtl .dijitIconKey,
-.dj_ie6 .dijitRtl .dijitIconPackage,
-.dj_ie6 .dijitRtl .dijitIconSample,
-.dj_ie6 .dijitRtl .dijitIconTable,
-.dj_ie6 .dijitRtl .dijitIconUsers,
-.dj_ie6 .dijitRtl .dijitFolderClosed,
-.dj_ie6 .dijitRtl .dijitIconFolderClosed,
-.dj_ie6 .dijitRtl .dijitFolderOpened,
-.dj_ie6 .dijitRtl .dijitIconFolderOpen,
-.dj_ie6 .dijitRtl .dijitIconError, .dj_ie6 .dijitRtl .dijitContentPaneError {
- background-image: url(../../icons/images/commonIconsObjActEnabled8bit_rtl.png);
-}
-.dijitRtl .dijitDisabled .dijitIconSave,
-.dijitRtl .dijitDisabled .dijitIconPrint,
-.dijitRtl .dijitDisabled .dijitIconCut,
-.dijitRtl .dijitDisabled .dijitIconCopy,
-.dijitRtl .dijitDisabled .dijitIconClear,
-.dijitRtl .dijitDisabled .dijitIconDelete,
-.dijitRtl .dijitDisabled .dijitIconUndo,
-.dijitRtl .dijitDisabled .dijitIconEdit,
-.dijitRtl .dijitDisabled .dijitIconNewTask,
-.dijitRtl .dijitDisabled .dijitIconEditTask,
-.dijitRtl .dijitDisabled .dijitIconEditProperty,
-.dijitRtl .dijitDisabled .dijitIconTask,
-.dijitRtl .dijitDisabled .dijitIconFilter,
-.dijitRtl .dijitDisabled .dijitIconConfigure,
-.dijitRtl .dijitDisabled .dijitIconSearch,
-.dijitRtl .dijitDisabled .dijitIconApplication,
-.dijitRtl .dijitDisabled .dijitIconBookmark,
-.dijitRtl .dijitDisabled .dijitIconChart,
-.dijitRtl .dijitDisabled .dijitIconConnector,
-.dijitRtl .dijitDisabled .dijitIconDatabase,
-.dijitRtl .dijitDisabled .dijitIconDocuments,
-.dijitRtl .dijitDisabled .dijitIconMail,
-.dijitRtl .dijitDisabled .dijitLeaf,
-.dijitRtl .dijitDisabled .dijitIconFile,
-.dijitRtl .dijitDisabled .dijitIconFunction,
-.dijitRtl .dijitDisabled .dijitIconKey,
-.dijitRtl .dijitDisabled .dijitIconPackage,
-.dijitRtl .dijitDisabled .dijitIconSample,
-.dijitRtl .dijitDisabled .dijitIconTable,
-.dijitRtl .dijitDisabled .dijitIconUsers,
-.dijitRtl .dijitDisabled .dijitFolderClosed,
-.dijitRtl .dijitDisabled .dijitIconFolderClosed,
-.dijitRtl .dijitDisabled .dijitFolderOpened,
-.dijitRtl .dijitDisabled .dijitIconFolderOpen,
-.dijitRtl .dijitDisabled .dijitIconError, .dijitRtl .dijitDisabled .dijitContentPaneError {
- background-image: url(../../icons/images/commonIconsObjActDisabled_rtl.png);
-}
-.dijitRtl .dijitContentPaneLoading {
- background:url(../../icons/images/loadingAnimation_rtl.gif) no-repeat;
-}
-.claro .dijitTitlePaneRtl .dijitClosed .dijitArrowNode {
- background-position: -7px 0px;
-}
-.claro .dijitMenuItemRtl .dijitMenuExpand {
- background-position: -7px 0px;
- margin-right: 0px;
- margin-left: 3px;
-}
-.claro .dijitMenuItemRtl .dijitMenuItemIcon {
- margin:0px 4px 0px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarIncrease{
- background-position: 0px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarDecrease {
- background-position: -18px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarArrowHover .dijitCalendarIncrease {
- background-position: -36px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarArrowHover .dijitCalendarDecrease {
- background-position: -55px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarArrowActive .dijitCalendarIncrease {
- background-position: -72px 0px;
-}
-.claro .dijitCalendarRtl .dijitCalendarArrowActive .dijitCalendarDecrease {
- background-position: -91px 0px;
-}
-.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerTickHover,
-.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerMarkerHover,
-.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerMarkerSelected,
-.dj_ie .claro .dijitTimePickerRtl .dijitTimePickerTickSelected {
- margin-left:-6px;
- margin-right:-8px;
- width: 114%;
-}
+/* RTL files */
+@import url("../dijit_rtl.css");
+@import url("form/Common_rtl.css");
+@import url("form/Button_rtl.css");
+@import url("layout/TabContainer_rtl.css");
+@import url("form/Slider_rtl.css");
+@import url("form/Select_rtl.css");
+@import url("Dialog_rtl.css");
+@import url("Editor_rtl.css");
+@import url("../../icons/editorIcons_rtl.css");/* RTL sprite for editor icons to be used by all themes*/
+@import url("../../icons/commonIcons_rtl.css");/* RTL sprite for common icons to be used by all themes*/
+@import url("TitlePane_rtl.css");
+@import url("Menu_rtl.css");
+@import url("Calendar_rtl.css");
+@import url("TimePicker_rtl.css");
+@import url("Toolbar_rtl.css");
diff --git a/lib/dijit/themes/claro/compile.js b/lib/dijit/themes/claro/compile.js
new file mode 100644
index 000000000..14762b592
--- /dev/null
+++ b/lib/dijit/themes/claro/compile.js
@@ -0,0 +1,62 @@
+/*
+ Copyright (c) 2004-2011, The 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
+
+var options = {
+ compress: false,
+ optimization: 1,
+ silent: false
+};
+
+var allFiles = [].concat(
+ fs.readdirSync("."),
+ fs.readdirSync("form").map(function(fname){ return "form/"+fname; }),
+ fs.readdirSync("layout").map(function(fname){ return "layout/"+fname; })
+ ),
+ lessFiles = allFiles.filter(function(name){ return name && name != "variables.less" && /\.less$/.test(name); });
+
+lessFiles.forEach(function(fname){
+ console.log("=== " + fname);
+ fs.readFile(fname, 'utf-8', function (e, data){
+ if(e){
+ console.error("lessc: " + e.message);
+ process.exit(1);
+ }
+
+ new(less.Parser)({
+ paths: [path.dirname(fname)],
+ optimization: options.optimization,
+ filename: fname
+ }).parse(data, function(err, tree){
+ if(err){
+ less.writeError(err, options);
+ process.exit(1);
+ }else{
+ try{
+ var css = tree.toCSS({ compress: options.compress }),
+ outputFname = fname.replace('.less', '.css');
+ fd = fs.openSync(outputFname, "w");
+ fs.writeSync(fd, css, 0, "utf8");
+ }catch(e){
+ less.writeError(e, options);
+ process.exit(2);
+ }
+ }
+ });
+ });
+});
diff --git a/lib/dijit/themes/claro/document.css b/lib/dijit/themes/claro/document.css
index 72f9b1b40..64e470cf3 100644
--- a/lib/dijit/themes/claro/document.css
+++ b/lib/dijit/themes/claro/document.css
@@ -1,81 +1,41 @@
-
+@import url("../../../dojo/resources/dojo.css");
+/* ======= Styling for the document itself (overriding dojo.css) ======== */
.claro {
- font-family:Verdana,Arial,Helvetica,sans-serif;
- font-size: .688em;
- color: #131313;
-}
-h1 {
- font-size: 1.545em;
- font-weight: normal;
- line-height: 1em;
- margin-top: 1em;
- margin-bottom:0.727em;
-}
-.claro .dijitDialog h1 {
- margin-top:0em;
-}
-h2 {
- font-size: 1.364em;
- line-height: 1.455em;
- margin-top:1em;
- margin-bottom:0.60em;
- font-weight: normal;
-}
-h3, h4, h5, h6 {
- font-size:1.091em;
- font-weight: normal;
- line-height: 1.5em;
- margin-top: 1.5em;
- margin-bottom: 0;
-}
-p {
- font-size: 1em;
- line-height: 1.3em;
-}
-blockquote {
- font-size: 0.916em;
- margin-top: 3.272em;
- margin-bottom: 3.272em;
- line-height: 1.636em;
- padding: 1.636em;
- border-top: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
-}
-ol li, ul li {
- font-size: 1em;
- line-height: 1.5em;
- margin: 0;
-}
-pre, code {
- font-size:115%;
- *font-size:100%;
- font-family:inherit;
- background-color: #efefef;
- border: 1px solid #ccc;
-}
-pre {
- border-width: 1px 0;
- padding: 1.5em;
-}
-table { font-size:100%; }
-table.dojoTabular {
- border-collapse: collapse;
- border-spacing: 0;
- border: 1px solid #ccc;
- margin: 0 1.5em;
-}
-.dojoTabular th {
- text-align: center;
- font-weight: bold;
-}
-table.dojoTabular thead, table.dojoTabular tfoot {
- background-color: #efefef;
- border: 1px solid #ccc;
- border-width: 1px 0;
-}
-table.dojoTabular thead tr th,
-table.dojoTabular thead tr td,
-table.dojoTabular tbody tr td,
-table.dojoTabular tfoot tr td {
- padding: 0.25em 0.5em;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: .688em;
+ color: #131313;
+}
+/* Headings */
+.claro h1 {
+ font-size: 1.545em;
+ margin-bottom: 0.727em;
+}
+.claro h2 {
+ font-size: 1.364em;
+ line-height: 1.455em;
+ margin-top: 1em;
+ margin-bottom: 0.60em;
+ font-weight: normal;
+}
+.claro h3,
+.claro h4,
+.claro h5,
+.claro h6 {
+ font-size: 1.091em;
+ font-weight: normal;
+}
+/* paragraphs, quotes and lists */
+.claro p {
+ line-height: 1.3em;
+}
+/* pre and code */
+.claro pre, .claro code {
+ font-family: inherit;
+ background-color: #efefef;
+ border: 1px solid #d3d3d3;
+}
+/* tables */
+.claro table.dojoTabular thead, .claro table.dojoTabular tfoot {
+ background-color: #efefef;
+ border: 1px solid #d3d3d3;
}
diff --git a/lib/dijit/themes/claro/document.less b/lib/dijit/themes/claro/document.less
new file mode 100644
index 000000000..7f8635672
--- /dev/null
+++ b/lib/dijit/themes/claro/document.less
@@ -0,0 +1,45 @@
+/* ======= Styling for the document itself (overriding dojo.css) ======== */
+
+@import "variables";
+@import url("../../../dojo/resources/dojo.css");
+
+.claro {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: .688em;
+ color: @document-text-color;
+}
+
+/* Headings */
+.claro h1 {
+ font-size: 1.545em;
+ margin-bottom:0.727em;
+}
+.claro h2 {
+ font-size: 1.364em;
+ line-height: 1.455em;
+ margin-top:1em;
+ margin-bottom:0.60em;
+ font-weight: normal;
+}
+.claro h3, .claro h4, .claro h5, .claro h6 {
+ font-size:1.091em;
+ font-weight: normal;
+}
+
+/* paragraphs, quotes and lists */
+.claro p {
+ line-height: 1.3em;
+}
+
+/* pre and code */
+.claro pre, .claro code {
+ font-family:inherit;
+ background-color: @document-shadedsection-background-color;
+ border: 1px solid @document-border-color;
+}
+
+/* tables */
+.claro table.dojoTabular thead, .claro table.dojoTabular tfoot {
+ background-color: @document-shadedsection-background-color;
+ border: 1px solid @document-border-color;
+}
diff --git a/lib/dijit/themes/claro/form/Button.css b/lib/dijit/themes/claro/form/Button.css
index a2a15c0cc..e01a1d313 100644
--- a/lib/dijit/themes/claro/form/Button.css
+++ b/lib/dijit/themes/claro/form/Button.css
@@ -1,125 +1,160 @@
-
+/* Button | DropDownButton | ComboButton | ToggleButton
+ *
+ * Styling Buttons mainly includes:
+ *
+ * 1. Containers
+ * .dijitButton
+ * .dijitDropDownButton
+ * .dijitComboButton
+ * .dijitButtonNode - common button/arrow wrapper shared across all three button types
+ *
+ * 2. Button text
+ * .dijitButtonText
+ *
+ * 3. Arrows - only for DropDownButton and ComboButton
+ * There are total four directions arrows - down, left, right, up:
+ * .dijitArrowButtonInner - down arrow by default
+ * .dijitLeftArrowButton .dijitArrowButtonInner - left arrow
+ * .dijitRightArrowButton .dijitArrowButtonInner - right arrow
+ * .dijitUpArrowButton .dijitArrowButtonInner - up arrow
+ *
+ * 4. States - Hover, Active, Disabled, e.g.
+ * .dijitButtonHover .dijitButtonNode
+ * .dijitButtonActive .dijitButtonNode
+ * .dijitButtonDisabled .dijitButtonNode
+ *
+ * .dijitDisabled .dijitArrowButtonInner - disabled arrow states
+ */
.claro .dijitButtonNode {
-
- -webkit-transition-property:background-color;
- -webkit-transition-duration:.3s;
+ /* rules for dijit.form.*Button widgets and arrow nodes on ComboBox, Spinner etc. */
+
+ -webkit-transition-property: background-color;
+ -moz-transition-property: background-color;
+ transition-property: background-color;
+ -webkit-transition-duration: 0.3s;
+ -moz-transition-duration: 0.3s;
+ transition-duration: 0.3s;
}
.claro .dijitButton .dijitButtonNode,
.claro .dijitDropDownButton .dijitButtonNode,
.claro .dijitComboButton .dijitButtonNode,
.claro .dijitToggleButton .dijitButtonNode {
-
- border: 1px solid #769dc0;
- padding:2px 4px 4px 4px;
- background-image: url("images/button.png");
- background-position: center top;
- background-repeat: repeat-x;
- background-color: #e4f2ff;
- border-radius: 4px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- box-shadow:0px 1px 1px rgba(0,0,0,0.15);
- -webkit-box-shadow:0px 1px 1px rgba(0,0,0,0.15);
- -moz-box-shadow: 0px 1px 1px rgba(0,0,0,0.15);
+ /* rules for the dijit.form.*Button widgets (see also ComboButton section below) */
+
+ border: 1px solid #769dc0;
+ padding: 2px 4px 4px 4px;
+ background-image: url("images/button.png");
+ background-position: center top;
+ background-repeat: repeat-x;
+ background-color: #e9f4fe;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
+ -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
}
.claro .dijitComboButton .dijitArrowButton {
- border-left-width: 0px;
- padding: 4px 2px 4px 2px;
+ border-left-width: 0;
+ padding: 4px 2px 4px 2px;
+ /* TODO: still needed? */
+
}
+/*arrow styles for down/up/left/right directions*/
.claro .dijitArrowButtonInner {
- width: 15px;
- height: 15px;
- margin: 0 auto;
- background-image:url("images/buttonArrows.png");
- background-repeat:no-repeat;
- background-position:-51px 53%;
+ width: 15px;
+ height: 15px;
+ margin: 0 auto;
+ background-image: url("images/buttonArrows.png");
+ background-repeat: no-repeat;
+ background-position: -51px 53%;
}
.claro .dijitLeftArrowButton .dijitArrowButtonInner {
- background-position: -77px 53%;
+ background-position: -77px 53%;
}
.claro .dijitRightArrowButton .dijitArrowButtonInner {
- background-position: -26px 53%;
+ background-position: -26px 53%;
}
.claro .dijitUpArrowButton .dijitArrowButtonInner {
- background-position: 0px 53%;
+ background-position: 0 53%;
}
.claro .dijitDisabled .dijitArrowButtonInner {
- background-position: -151px 53%;
+ background-position: -151px 53%;
}
.claro .dijitDisabled .dijitLeftArrowButton .dijitArrowButtonInner {
- background-position: -177px 53%;
+ background-position: -177px 53%;
}
.claro .dijitDisabled .dijitRightArrowButton .dijitArrowButtonInner {
- background-position: -126px 53%;
+ background-position: -126px 53%;
}
.claro .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner {
- background-position: -100px 53%;
+ background-position: -100px 53%;
}
.claro .dijitButtonText {
- padding: 0 0.3em;
- text-align: center;
-}
-.claro .dijitDisabled .dijitButtonText {
- color: #7F7F7F;
+ padding: 0 0.3em;
+ text-align: center;
}
+/* hover status */
.claro .dijitButtonHover .dijitButtonNode,
.claro .dijitDropDownButtonHover .dijitButtonNode,
-.claro .dijitComboButton .dijitButtonNodeHover,
+.claro .dijitComboButton .dijitButtonNodeHover,
.claro .dijitComboButton .dijitDownArrowButtonHover,
.claro .dijitToggleButtonHover .dijitButtonNode {
- background-color: #afd9ff;
- color:#000;
- -webkit-transition-duration:.2s;
-}
-.claro .dijitButtonActive .dijitButtonNode,
+ background-color: #abd6ff;
+ color: #000000;
+ -webkit-transition-duration: 0.2s;
+ -moz-transition-duration: 0.2s;
+ transition-duration: 0.2s;
+}
+/* checked status */
+.claro .dijitButtonActive .dijitButtonNode,
.claro .dijitDropDownButtonActive .dijitButtonNode,
.claro .dijitComboButtonActive .dijitButtonNode,
.claro .dijitToggleButtonActive .dijitButtonNode {
- background-color: #99cfff;
- box-shadow:0px 0px 0px rgba(0,0,0,0);
- -webkit-box-shadow:0px 0px 0px rgba(0,0,0,0);
- -moz-box-shadow: 0px 0px 0px rgba(0,0,0,0);
- -webkit-transition-duration:.1s;
-}
+ background-color: #abd6ff;
+ -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ -moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ -webkit-transition-duration: 0.1s;
+ -moz-transition-duration: 0.1s;
+ transition-duration: 0.1s;
+}
+/* disabled status */
.claro .dijitButtonDisabled,
.claro .dijitDropDownButtonDisabled,
.claro .dijitComboButtonDisabled,
.claro .dijitToggleButtonDisabled {
- background-image: none;
- outline: none;
+ background-image: none;
+ outline: none;
}
.claro .dijitButtonDisabled .dijitButtonNode,
.claro .dijitDropDownButtonDisabled .dijitButtonNode,
.claro .dijitComboButtonDisabled .dijitButtonNode,
-.claro .dijitToggleButtonDisabled .dijitButtonNode {
- background-position:0px -149px;
- background-color: #e3e3e3;
- border: solid 1px #c9c9c9;
- color: #696969;
- box-shadow:0px 0px 0px rgba(0,0,0,0);
- -webkit-box-shadow:0px 0px 0px rgba(0,0,0,0);
- -moz-box-shadow: 0px 0px 0px rgba(0,0,0,0);
-}
-.claro .dijitComboButtonDisabled .dijitArrowButton{
- border-left-width: 0px;
-}
+.claro .dijitToggleButtonDisabled .dijitButtonNode {
+ background-position: 0 -149px;
+ background-color: #efefef;
+ border: solid 1px #d3d3d3;
+ color: #818181;
+ -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ -moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+}
+.claro .dijitComboButtonDisabled .dijitArrowButton {
+ border-left-width: 0;
+}
+/* for ComboButton */
.claro table.dijitComboButton {
- border-collapse: separate;
+ border-collapse: separate;
+ /* override dijit.css so that ComboBox rounded corners work */
+
}
.dj_ie6 .claro .dijitButtonNode {
- background-image: none;
+ background-image: none;
}
.claro .dijitComboButton .dijitStretch {
- -moz-border-radius: 4px 0px 0px 4px;
- -webkit-border-top-left-radius: 4px;
- -webkit-border-top-right-radius: 0px;
- -webkit-border-bottom-right-radius: 0px;
- -webkit-border-bottom-left-radius: 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
}
.claro .dijitComboButton .dijitArrowButton {
- -moz-border-radius: 0px 4px 4px 0px;
- -webkit-border-top-left-radius: 0px;
- -webkit-border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 0px;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
}
diff --git a/lib/dijit/themes/claro/form/Button.less b/lib/dijit/themes/claro/form/Button.less
new file mode 100644
index 000000000..b076d2a16
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Button.less
@@ -0,0 +1,154 @@
+/* Button | DropDownButton | ComboButton | ToggleButton
+ *
+ * Styling Buttons mainly includes:
+ *
+ * 1. Containers
+ * .dijitButton
+ * .dijitDropDownButton
+ * .dijitComboButton
+ * .dijitButtonNode - common button/arrow wrapper shared across all three button types
+ *
+ * 2. Button text
+ * .dijitButtonText
+ *
+ * 3. Arrows - only for DropDownButton and ComboButton
+ * There are total four directions arrows - down, left, right, up:
+ * .dijitArrowButtonInner - down arrow by default
+ * .dijitLeftArrowButton .dijitArrowButtonInner - left arrow
+ * .dijitRightArrowButton .dijitArrowButtonInner - right arrow
+ * .dijitUpArrowButton .dijitArrowButtonInner - up arrow
+ *
+ * 4. States - Hover, Active, Disabled, e.g.
+ * .dijitButtonHover .dijitButtonNode
+ * .dijitButtonActive .dijitButtonNode
+ * .dijitButtonDisabled .dijitButtonNode
+ *
+ * .dijitDisabled .dijitArrowButtonInner - disabled arrow states
+ */
+
+@import "../variables";
+
+.claro .dijitButtonNode {
+ /* rules for dijit.form.*Button widgets and arrow nodes on ComboBox, Spinner etc. */
+ .transition-property(background-color);
+ .transition-duration(.3s);
+}
+
+.claro .dijitButton .dijitButtonNode,
+.claro .dijitDropDownButton .dijitButtonNode,
+.claro .dijitComboButton .dijitButtonNode,
+.claro .dijitToggleButton .dijitButtonNode {
+ /* rules for the dijit.form.*Button widgets (see also ComboButton section below) */
+ border: 1px solid @button-border-color;
+ padding:2px 4px 4px 4px;
+ background-image: url("images/button.png");
+ background-position: center top;
+ background-repeat: repeat-x;
+ background-color: @button-background-color;
+ .border-radius(@button-border-radius);
+ .box-shadow(0 1px 1px rgba(0,0,0,0.15));
+}
+
+.claro .dijitComboButton .dijitArrowButton {
+ border-left-width: 0;
+ padding: 4px 2px 4px 2px; /* TODO: still needed? */
+}
+
+/*arrow styles for down/up/left/right directions*/
+.claro .dijitArrowButtonInner {
+ width: 15px;
+ height: 15px;
+ margin: 0 auto;
+ background-image:url("images/buttonArrows.png");
+ background-repeat:no-repeat;
+ background-position:-51px 53%;
+}
+.claro .dijitLeftArrowButton .dijitArrowButtonInner {
+ background-position: -77px 53%;
+}
+.claro .dijitRightArrowButton .dijitArrowButtonInner {
+ background-position: -26px 53%;
+}
+.claro .dijitUpArrowButton .dijitArrowButtonInner {
+ background-position: 0 53%;
+}
+.claro .dijitDisabled .dijitArrowButtonInner {
+ background-position: -151px 53%;
+}
+.claro .dijitDisabled .dijitLeftArrowButton .dijitArrowButtonInner {
+ background-position: -177px 53%;
+}
+.claro .dijitDisabled .dijitRightArrowButton .dijitArrowButtonInner {
+ background-position: -126px 53%;
+}
+.claro .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner {
+ background-position: -100px 53%;
+}
+
+.claro .dijitButtonText {
+ padding: 0 0.3em;
+ text-align: center;
+}
+
+
+
+
+
+/* hover status */
+.claro .dijitButtonHover .dijitButtonNode,
+.claro .dijitDropDownButtonHover .dijitButtonNode,
+.claro .dijitComboButton .dijitButtonNodeHover,
+.claro .dijitComboButton .dijitDownArrowButtonHover,
+.claro .dijitToggleButtonHover .dijitButtonNode {
+ background-color: @button-hovered-background-color;
+ color:@text-color;
+ .transition-duration(.2s);
+}
+
+/* checked status */
+.claro .dijitButtonActive .dijitButtonNode,
+.claro .dijitDropDownButtonActive .dijitButtonNode,
+.claro .dijitComboButtonActive .dijitButtonNode,
+.claro .dijitToggleButtonActive .dijitButtonNode {
+ background-color: @button-pressed-background-color;
+ .box-shadow(0 0 0 rgba(0,0,0,0));
+ .transition-duration(.1s);
+}
+
+/* disabled status */
+.claro .dijitButtonDisabled,
+.claro .dijitDropDownButtonDisabled,
+.claro .dijitComboButtonDisabled,
+.claro .dijitToggleButtonDisabled {
+ background-image: none;
+ outline: none;
+}
+
+.claro .dijitButtonDisabled .dijitButtonNode,
+.claro .dijitDropDownButtonDisabled .dijitButtonNode,
+.claro .dijitComboButtonDisabled .dijitButtonNode,
+.claro .dijitToggleButtonDisabled .dijitButtonNode {
+ background-position:0 -149px;
+ background-color: @disabled-background-color;
+ border: solid 1px @disabled-border-color;
+ color: @disabled-text-color;
+ .box-shadow(0 0 0 rgba(0,0,0,0));
+}
+.claro .dijitComboButtonDisabled .dijitArrowButton{
+ border-left-width: 0;
+}
+/* for ComboButton */
+.claro table.dijitComboButton {
+ border-collapse: separate; /* override dijit.css so that ComboBox rounded corners work */
+}
+
+.dj_ie6 .claro .dijitButtonNode {
+ background-image: none;
+}
+
+.claro .dijitComboButton .dijitStretch {
+ .border-radius(@button-border-radius 0 0 @button-border-radius);
+}
+.claro .dijitComboButton .dijitArrowButton {
+ .border-radius(0 @button-border-radius @button-border-radius 0);
+}
diff --git a/lib/dijit/themes/claro/form/Button_rtl.css b/lib/dijit/themes/claro/form/Button_rtl.css
index f1484b127..2d5b08bff 100644
--- a/lib/dijit/themes/claro/form/Button_rtl.css
+++ b/lib/dijit/themes/claro/form/Button_rtl.css
@@ -1,18 +1,13 @@
-
+/* Combo Button */
.claro .dijitComboButtonRtl .dijitStretch {
- -moz-border-radius: 0px 4px 4px 0px;
- -webkit-border-top-left-radius: 0px;
- -webkit-border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 0px;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
}
.claro .dijitComboButtonRtl .dijitArrowButton {
- -moz-border-radius: 4px 0px 0px 4px;
- -webkit-border-top-left-radius:4px;
- -webkit-border-top-right-radius:0px;
- -webkit-border-bottom-right-radius:0px;
- -webkit-border-bottom-left-radius:4px;
- padding:3px 0px 4px;
- border-left-width: 1px;
- border-right-width: 0px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+ padding: 3px 0 4px;
+ border-left-width: 1px;
+ border-right-width: 0;
}
+/* End Combo Button */ \ No newline at end of file
diff --git a/lib/dijit/themes/claro/form/Button_rtl.less b/lib/dijit/themes/claro/form/Button_rtl.less
new file mode 100644
index 000000000..6225d6847
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Button_rtl.less
@@ -0,0 +1,16 @@
+@import "../variables";
+
+/* Combo Button */
+
+.claro .dijitComboButtonRtl .dijitStretch {
+ .border-radius(0 @button-border-radius @button-border-radius 0);
+}
+
+.claro .dijitComboButtonRtl .dijitArrowButton {
+ .border-radius(@button-border-radius 0 0 @button-border-radius);
+ padding:3px 0 4px;
+ border-left-width: 1px;
+ border-right-width: 0;
+}
+
+/* End Combo Button */ \ No newline at end of file
diff --git a/lib/dijit/themes/claro/form/Checkbox.css b/lib/dijit/themes/claro/form/Checkbox.css
index be3604ddd..5765bb370 100644
--- a/lib/dijit/themes/claro/form/Checkbox.css
+++ b/lib/dijit/themes/claro/form/Checkbox.css
@@ -1,46 +1,71 @@
-
+/* CheckBox
+ *
+ * Styling CheckBox mainly includes:
+ *
+ * 1. Containers
+ * .dijitCheckBox|.dijitCheckBoxIcon - for border, padding, width|height and background image
+ *
+ * 2. CheckBox within ToggleButton
+ * .dijitToggleButton|.dijitToggleButtonChecked .* - for background image
+ *
+ * 3. Checked state
+ * .dijitCheckBoxChecked - for checked background-color|image
+ * .dijitToggleButtonChecked - for border, background-color|image, display and width|height
+ *
+ * 4. Hover state
+ * .dijitCheckBoxHover|.dijitCheckBoxCheckedHover - for background image
+ *
+ * 5. Disabled state
+ * .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');
-}
-.claro .dijitCheckBox,
-.claro .dijitCheckBoxIcon {
- background-image: url('images/checkboxRadioButtonStates.png');
- background-repeat: no-repeat;
- width: 15px;
- height: 16px;
- margin: 0 2px 0 0;
- padding: 0;
-}
-.dj_ie6 .claro .dijitCheckBox,
-.dj_ie6 .claro .dijitCheckBoxIcon {
- background-image: url('images/checkboxAndRadioButtons_IE6.png');
-}
-.claro .dijitCheckBox,
-.claro .dijitToggleButton .dijitCheckBoxIcon {
-
- background-position: -15px;
+ background-image: url('../images/checkmarkNoBorder.gif');
+}
+.claro .dijitCheckBox, .claro .dijitCheckBoxIcon {
+ background-image: url('images/checkboxRadioButtonStates.png');
+ /* checkbox sprite image */
+
+ background-repeat: no-repeat;
+ width: 15px;
+ height: 16px;
+ margin: 0 2px 0 0;
+ padding: 0;
}
-.claro .dijitCheckBoxChecked,
-.claro .dijitToggleButtonChecked .dijitCheckBoxIcon {
-
- background-position: -0px;
+.dj_ie6 .claro .dijitCheckBox, .dj_ie6 .claro .dijitCheckBoxIcon {
+ background-image: url('images/checkboxAndRadioButtons_IE6.png');
+ /* checkbox sprite image */
+
+}
+.claro .dijitCheckBox, .claro .dijitToggleButton .dijitCheckBoxIcon {
+ /* unchecked */
+
+ background-position: -15px;
+}
+.claro .dijitCheckBoxChecked, .claro .dijitToggleButtonChecked .dijitCheckBoxIcon {
+ /* checked */
+
+ background-position: 0;
}
.claro .dijitCheckBoxDisabled {
-
- background-position: -75px;
+ /* disabled */
+
+ background-position: -75px;
}
.claro .dijitCheckBoxCheckedDisabled {
-
- background-position: -60px;
+ /* disabled but checked */
+
+ background-position: -60px;
}
.claro .dijitCheckBoxHover {
-
- background-position: -45px;
+ /* hovering over an unchecked enabled checkbox */
+
+ background-position: -45px;
}
.claro .dijitCheckBoxCheckedHover {
-
- background-position: -30px;
+ /* hovering over an checked enabled checkbox */
+
+ background-position: -30px;
}
diff --git a/lib/dijit/themes/claro/form/Checkbox.less b/lib/dijit/themes/claro/form/Checkbox.less
new file mode 100644
index 000000000..21769dca1
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Checkbox.less
@@ -0,0 +1,79 @@
+/* CheckBox
+ *
+ * Styling CheckBox mainly includes:
+ *
+ * 1. Containers
+ * .dijitCheckBox|.dijitCheckBoxIcon - for border, padding, width|height and background image
+ *
+ * 2. CheckBox within ToggleButton
+ * .dijitToggleButton|.dijitToggleButtonChecked .* - for background image
+ *
+ * 3. Checked state
+ * .dijitCheckBoxChecked - for checked background-color|image
+ * .dijitToggleButtonChecked - for border, background-color|image, display and width|height
+ *
+ * 4. Hover state
+ * .dijitCheckBoxHover|.dijitCheckBoxCheckedHover - for background image
+ *
+ * 5. Disabled state
+ * .dijitCheckBoxDisabled|.dijitCheckBoxCheckedDisabled - for background image
+ */
+
+@import "../variables";
+
+.claro .dijitToggleButton .dijitCheckBoxIcon {
+ background-image: url('../images/checkmarkNoBorder.png');
+}
+
+.dj_ie6 .claro .dijitToggleButton .dijitCheckBoxIcon {
+ background-image: url('../images/checkmarkNoBorder.gif');
+}
+
+.claro .dijitCheckBox,
+.claro .dijitCheckBoxIcon /* inside a toggle button */ {
+ background-image: url('images/checkboxRadioButtonStates.png'); /* checkbox sprite image */
+ background-repeat: no-repeat;
+ width: 15px;
+ height: 16px;
+ margin: 0 2px 0 0;
+ padding: 0;
+}
+
+.dj_ie6 .claro .dijitCheckBox,
+.dj_ie6 .claro .dijitCheckBoxIcon /* inside a toggle button */ {
+ background-image: url('images/checkboxAndRadioButtons_IE6.png'); /* checkbox sprite image */
+}
+
+.claro .dijitCheckBox,
+.claro .dijitToggleButton .dijitCheckBoxIcon {
+ /* unchecked */
+ background-position: -15px;
+}
+
+.claro .dijitCheckBoxChecked,
+.claro .dijitToggleButtonChecked .dijitCheckBoxIcon {
+ /* checked */
+ background-position: -0;
+}
+
+.claro .dijitCheckBoxDisabled {
+ /* disabled */
+ background-position: -75px;
+}
+
+.claro .dijitCheckBoxCheckedDisabled {
+ /* disabled but checked */
+ background-position: -60px;
+}
+
+.claro .dijitCheckBoxHover {
+ /* hovering over an unchecked enabled checkbox */
+ background-position: -45px;
+}
+
+.claro .dijitCheckBoxCheckedHover {
+ /* hovering over an checked enabled checkbox */
+ background-position: -30px;
+}
+
+
diff --git a/lib/dijit/themes/claro/form/Common.css b/lib/dijit/themes/claro/form/Common.css
index b04061b65..ab8bb5c3b 100644
--- a/lib/dijit/themes/claro/form/Common.css
+++ b/lib/dijit/themes/claro/form/Common.css
@@ -1,132 +1,163 @@
-
+/* claro/form/Common.css */
+/*========================= common css =========================*/
+/* 'dijitTextBox' refers to 'dijit(TextBox|DateTextBox|CurrencyTextBox|...)' */
.claro .dijitTextBoxError .dijitValidationContainer {
- background-color: #d46363;
- background-image: url('images/error.png');
- background-position: top center;
- border: solid #d46464 0px;
- border-left-width: 1px;
- width: 9px;
+ background-color: #d46464;
+ background-image: url('images/error.png');
+ background-position: top center;
+ border: solid #d46464 0;
+ border-left-width: 1px;
+ width: 9px;
}
.claro .dijitTextBoxError .dijitValidationIcon {
- width: 0px;
- background-color: transparent !important;
+ width: 0;
+ background-color: transparent !important;
+ /* so the INPUT doesn't obscure the border in rtl+a11y */
+
+}
+/* Padding for the input area of TextBox based widgets, and corresponding padding for the
+ * down arrow button and the placeholder. placeholder is explicitly listed because
+ * dijitPlaceHolder is absolutely positioned, so padding set on dijitInputField
+ * won't affect it
+ */
+.claro .dijitTextArea, .claro .dijitInputField .dijitPlaceHolder {
+ padding: 2px;
}
-.claro .dijitTextBox .dijitInputContainer,
-.claro .dijitTextArea,
-.claro .dijitInputField .dijitPlaceHolder {
- padding: 2px;
+.claro .dijitTextBox .dijitInputField {
+ padding: 1px 2px;
+}
+.dj_gecko .claro .dijitTextBox .dijitInputInner, .dj_webkit .claro .dijitTextBox .dijitInputInner {
+ padding: 1px;
}
-.claro .dijitTextBox,
-.claro .dijitTextBox .dijitButtonNode {
-
- border-color: #b5bcc7;
- -webkit-transition-property:background-color, border;
- -webkit-transition-duration:.35s;
+.claro .dijitTextBox, .claro .dijitTextBox .dijitButtonNode {
+ /* color for (outer) border on *TextBox widgets, and border between input and buttons on ComboBox and Spinner */
+
+ border-color: #b5bcc7;
+ -webkit-transition-property: background-color, border;
+ -moz-transition-property: background-color, border;
+ transition-property: background-color, border;
+ -webkit-transition-duration: 0.35s;
+ -moz-transition-duration: 0.35s;
+ transition-duration: 0.35s;
}
.claro .dijitTextBox {
- background-color: #f7fcff;
+ background-color: #ffffff;
}
-.claro .dijitTextBoxHover,
-.claro .dijitTextBoxHover .dijitButtonNode {
- border-color: #769dc0;
- -webkit-transition-duration:.25s;
+/* hover */
+.claro .dijitTextBoxHover, .claro .dijitTextBoxHover .dijitButtonNode {
+ border-color: #769dc0;
+ -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-repeat: repeat-x;
+ background-color: #e9f4fe;
+ background-image: url('images/textBox_back.png');
+ background-repeat: repeat-x;
}
-.claro .dijitTextBoxError,
-.claro .dijitTextBoxError .dijitButtonNode {
- border-color: #d46464;
+/* error state */
+.claro .dijitTextBoxError, .claro .dijitTextBoxError .dijitButtonNode {
+ border-color: #d46464;
}
-.claro .dijitTextBoxError,
-.claro .dijitTextBoxError .dijitInputContainer {
- background-color: #fdf7f7;
+.claro .dijitTextBoxError, .claro .dijitTextBoxError .dijitInputContainer {
+ background-color: #ffffff;
}
-.claro .dijitTextBoxFocused,
-.claro .dijitTextBoxFocused .dijitButtonNode {
- border-color:#769dc0;
- -webkit-transition-duration:.1s;
+/* focused state */
+.claro .dijitTextBoxFocused, .claro .dijitTextBoxFocused .dijitButtonNode {
+ border-color: #769dc0;
+ -webkit-transition-duration: 0.1s;
+ -moz-transition-duration: 0.1s;
+ transition-duration: 0.1s;
}
.claro .dijitTextBoxFocused {
- background-color: #fff;
- background-image: url('images/textBox_back.png');
- background-repeat: repeat-x;
+ background-color: #ffffff;
+ background-image: url('images/textBox_back.png');
+ background-repeat: repeat-x;
}
.claro .dijitTextBoxFocused .dijitInputContainer {
- background: #fff;
+ background: #ffffff;
}
-.claro .dijitTextBoxErrorFocused,
-.claro .dijitTextBoxErrorFocused .dijitButtonNode {
- border-color: #ce4f4f;
+.claro .dijitTextBoxErrorFocused, .claro .dijitTextBoxErrorFocused .dijitButtonNode {
+ border-color: #ce4f4f;
}
-.claro .dijitTextBoxDisabled,
-.claro .dijitTextBoxDisabled .dijitButtonNode {
- border-color: #d3d3d3;
+/* disabled state */
+.claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitButtonNode {
+ border-color: #d3d3d3;
}
-.claro .dijitTextBoxDisabled {
- background-color: #efefef;
- background-image: none;
- color: #818181;
+.claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitInputContainer {
+ background-color: #efefef;
+ background-image: none;
+ color: #818181;
}
+/*========================= for special widgets =========================*/
+/* Input boxes with an arrow (for a drop down) */
.claro .dijitComboBox .dijitArrowButtonInner {
- background-image: url("images/commonFormArrows.png");
- background-position:-35px 53%;
- background-repeat: no-repeat;
- margin: 0px;
- width:16px;
- height:100%;
- border: 1px solid #fff;
+ background-image: url("images/commonFormArrows.png");
+ background-position: -35px 53%;
+ background-repeat: no-repeat;
+ margin: 0;
+ width: 16px;
+ border: 1px solid #ffffff;
}
-.claro .dijitTextBox .dijitInputField {
- padding-top: 1px;
- padding-bottom: 1px;
+.claro .dijitToolbar .dijitComboBox .dijitArrowButtonInner {
+ border: none;
}
-.claro .dijitTextBox .dijitInputInner {
-
- padding: 1px 2px 1px 0;
+.claro .dijitToolbar .dijitComboBox .dijitArrowButtonInner {
+ border: none;
}
-.claro .dijitTextBox .dijitValidationContainer {
- padding: 0 0 2px 0;
+/* Add 1px vertical padding to the <input> where user types and the validation icon,
+ to match the 1px border on arrow button */
+.claro .dijitTextBox .dijitInputInner, .claro .dijitTextBox .dijitValidationContainer {
+ padding: 1px 0;
}
.claro .dijitComboBox .dijitButtonNode {
- background-color: #ebeef4;
- background-image: url("images/formHighlight.png");
- background-repeat:repeat-x;
-}
-.claro .dijitComboBoxHover .dijitButtonNode {
- background-color:#abd6ff;
-}
-.claro .dijitComboBoxHover .dijitArrowButtonInner {
- background-position:-70px 53%;
-}
-.claro .dijitComboBoxFocused .dijitButtonNode {
- background-color:#7dbefa;
- background-position:0px -177px;
- padding: 1px;
-}
-.claro .dijitComboBoxFocused .dijitArrowButtonInner {
- background-position:-70px 53%;
- border: 0px none;
-}
+ background-color: #efefef;
+ background-image: url("images/formHighlight.png");
+ background-repeat: repeat-x;
+}
+/* Arrow "hover" effect:
+ * The arrow button should change color whenever the mouse is in a position such that clicking it
+ * will toggle the drop down. That's either (1) anywhere over the ComboBox or (2) over the arrow
+ * button, depending on the openOnClick setting for the widget.
+ */
+.claro .dijitComboBoxOpenOnClickHover .dijitButtonNode, .claro .dijitComboBox .dijitDownArrowButtonHover {
+ background-color: #abd6ff;
+}
+.claro .dijitComboBoxOpenOnClickHover .dijitArrowButtonInner, .claro .dijitComboBox .dijitDownArrowButtonHover .dijitArrowButtonInner {
+ background-position: -70px 53%;
+}
+/* Arrow Button change when drop down is open */
+.claro .dijitComboBox .dijitHasDropDownOpen {
+ background-color: #7dbefa;
+ background-position: 0 -177px;
+ padding: 1px;
+}
+.claro .dijitComboBox .dijitHasDropDownOpen .dijitArrowButtonInner {
+ background-position: -70px 53%;
+ border: 0 none;
+}
+/* disabled state */
.claro div.dijitComboBoxDisabled .dijitArrowButtonInner {
-
- background-position:0px 50%;
- background-color:#f1f1f1;
+ /* specific selector set to override background-position setting from Button.js
+ * (.claro .dijitComboBoxDisabled .dijitArrowButtonInner) */
+
+ background-position: 0 50%;
+ background-color: #efefef;
}
+/*========================= hacks for browsers =========================*/
+/* it seems the input[type="hidden"] has a height (16px) too... this may cause the widget's height calculate error */
.dj_ff3 .claro .dijitInputField input[type="hidden"] {
- display: none;
- height: 0;
- width: 0;
+ display: none;
+ height: 0;
+ width: 0;
}
-.dj_ie6 .claro .dijitTextBox,
-.dj_ie6 .claro .dijitComboBox .dijitButtonNode {
- background-image: none;
+/* ie6 doesn't support transparent background img */
+.dj_ie6 .claro .dijitTextBox, .dj_ie6 .claro .dijitComboBox .dijitButtonNode {
+ background-image: none;
}
-.dj_quirks .claro .dijitComboBox .dijitArrowButtonInner {
- border: 0px;
+.dj_borderbox .claro .dijitComboBox .dijitHasDropDownOpen .dijitArrowButtonInner {
+ width: 18px;
}
-.dj_quirks .claro .dijitComboBox .dijitArrowButtonContainer {
- padding: 1px;
+.dj_borderbox .claro .dijitComboBoxFocused .dijitHasDropDownOpen .dijitArrowButtonInner {
+ width: 16px;
}
diff --git a/lib/dijit/themes/claro/form/Common.less b/lib/dijit/themes/claro/form/Common.less
new file mode 100644
index 000000000..729867a67
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Common.less
@@ -0,0 +1,194 @@
+/* claro/form/Common.css */
+
+/*========================= common css =========================*/
+
+@import "../variables";
+
+/* 'dijitTextBox' refers to 'dijit(TextBox|DateTextBox|CurrencyTextBox|...)' */
+
+.claro .dijitTextBoxError .dijitValidationContainer {
+ background-color: @erroricon-background-color;
+ background-image: url('images/error.png');
+ background-position: top center;
+ border: solid @erroricon-background-color 0;
+ border-left-width: 1px;
+ width: 9px;
+}
+.claro .dijitTextBoxError .dijitValidationIcon {
+ width: 0;
+ background-color: transparent !important; /* so the INPUT doesn't obscure the border in rtl+a11y */
+}
+
+/* Padding for the input area of TextBox based widgets, and corresponding padding for the
+ * down arrow button and the placeholder. placeholder is explicitly listed because
+ * dijitPlaceHolder is absolutely positioned, so padding set on dijitInputField
+ * won't affect it
+ */
+.claro .dijitTextArea,
+.claro .dijitInputField .dijitPlaceHolder {
+ padding: @textbox-padding;
+}
+.claro .dijitTextBox .dijitInputField {
+ // Subtract 1px from top/bottom because we add 1px to other nodes, see rules below.
+ // Although we are theoretically only adding 1px to top/bottom browsers seem to pad inputs by 1px on left/right,
+ // although that varies by so compensate for that too.
+ padding: @textbox-padding - 1px @textbox-padding;
+}
+.dj_gecko .claro .dijitTextBox .dijitInputInner,
+.dj_webkit .claro .dijitTextBox .dijitInputInner {
+ // Although we are theoretically only adding 1px to top/bottom, some browsers seem to pad inputs by 1px on left/right,
+ // so compensate for that too.
+ padding: @textbox-padding - 1px;
+}
+
+.claro .dijitTextBox,
+.claro .dijitTextBox .dijitButtonNode {
+ /* color for (outer) border on *TextBox widgets, and border between input and buttons on ComboBox and Spinner */
+ border-color: @border-color;
+ .transition-property(background-color, border);
+ .transition-duration(.35s);
+}
+.claro .dijitTextBox {
+ background-color: @textbox-background-color;
+}
+
+/* hover */
+.claro .dijitTextBoxHover,
+.claro .dijitTextBoxHover .dijitButtonNode {
+ border-color: @hovered-border-color;
+ .transition-duration(.25s);
+}
+.claro .dijitTextBoxHover {
+ background-color: @textbox-hovered-background-color;
+ background-image: url('images/textBox_back.png');
+ background-repeat: repeat-x;
+}
+
+/* error state */
+.claro .dijitTextBoxError,
+.claro .dijitTextBoxError .dijitButtonNode {
+ border-color: @error-border-color;
+}
+.claro .dijitTextBoxError,
+.claro .dijitTextBoxError .dijitInputContainer {
+ background-color: @textbox-error-background-color;
+}
+
+/* focused state */
+.claro .dijitTextBoxFocused,
+.claro .dijitTextBoxFocused .dijitButtonNode {
+ border-color:@focused-border-color;
+ .transition-duration(.1s);
+}
+.claro .dijitTextBoxFocused {
+ background-color: @textbox-focused-background-color;
+ background-image: url('images/textBox_back.png');
+ background-repeat: repeat-x;
+}
+.claro .dijitTextBoxFocused .dijitInputContainer {
+ background: @textbox-focused-background-color;
+}
+
+.claro .dijitTextBoxErrorFocused,
+.claro .dijitTextBoxErrorFocused .dijitButtonNode {
+ border-color: @error-focused-border-color;
+}
+
+/* disabled state */
+.claro .dijitTextBoxDisabled,
+.claro .dijitTextBoxDisabled .dijitButtonNode {
+ border-color: @disabled-border-color;
+}
+.claro .dijitTextBoxDisabled,
+.claro .dijitTextBoxDisabled .dijitInputContainer {
+ background-color: @textbox-disabled-background-color;
+ background-image: none;
+ color: @disabled-text-color;
+}
+
+/*========================= for special widgets =========================*/
+
+/* Input boxes with an arrow (for a drop down) */
+
+.claro .dijitComboBox .dijitArrowButtonInner {
+ background-image: url("images/commonFormArrows.png");
+ background-position:-35px 53%;
+ background-repeat: no-repeat;
+ margin: 0;
+ width:16px;
+ border: 1px solid @arrowbutton-inner-border-color; // white gutter around the arrow button
+}
+
+.claro .dijitToolbar .dijitComboBox .dijitArrowButtonInner {
+ border: none;
+}
+
+.claro .dijitToolbar .dijitComboBox .dijitArrowButtonInner {
+ border: none;
+}
+
+/* Add 1px vertical padding to the <input> where user types and the validation icon,
+ to match the 1px border on arrow button */
+.claro .dijitTextBox .dijitInputInner,
+.claro .dijitTextBox .dijitValidationContainer {
+ padding: 1px 0;
+}
+
+.claro .dijitComboBox .dijitButtonNode {
+ background-color: @arrowbutton-background-color;
+ background-image: url("images/formHighlight.png");
+ background-repeat:repeat-x;
+}
+
+/* Arrow "hover" effect:
+ * The arrow button should change color whenever the mouse is in a position such that clicking it
+ * will toggle the drop down. That's either (1) anywhere over the ComboBox or (2) over the arrow
+ * button, depending on the openOnClick setting for the widget.
+ */
+.claro .dijitComboBoxOpenOnClickHover .dijitButtonNode,
+.claro .dijitComboBox .dijitDownArrowButtonHover {
+ background-color:@arrowbutton-hovered-background-color;
+}
+.claro .dijitComboBoxOpenOnClickHover .dijitArrowButtonInner,
+.claro .dijitComboBox .dijitDownArrowButtonHover .dijitArrowButtonInner {
+ background-position:-70px 53%;
+}
+
+/* Arrow Button change when drop down is open */
+.claro .dijitComboBox .dijitHasDropDownOpen { // .dijitHasDropDown is on dijitArrowButton node
+ background-color: @pressed-background-color;
+ background-position:0 -177px;
+ padding: 1px; // Since no border on arrow button (see rule below)
+}
+.claro .dijitComboBox .dijitHasDropDownOpen .dijitArrowButtonInner {
+ background-position:-70px 53%;
+ border: 0 none;
+}
+
+/* disabled state */
+.claro div.dijitComboBoxDisabled .dijitArrowButtonInner {
+ /* specific selector set to override background-position setting from Button.js
+ * (.claro .dijitComboBoxDisabled .dijitArrowButtonInner) */
+ background-position:0 50%;
+ background-color:@disabled-background-color;
+}
+
+/*========================= hacks for browsers =========================*/
+/* it seems the input[type="hidden"] has a height (16px) too... this may cause the widget's height calculate error */
+.dj_ff3 .claro .dijitInputField input[type="hidden"] {
+ display: none;
+ height: 0;
+ width: 0;
+}
+
+/* ie6 doesn't support transparent background img */
+.dj_ie6 .claro .dijitTextBox,
+.dj_ie6 .claro .dijitComboBox .dijitButtonNode {
+ background-image: none;
+}
+.dj_borderbox .claro .dijitComboBox .dijitHasDropDownOpen .dijitArrowButtonInner {
+ width:18px; // quirks mode means border-box sizing, so 18px with the border (same as 16px without border)
+}
+.dj_borderbox .claro .dijitComboBoxFocused .dijitHasDropDownOpen .dijitArrowButtonInner {
+ width:16px; // when no border, then back to 16px just like content-box sizing
+} \ No newline at end of file
diff --git a/lib/dijit/themes/claro/form/Common_rtl.css b/lib/dijit/themes/claro/form/Common_rtl.css
index 065f0c70d..74827c16f 100644
--- a/lib/dijit/themes/claro/form/Common_rtl.css
+++ b/lib/dijit/themes/claro/form/Common_rtl.css
@@ -1,5 +1,10 @@
-
-.claro .dijitTextBoxRtlError .dijitValidationContainer {
- border-left-width: 0px;
+/* claro/form/Common_rtl.css */
+/*claro should not have the icon on the container
+.claro .dijitTextBoxRtlError .dijitValidationIcon {
+ border-left-width: 0;
border-right-width: 1px;
+}*/
+.claro .dijitTextBoxRtlError .dijitValidationContainer {
+ border-left-width: 0;
+ border-right-width: 1px;
}
diff --git a/lib/dijit/themes/claro/form/Common_rtl.less b/lib/dijit/themes/claro/form/Common_rtl.less
new file mode 100644
index 000000000..fd4975a51
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Common_rtl.less
@@ -0,0 +1,13 @@
+/* claro/form/Common_rtl.css */
+
+@import "../variables";
+
+/*claro should not have the icon on the container
+.claro .dijitTextBoxRtlError .dijitValidationIcon {
+ border-left-width: 0;
+ border-right-width: 1px;
+}*/
+.claro .dijitTextBoxRtlError .dijitValidationContainer {
+ border-left-width: 0;
+ border-right-width: 1px;
+}
diff --git a/lib/dijit/themes/claro/form/NumberSpinner.css b/lib/dijit/themes/claro/form/NumberSpinner.css
index 66b97da62..bc6e1aeb6 100644
--- a/lib/dijit/themes/claro/form/NumberSpinner.css
+++ b/lib/dijit/themes/claro/form/NumberSpinner.css
@@ -1,100 +1,138 @@
-
+/* NumberSpinner - namespace "dijitSpinner"
+ *
+ * Styling NumberSpinner mainly includes:
+ *
+ * 1. Arrows
+ * Outer containers: .dijitSpinnerButtonContainer|.dijitSpinnerButtonInner - for border, padding and position
+ * Arrows: .dijitArrowButton|.dijitUpArrowButton.|dijitDownArrowButton
+ * Inner container: .dijitArrowButtonInner - for border, padding, width|height and background image
+ *
+ * 2. Hover state
+ * .dijitUpArrowButtonHover|.dijitDownArrowButtonHover .* - for background color|image
+ *
+ * 3. Active state
+ * .dijitUpArrowButtonActive|.dijitDownArrowButtonActive .* - for border, padding, margin and background color|image
+ *
+ * 4. Focused state
+ * .dijitSpinnerFocused .* - for background color|image
+ *
+ * 5. Disabled state
+ * .dijitSpinnerDisabled .* - for background color|image
+ */
.claro .dijitSpinnerButtonContainer {
- overflow: hidden;
- position: relative;
- width: auto;
- padding: 0 2px;
+ overflow: hidden;
+ position: relative;
+ width: auto;
+ padding: 0 2px;
}
.claro .dijitSpinnerButtonContainer .dijitSpinnerButtonInner {
- border-width: 1px 0;
- border-style: solid none;
+ border-width: 1px 0;
+ /* reserve space to match the claro combobox button border with border and not padding to make IE happier */
+
+ border-style: solid none;
}
+/* button */
.claro .dijitSpinner .dijitArrowButton {
- width:auto;
- background-color: #ebeef4;
- background-image: url("images/formHighlight.png");
- background-position:0px 0px;
- background-repeat:repeat-x;
- overflow: hidden;
+ width: auto;
+ background-color: #efefef;
+ background-image: url("images/formHighlight.png");
+ background-position: 0 0;
+ background-repeat: repeat-x;
+ overflow: hidden;
}
.dj_iequirks .claro .dijitSpinner .dijitArrowButton {
- overflow: visible;
+ overflow: visible;
+ /* 0 height w/o this */
+
}
.claro .dijitSpinner .dijitSpinnerButtonInner {
- width: 15px;
+ width: 15px;
}
+/* up & down button icons */
.claro .dijitSpinner .dijitArrowButtonInner {
- border:solid 1px #fff;
- border-bottom-width: 0;
- background-image: url("images/commonFormArrows.png");
- background-repeat: no-repeat;
- height: 100%;
- width:15px;
- padding-left: 1px;
- padding-right: 1px;
-
- background-position:-139px center;
-
- display: block;
- margin: -1px 0px -1px 0px;
- #margin-top: 0;
+ border: solid 1px #ffffff;
+ border-bottom-width: 0;
+ /* 2 top borders = 1 top+bottom border in ComboBox */
+
+ background-image: url("images/commonFormArrows.png");
+ background-repeat: no-repeat;
+ height: 100%;
+ width: 15px;
+ padding-left: 1px;
+ padding-right: 1px;
+ /* for up arrow */
+
+ background-position: -139px center;
+ /* override button.css (TODO: move to Common.css since ComboBox needs this too) */
+
+ display: block;
+ margin: -1px 0 -1px 0;
+ /* compensate for inner border */
+
+}
+.dj_ie6 .claro .dijitSpinner .dijitArrowButtonInner, .dj_ie7 .claro .dijitSpinner .dijitArrowButtonInner {
+ margin-top: 0;
+ /* since its bottom aligned */
+
}
.dj_iequirks .claro .dijitSpinner .dijitArrowButtonInner {
- width: 19px;
+ width: 19px;
}
.claro .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
- background-position:-34px;
+ background-position: -34px;
}
.claro .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding: 0;
+ padding: 0;
}
-.claro .dijitUpArrowButtonActive,
-.claro .dijitDownArrowButtonActive {
- background-color:#abd6ff;
+/** hover & focused status **/
+.claro .dijitUpArrowButtonActive, .claro .dijitDownArrowButtonActive {
+ background-color: #abd6ff;
}
-.claro .dijitSpinner .dijitUpArrowButtonHover,
-.claro .dijitSpinner .dijitDownArrowButtonHover,
-.claro .dijitSpinnerFocused .dijitArrowButton {
- background-color: #a0d1ff;
+.claro .dijitSpinner .dijitUpArrowButtonHover, .claro .dijitSpinner .dijitDownArrowButtonHover, .claro .dijitSpinnerFocused .dijitArrowButton {
+ background-color: #abd6ff;
}
.claro .dijitSpinner .dijitUpArrowButtonHover .dijitArrowButtonInner {
- background-position:-174px;
+ background-position: -174px;
}
.claro .dijitSpinner .dijitDownArrowButtonHover .dijitArrowButtonInner {
- background-position:-69px;
+ background-position: -69px;
}
.claro .dijitSpinnerFocused {
- background-color: #fff;
- background-image: none;
+ background-color: #ffffff;
+ background-image: none;
}
-.claro .dijitSpinner .dijitDownArrowButtonActive,
-.claro .dijitSpinner .dijitUpArrowButtonActive {
- background-color: #3299f9;
- background-position:0px -177px;
+/* mouse down status */
+.claro .dijitSpinner .dijitDownArrowButtonActive, .claro .dijitSpinner .dijitUpArrowButtonActive {
+ background-color: #7dbefa;
+ background-position: 0 -177px;
}
-.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner,
-.claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
-
- border: 0px;
- padding: 1px;
- margin-right:2px;
- margin-bottom:1px;
+.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner, .claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
+ /* hide inner border while button is depressed */
+
+ border: 0;
+ padding: 1px;
+ margin-right: 2px;
+ margin-bottom: 1px;
}
.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner {
- background-position:-173px;
+ background-position: -173px;
}
.claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
- background-position:-68px;
+ background-position: -68px;
}
+/* disabled */
.claro .dijitSpinnerDisabled .dijitArrowButtonInner {
- background-color: #f1f1f1;
+ background-color: #efefef;
}
.claro .dijitSpinnerDisabled .dijitUpArrowButton .dijitArrowButtonInner {
- background-position:-104px;
+ background-position: -104px;
}
.claro .dijitSpinnerDisabled .dijitDownArrowButton .dijitArrowButtonInner {
- background-position:1px;
+ background-position: 1px;
}
+/** hacks for browsers **/
+/* for IE 7, when div is enlarged,
+ * should be no empty space between dijitInputLayoutContainer and dijitSpinner*/
.dj_ie7 .claro .dijitSpinner {
- overflow:visible;
-}
+ overflow: visible;
+}
diff --git a/lib/dijit/themes/claro/form/NumberSpinner.less b/lib/dijit/themes/claro/form/NumberSpinner.less
new file mode 100644
index 000000000..ca78afb35
--- /dev/null
+++ b/lib/dijit/themes/claro/form/NumberSpinner.less
@@ -0,0 +1,150 @@
+/* NumberSpinner - namespace "dijitSpinner"
+ *
+ * Styling NumberSpinner mainly includes:
+ *
+ * 1. Arrows
+ * Outer containers: .dijitSpinnerButtonContainer|.dijitSpinnerButtonInner - for border, padding and position
+ * Arrows: .dijitArrowButton|.dijitUpArrowButton.|dijitDownArrowButton
+ * Inner container: .dijitArrowButtonInner - for border, padding, width|height and background image
+ *
+ * 2. Hover state
+ * .dijitUpArrowButtonHover|.dijitDownArrowButtonHover .* - for background color|image
+ *
+ * 3. Active state
+ * .dijitUpArrowButtonActive|.dijitDownArrowButtonActive .* - for border, padding, margin and background color|image
+ *
+ * 4. Focused state
+ * .dijitSpinnerFocused .* - for background color|image
+ *
+ * 5. Disabled state
+ * .dijitSpinnerDisabled .* - for background color|image
+ */
+
+@import "../variables";
+
+.claro .dijitSpinnerButtonContainer {
+ overflow: hidden;
+ position: relative;
+ width: auto;
+ padding: 0 2px;
+}
+.claro .dijitSpinnerButtonContainer .dijitSpinnerButtonInner {
+ border-width: 1px 0; /* reserve space to match the claro combobox button border with border and not padding to make IE happier */
+ border-style: solid none;
+}
+
+/* button */
+.claro .dijitSpinner .dijitArrowButton {
+ width:auto;
+ background-color: @arrowbutton-background-color;
+ background-image: url("images/formHighlight.png");
+ background-position:0 0;
+ background-repeat:repeat-x;
+ overflow: hidden;
+}
+.dj_iequirks .claro .dijitSpinner .dijitArrowButton {
+ overflow: visible; /* 0 height w/o this */
+}
+
+.claro .dijitSpinner .dijitSpinnerButtonInner {
+ width: 15px;
+}
+/* up & down button icons */
+.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-repeat: no-repeat;
+ height: 100%;
+ width:15px;
+ padding-left: 1px;
+ padding-right: 1px;
+
+ /* for up arrow */
+ background-position:-139px center;
+
+ /* override button.css (TODO: move to Common.css since ComboBox needs this too) */
+ display: block;
+ margin: -1px 0 -1px 0; /* compensate for inner border */
+}
+
+.dj_ie6 .claro .dijitSpinner .dijitArrowButtonInner,
+.dj_ie7 .claro .dijitSpinner .dijitArrowButtonInner {
+ margin-top: 0; /* since its bottom aligned */
+}
+
+.dj_iequirks .claro .dijitSpinner .dijitArrowButtonInner {
+ width: 19px;
+}
+.claro .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
+ background-position:-34px;
+}
+.claro .dijitSpinner .dijitArrowButtonInner .dijitInputField {
+ padding: 0;
+}
+
+/** hover & focused status **/
+
+.claro .dijitUpArrowButtonActive,
+.claro .dijitDownArrowButtonActive {
+ background-color:@arrowbutton-pressed-background-color;
+}
+
+.claro .dijitSpinner .dijitUpArrowButtonHover,
+.claro .dijitSpinner .dijitDownArrowButtonHover,
+.claro .dijitSpinnerFocused .dijitArrowButton {
+ background-color: @arrowbutton-hovered-background-color;
+}
+
+.claro .dijitSpinner .dijitUpArrowButtonHover .dijitArrowButtonInner {
+ background-position:-174px;
+}
+.claro .dijitSpinner .dijitDownArrowButtonHover .dijitArrowButtonInner {
+ background-position:-69px;
+}
+
+.claro .dijitSpinnerFocused {
+ background-color: @textbox-focused-background-color;
+ background-image: none;
+}
+
+/* mouse down status */
+.claro .dijitSpinner .dijitDownArrowButtonActive,
+.claro .dijitSpinner .dijitUpArrowButtonActive {
+ background-color: #7dbefa; // TODO. Mailed Jason about inconsistent ComboBox/Spinner behavior.
+ background-position:0 -177px;
+}
+.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner,
+.claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
+ /* hide inner border while button is depressed */
+ border: 0;
+ padding: 1px;
+ margin-right:2px;
+ margin-bottom:1px;
+}
+.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner {
+ background-position:-173px;
+}
+.claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
+ background-position:-68px;
+}
+
+/* disabled */
+
+.claro .dijitSpinnerDisabled .dijitArrowButtonInner {
+ background-color: @disabled-background-color;
+}
+.claro .dijitSpinnerDisabled .dijitUpArrowButton .dijitArrowButtonInner {
+ background-position:-104px;
+}
+.claro .dijitSpinnerDisabled .dijitDownArrowButton .dijitArrowButtonInner {
+ background-position:1px;
+}
+
+/** hacks for browsers **/
+
+/* for IE 7, when div is enlarged,
+ * 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 b9058d1b9..4dc3ad47d 100644
--- a/lib/dijit/themes/claro/form/RadioButton.css
+++ b/lib/dijit/themes/claro/form/RadioButton.css
@@ -1,51 +1,79 @@
-
-.claro .dijitToggleButton .dijitRadio,
-.claro .dijitToggleButton .dijitRadioIcon {
- background-image: url('images/checkboxRadioButtonStates.png');
+/* RadioButton
+ *
+ * Styling RadioButton mainly includes:
+ *
+ * 1. Containers
+ * .dijitRadio|.dijitRadioIcon - for border, padding, width|height and background image
+ *
+ * 2. RadioButton within ToggleButton
+ * .dijitToggleButton|.dijitToggleButtonChecked .* - for background image
+ *
+ * 3. Checked state
+ * .dijitRadioChecked - for checked background-color|image
+ * .dijitToggleButtonChecked - for border, background-color|image, display and width|height
+ *
+ * 4. Hover state
+ * .dijitRadioHover|.dijitRadioCheckedHover - for background image
+ *
+ * 5. Disabled state
+ * .dijitRadioDisabled|.dijitRadioCheckedDisabled - for background image
+ */
+.claro .dijitToggleButton .dijitRadio, .claro .dijitToggleButton .dijitRadioIcon {
+ background-image: url('images/checkboxRadioButtonStates.png');
}
-.dj_ie6 .claro .dijitToggleButton .dijitRadio,
-.dj_ie6 .claro .dijitToggleButton .dijitRadioIcon {
- background-image: url('images/checkboxAndRadioButtons_IE6.png');
+.dj_ie6 .claro .dijitToggleButton .dijitRadio, .dj_ie6 .claro .dijitToggleButton .dijitRadioIcon {
+ background-image: url('images/checkboxAndRadioButtons_IE6.png');
}
-.claro .dijitRadio,
-.claro .dijitRadioIcon {
- background-image: url('images/checkboxRadioButtonStates.png');
- background-repeat: no-repeat;
- width: 15px;
- height: 15px;
- margin: 0px 2px 0px 0px;
- padding: 0px;
+.claro .dijitRadio, .claro .dijitRadioIcon {
+ /* inside a toggle button */
+
+ background-image: url('images/checkboxRadioButtonStates.png');
+ /* checkbox sprite image */
+
+ background-repeat: no-repeat;
+ width: 15px;
+ height: 15px;
+ margin: 0 2px 0 0;
+ padding: 0;
}
-.dj_ie6 .claro .dijitRadio,
-.dj_ie6 .claro .dijitRadioIcon {
- background-image: url('images/checkboxAndRadioButtons_IE6.png');
+.dj_ie6 .claro .dijitRadio, .dj_ie6 .claro .dijitRadioIcon {
+ /* inside a toggle button */
+
+ background-image: url('images/checkboxAndRadioButtons_IE6.png');
+ /* checkbox sprite image */
+
}
-.claro .dijitRadio{
-
- background-position: -105px;
+.claro .dijitRadio {
+ /* unselected */
+
+ background-position: -105px;
}
.claro .dijitToggleButton .dijitRadioIcon {
-
- background-position: -107px;
+ /* unselected */
+
+ background-position: -107px;
}
.claro .dijitRadioDisabled {
-
- background-position: -165px;
+ /* unselected and disabled */
+
+ background-position: -165px;
}
.claro .dijitRadioHover {
-
- background-position: -135px;
+ /* hovering over an unselected enabled radio button */
+
+ background-position: -135px;
}
-.claro .dijitRadioChecked{
- background-position: -90px;
+.claro .dijitRadioChecked {
+ background-position: -90px;
}
.claro .dijitToggleButtonChecked .dijitRadioIcon {
- background-position: -92px;
+ background-position: -92px;
}
-.claro .dijitRadioCheckedHover{
- background-position: -120px;
+.claro .dijitRadioCheckedHover {
+ background-position: -120px;
}
.claro .dijitRadioCheckedDisabled {
-
- background-position: -150px;
+ /* selected but disabled */
+
+ background-position: -150px;
}
diff --git a/lib/dijit/themes/claro/form/RadioButton.less b/lib/dijit/themes/claro/form/RadioButton.less
new file mode 100644
index 000000000..18f1cc163
--- /dev/null
+++ b/lib/dijit/themes/claro/form/RadioButton.less
@@ -0,0 +1,84 @@
+/* RadioButton
+ *
+ * Styling RadioButton mainly includes:
+ *
+ * 1. Containers
+ * .dijitRadio|.dijitRadioIcon - for border, padding, width|height and background image
+ *
+ * 2. RadioButton within ToggleButton
+ * .dijitToggleButton|.dijitToggleButtonChecked .* - for background image
+ *
+ * 3. Checked state
+ * .dijitRadioChecked - for checked background-color|image
+ * .dijitToggleButtonChecked - for border, background-color|image, display and width|height
+ *
+ * 4. Hover state
+ * .dijitRadioHover|.dijitRadioCheckedHover - for background image
+ *
+ * 5. Disabled state
+ * .dijitRadioDisabled|.dijitRadioCheckedDisabled - for background image
+ */
+
+@import "../variables";
+
+.claro .dijitToggleButton .dijitRadio,
+.claro .dijitToggleButton .dijitRadioIcon {
+ background-image: url('images/checkboxRadioButtonStates.png');
+}
+
+.dj_ie6 .claro .dijitToggleButton .dijitRadio,
+.dj_ie6 .claro .dijitToggleButton .dijitRadioIcon {
+ background-image: url('images/checkboxAndRadioButtons_IE6.png');
+}
+
+.claro .dijitRadio,
+.claro .dijitRadioIcon { /* inside a toggle button */
+ background-image: url('images/checkboxRadioButtonStates.png'); /* checkbox sprite image */
+ background-repeat: no-repeat;
+ width: 15px;
+ height: 15px;
+ margin: 0 2px 0 0;
+ padding: 0;
+}
+
+.dj_ie6 .claro .dijitRadio,
+.dj_ie6 .claro .dijitRadioIcon { /* inside a toggle button */
+ background-image: url('images/checkboxAndRadioButtons_IE6.png'); /* checkbox sprite image */
+}
+
+.claro .dijitRadio{
+ /* unselected */
+ background-position: -105px;
+}
+
+.claro .dijitToggleButton .dijitRadioIcon {
+ /* unselected */
+ background-position: -107px;
+}
+
+.claro .dijitRadioDisabled {
+ /* unselected and disabled */
+ background-position: -165px;
+}
+
+.claro .dijitRadioHover {
+ /* hovering over an unselected enabled radio button */
+ background-position: -135px;
+}
+
+.claro .dijitRadioChecked{
+ background-position: -90px;
+}
+
+.claro .dijitToggleButtonChecked .dijitRadioIcon {
+ background-position: -92px;
+}
+
+.claro .dijitRadioCheckedHover{
+ background-position: -120px;
+}
+
+.claro .dijitRadioCheckedDisabled {
+ /* selected but disabled */
+ background-position: -150px;
+}
diff --git a/lib/dijit/themes/claro/form/Select.css b/lib/dijit/themes/claro/form/Select.css
index c8f1d43fa..a30ede640 100644
--- a/lib/dijit/themes/claro/form/Select.css
+++ b/lib/dijit/themes/claro/form/Select.css
@@ -1,89 +1,109 @@
-
+/* Select
+ *
+ * Styling Select mainly includes:
+ *
+ * 1. Containers
+ * .dijitSelect - for border, background-color
+ * .dijitButtonContents - for border
+ *
+ * 2. Arrow
+ * .dijitArrowButton - for border, padding and background-color|image
+ * .dijitArrowButtonInner - for border, background-color|image, display and width|height
+ *
+ * 3. Menu
+ * .dijitSelectMenu .* - for border, padding
+ *
+ * 4. Various states
+ * .dijitSelectHover|.dijitSelectFocused|.dijitSelectDisabled .* - for border, padding and background-color|image
+ */
.claro .dijitSelect .dijitButtonText {
- padding: 0px 5px 2px 5px;
+ padding: 2px;
}
+/* normal status */
.claro .dijitSelect {
- border: 1px solid #b5bcc7;
- background-color: #f7fcff;
- border-collapse: separate;
+ border: 1px solid #b5bcc7;
+ background-color: #ffffff;
+ border-collapse: separate;
}
-.dj_ie6 .claro .dijitSelect,
-.dj_ie6 .claro .dijitSelect .dijitButtonNode {
- background-image:none;
+.dj_ie6 .claro .dijitSelect, .dj_ie6 .claro .dijitSelect .dijitButtonNode {
+ background-image: none;
}
.claro .dijitSelect .dijitButtonContents {
- border: 0px solid #b5bcc7;
- border-right-width: 1px;
+ border: 0 solid #b5bcc7;
+ border-right-width: 1px;
}
.claro .dijitSelect .dijitArrowButton {
- padding: 0;
- border: 1px solid #fff;
- border-top:none;
- background-color:#ebeef4;
- background-image: url("images/formHighlight.png");
- background-repeat:repeat-x;
+ padding: 0;
+ border: 1px solid #ffffff;
+ border-top: none;
+ background-color: #efefef;
+ background-image: url("images/formHighlight.png");
+ background-repeat: repeat-x;
}
.claro .dijitSelect .dijitArrowButton .dijitArrowButtonInner {
- background-image: url("images/commonFormArrows.png");
- background-position:-35px 70%;
- background-repeat: no-repeat;
- width:16px;
- height:16px;
- display:block;
+ background-image: url("images/commonFormArrows.png");
+ background-position: -35px 70%;
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
}
+/* hover status */
.claro .dijitSelectHover {
- border: 1px solid #769dc0;
- background-color: #e9f4fe;
- background-image: url('images/textBox_back.png');
- background-repeat: repeat-x;
+ border: 1px solid #769dc0;
+ background-color: #e9f4fe;
+ background-image: url('images/textBox_back.png');
+ background-repeat: repeat-x;
}
.claro .dijitSelectHover .dijitButtonContents {
- border-color:#81a5c6;
+ border-color: #769dc0;
}
.claro .dijitSelectHover .dijitArrowButton {
- background-color:#abd6ff;
+ background-color: #abd6ff;
}
.claro .dijitSelectHover .dijitArrowButton .dijitArrowButtonInner {
- background-position:-70px 70%;
+ background-position: -70px 70%;
}
+/* focused status */
.claro .dijitSelectFocused {
- border: 1px solid #769dc0;
+ border: 1px solid #769dc0;
}
.claro .dijitSelectFocused .dijitButtonContents {
- border-color:#81a5c6;
+ border-color: #769dc0;
}
.claro .dijitSelectFocused .dijitArrowButton {
- background-color:#7dbefa;
- background-position:0px -177px;
- border: none;
- padding: 0px 1px;
+ background-color: #7dbefa;
+ background-position: 0 -177px;
+ border: none;
+ padding: 0 1px;
}
.claro .dijitSelectFocused .dijitArrowButton .dijitArrowButtonInner {
- background-position:-70px 70%;
- margin-bottom: 1px;
+ background-position: -70px 70%;
+ margin-bottom: 1px;
}
+/* disable status */
.claro .dijitSelectDisabled {
- border: 1px solid #d3d3d3;
- background-color: #efefef;
- background-image: none;
- color: #818181;
+ border: 1px solid #d3d3d3;
+ background-color: #efefef;
+ background-image: none;
+ color: #818181;
}
-.claro .dijitSelectDisabled .dijitArrowButton {
- background-color: #efefef;
+.claro .dijitSelectDisabled .dijitArrowButton {
+ background-color: #efefef;
}
.claro .dijitSelectDisabled .dijitArrowButton .dijitArrowButtonInner {
- background-position:0px 70%
+ background-position: 0 70%;
}
-.claro .dijitSelectMenu td.dijitMenuItemIconCell,
-.claro .dijitSelectMenu td.dijitMenuArrowCell {
-
- display: none;
+/* Dropdown menu style for select */
+.claro .dijitSelectMenu td.dijitMenuItemIconCell, .claro .dijitSelectMenu td.dijitMenuArrowCell {
+ /* so that arrow and icon cells from MenuItem are not displayed */
+
+ display: none;
}
.claro .dijitSelectMenu td.dijitMenuItemLabel {
-
- padding-left: 5px;
- padding-right: 5px;
+ /* line up menu text with text in select box (in LTR and RTL modes) */
+
+ padding: 2px;
}
.claro .dijitSelectMenu .dijitMenuSeparatorTop {
- border-bottom:1px solid #769dc0;
+ border-bottom: 1px solid #769dc0;
}
diff --git a/lib/dijit/themes/claro/form/Select.less b/lib/dijit/themes/claro/form/Select.less
new file mode 100644
index 000000000..c429b2e48
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Select.less
@@ -0,0 +1,124 @@
+/* Select
+ *
+ * Styling Select mainly includes:
+ *
+ * 1. Containers
+ * .dijitSelect - for border, background-color
+ * .dijitButtonContents - for border
+ *
+ * 2. Arrow
+ * .dijitArrowButton - for border, padding and background-color|image
+ * .dijitArrowButtonInner - for border, background-color|image, display and width|height
+ *
+ * 3. Menu
+ * .dijitSelectMenu .* - for border, padding
+ *
+ * 4. Various states
+ * .dijitSelectHover|.dijitSelectFocused|.dijitSelectDisabled .* - for border, padding and background-color|image
+ */
+
+@import "../variables";
+
+.claro .dijitSelect .dijitButtonText {
+ padding: @textbox-padding;
+}
+
+/* normal status */
+.claro .dijitSelect {
+ border: 1px solid @border-color;
+ background-color: @textbox-background-color;
+ border-collapse: separate;
+}
+.dj_ie6 .claro .dijitSelect,
+.dj_ie6 .claro .dijitSelect .dijitButtonNode {
+ background-image:none;
+}
+
+.claro .dijitSelect .dijitButtonContents {
+ border: 0 solid @border-color;
+ border-right-width: 1px;
+}
+
+.claro .dijitSelect .dijitArrowButton {
+ padding: 0;
+ border: 1px solid @arrowbutton-inner-border-color;
+ border-top:none;
+ background-color: @arrowbutton-background-color;
+ background-image: url("images/formHighlight.png");
+ background-repeat:repeat-x;
+}
+
+.claro .dijitSelect .dijitArrowButton .dijitArrowButtonInner {
+ background-image: url("images/commonFormArrows.png");
+ background-position:-35px 70%;
+ background-repeat: no-repeat;
+ width:16px;
+ height:16px;
+}
+
+/* hover status */
+.claro .dijitSelectHover {
+ border: 1px solid @hovered-border-color;
+ background-color: @textbox-hovered-background-color;
+ background-image: url('images/textBox_back.png');
+ background-repeat: repeat-x;
+}
+
+.claro .dijitSelectHover .dijitButtonContents {
+ border-color:@hovered-border-color;
+}
+
+.claro .dijitSelectHover .dijitArrowButton {
+ background-color:@arrowbutton-hovered-background-color;
+}
+.claro .dijitSelectHover .dijitArrowButton .dijitArrowButtonInner {
+ background-position:-70px 70%;
+}
+
+/* focused status */
+.claro .dijitSelectFocused {
+ border: 1px solid @focused-border-color;
+}
+.claro .dijitSelectFocused .dijitButtonContents {
+ border-color:@focused-border-color;
+}
+.claro .dijitSelectFocused .dijitArrowButton {
+ background-color:#7dbefa; // TODO. Mailed Jason about inconsistent ComboBox/Spinner behavior.
+ background-position:0 -177px;
+ border: none;
+ padding: 0 1px;
+}
+.claro .dijitSelectFocused .dijitArrowButton .dijitArrowButtonInner {
+ background-position:-70px 70%;
+ margin-bottom: 1px;
+}
+
+/* disable status */
+.claro .dijitSelectDisabled {
+ border: 1px solid @disabled-border-color;
+ background-color: @disabled-background-color;
+ background-image: none;
+ color: @disabled-text-color;
+}
+.claro .dijitSelectDisabled .dijitArrowButton {
+ background-color: @disabled-background-color;
+}
+.claro .dijitSelectDisabled .dijitArrowButton .dijitArrowButtonInner {
+ background-position:0 70%
+}
+
+/* Dropdown menu style for select */
+
+.claro .dijitSelectMenu td.dijitMenuItemIconCell,
+.claro .dijitSelectMenu td.dijitMenuArrowCell {
+ /* so that arrow and icon cells from MenuItem are not displayed */
+ display: none;
+}
+.claro .dijitSelectMenu td.dijitMenuItemLabel {
+ /* line up menu text with text in select box (in LTR and RTL modes) */
+ padding: @textbox-padding;
+}
+
+.claro .dijitSelectMenu .dijitMenuSeparatorTop {
+ border-bottom:1px solid @focused-border-color;
+}
diff --git a/lib/dijit/themes/claro/form/Select_rtl.css b/lib/dijit/themes/claro/form/Select_rtl.css
index 43797508f..a14d4ec42 100644
--- a/lib/dijit/themes/claro/form/Select_rtl.css
+++ b/lib/dijit/themes/claro/form/Select_rtl.css
@@ -1,4 +1,4 @@
.claro .dijitSelectRtl .dijitButtonContents {
- border-right-width: 0px;
- border-left-width: 1px;
+ border-right-width: 0;
+ border-left-width: 1px;
}
diff --git a/lib/dijit/themes/claro/form/Select_rtl.less b/lib/dijit/themes/claro/form/Select_rtl.less
new file mode 100644
index 000000000..ffa40dc44
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Select_rtl.less
@@ -0,0 +1,6 @@
+@import "../variables";
+
+.claro .dijitSelectRtl .dijitButtonContents {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
diff --git a/lib/dijit/themes/claro/form/Slider.css b/lib/dijit/themes/claro/form/Slider.css
index 51c2c2313..5694e8c76 100644
--- a/lib/dijit/themes/claro/form/Slider.css
+++ b/lib/dijit/themes/claro/form/Slider.css
@@ -1,204 +1,242 @@
-
+/* Slider
+ *
+ * Styling Slider mainly includes styling the Slider progress bar (dijitSliderProgressBar)
+ *
+ * Slider progress bar:
+ * 1. Slider progress bar (default styling):
+ * .dijitSliderProgressBarH - progress bar at the middle of horizontal slider
+ * .dijitSliderLeftBumper - bar at the left of horizontal slider
+ * .dijitSliderRightBumper - bar at the right of horizontal slider
+ * .dijitSliderProgressBarV - progress bar at the middle of vertical slider
+ * .dijitSliderTopBumper - bar at the top of vertical slider
+ * .dijitSliderBottomtBumper - bar at the bottom of vertical slider
+ *
+ * 2. hovered Slider progress bar (ie, mouse hover on progress bar)
+ * .dijitSliderHover .dijitSliderProgressBarH(horizontal) - hovered bar style: background, border
+ *
+ * 3. focused Slider progress bar (ie, mouse focused on progress bar)
+ * .dijitSliderFocused .dijitSliderProgressBarH(horizontal) - focus bar style: background, border
+ *
+ * 4. disabled/read-only Slider progress bar
+ * .dijitSliderDisabled .dijitSliderProgressBarH(horizontal) - bar styles when slider is disabled
+ *
+ *
+ * Slider Thumbs:
+ * 1. Slider Thumbs (default styling):
+ * .dijitSliderImageHandleH / .dijitSliderImageHandleV - styles for the controller on the progress bar
+ *
+ * 2. hovered Slider Thumbs (ie, mouse hover on slider thumbs)
+ * .dijitSliderHover .dijitSliderImageHandleH - hovered controller style
+ *
+ * 3. focused Slider progress bar (ie, mouse focused on slider thumbs)
+ * .dijitSliderFocused .dijitSliderImageHandleV - focused controller style
+ *
+ *
+ * Slider Increment/Decrement Buttons:
+ * 1. Slider Increment/Decrement Buttons (default styling):
+ * .dijitSliderDecrementIconH - decrement icon which lies at the left of horizontal slider
+ * .dijitSliderIncrementIconH - increment icon which lies at the right of horizontal slider
+ * .dijitSliderDecrementIconV - decrement icon which lies at the bottom of vertical slider
+ * .dijitSliderIncrementIconV - increment icon which lies at the top of vertical slider
+ *
+ * 2. hovered Slider Increment/Decrement Buttons (mouse hover on the icons)
+ * .dijitSliderHover .dijitSliderDecrementIconH - for background, border
+ *
+ * 3. active Slider Increment/Decrement Buttons (mouse down on the icons)
+ * .dijitSliderActive .dijitSliderIncrementIconV - for background, border
+ *
+ * 4. disabled/read-only Slider Increment/Decrement Buttons
+ * .dijitSliderDisabled .dijitSliderDecrementIconH - styles for the icons in disabled slider
+ * .dijitSliderReadOnly .dijitSliderIncrementIconV - styles for the icons in read-only slider
+ */
.claro .dijitSliderBar {
- border-style: solid;
- outline: 1px;
+ border-style: solid;
+ outline: 1px;
}
.claro .dijitSliderFocused .dijitSliderBar {
- border-color: #769dc0;
+ border-color: #769dc0;
}
.claro .dijitSliderHover .dijitSliderBar {
- border-color: #769dc0;
+ border-color: #769dc0;
}
.claro .dijitSliderDisabled .dijitSliderBar {
- background-image: none;
- border-color: #d3d3d3;
+ background-image: none;
+ border-color: #d3d3d3;
}
+/* Horizontal Slider */
.claro .dijitRuleLabelsContainerH {
- padding: 2px 0px;
-}
-.claro .dijitSlider .dijitSliderProgressBarH,
-.claro .dijitSlider .dijitSliderLeftBumper{
- background-image: url("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-repeat:repeat-x;
- background-position:0 -11px;
- border-color: #b5bcc7;
- background-color: #fff;
+ padding: 2px 0;
+}
+.claro .dijitSlider .dijitSliderProgressBarH, .claro .dijitSlider .dijitSliderLeftBumper {
+ background-image: url("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-repeat: repeat-x;
+ background-position: 0 -11px;
+ border-color: #b5bcc7;
+ background-color: #ffffff;
}
.claro .dijitSliderRightBumper {
- border-right: solid 1px #b5bcc7;
+ border-right: solid 1px #b5bcc7;
}
.claro .dijitSliderLeftBumper {
- border-left: solid 1px #b5bcc7;
-}
-.claro .dijitSliderHover .dijitSliderProgressBarH,
-.claro .dijitSliderHover .dijitSliderLeftBumper{
- background-position:0 -20px;
- background-color: #abd6ff;
- border-color: #769dc0;
-}
-.claro .dijitSliderHover .dijitSliderRemainingBarH,
-.claro .dijitSliderHover .dijitSliderRightBumper{
- background-position:0 0px;
- background-color: #fff;
- border-color: #769dc0;
-}
-.claro .dijitSliderFocused .dijitSliderProgressBarH,
-.claro .dijitSliderFocused .dijitSliderLeftBumper{
- background-position:0 -30px;
- background-color: #abd6ff;
- border-color: #769dc0;
-}
-.claro .dijitSliderFocused .dijitSliderRemainingBarH,
-.claro .dijitSliderFocused .dijitSliderRightBumper{
- background-position:0 -9px;
- background-color: #fff;
- border-color: #769dc0;
-}
-.claro .dijitSliderDisabled .dijitSliderProgressBarH,
-.claro .dijitSliderDisabled .dijitSliderLeftBumper{
- background-color: #cdcdcd;
- background-image:none;
-}
-.claro .dijitSliderDisabled .dijitSliderRemainingBarH,
-.claro .dijitSliderDisabled .dijitSliderRightBumper{
- background-color: #efefef;
+ border-left: solid 1px #b5bcc7;
+}
+.claro .dijitSliderHover .dijitSliderProgressBarH, .claro .dijitSliderHover .dijitSliderLeftBumper {
+ background-position: 0 -20px;
+ background-color: #abd6ff;
+ border-color: #769dc0;
+}
+.claro .dijitSliderHover .dijitSliderRemainingBarH, .claro .dijitSliderHover .dijitSliderRightBumper {
+ background-position: 0 0;
+ background-color: #ffffff;
+ border-color: #769dc0;
+}
+.claro .dijitSliderFocused .dijitSliderProgressBarH, .claro .dijitSliderFocused .dijitSliderLeftBumper {
+ background-position: 0 -30px;
+ background-color: #abd6ff;
+ border-color: #769dc0;
+}
+.claro .dijitSliderFocused .dijitSliderRemainingBarH, .claro .dijitSliderFocused .dijitSliderRightBumper {
+ background-position: 0 -9px;
+ background-color: #ffffff;
+ border-color: #769dc0;
+}
+.claro .dijitSliderDisabled .dijitSliderProgressBarH, .claro .dijitSliderDisabled .dijitSliderLeftBumper {
+ background-color: #d3d3d3;
+ /* left side of slider, fill matches border */
+
+ background-image: none;
}
+.claro .dijitSliderDisabled .dijitSliderRemainingBarH, .claro .dijitSliderDisabled .dijitSliderRightBumper {
+ background-color: #efefef;
+}
+/* Vertical Slider */
.claro .dijitRuleLabelsContainerV {
- padding: 0px 2px;
-}
-.claro .dijitSlider .dijitSliderProgressBarV,
-.claro .dijitSlider .dijitSliderBottomBumper{
- background-image: url("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-repeat:repeat-y;
- background-position:-3px 0;
- border-color: #b5bcc7;
- background-color: #fff;
+ padding: 0 2px;
+}
+.claro .dijitSlider .dijitSliderProgressBarV, .claro .dijitSlider .dijitSliderBottomBumper {
+ background-image: url("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-repeat: repeat-y;
+ background-position: -3px 0;
+ border-color: #b5bcc7;
+ background-color: #ffffff;
}
.claro .dijitSliderBottomBumper {
- border-bottom: solid 1px #b5bcc7;
+ border-bottom: solid 1px #b5bcc7;
}
.claro .dijitSliderTopBumper {
- border-top: solid 1px #b5bcc7;
+ border-top: solid 1px #b5bcc7;
}
-.claro .dijitSliderHover .dijitSliderProgressBarV,
-.claro .dijitSliderHover .dijitSliderBottomBumper{
- background-position:-36px 0;
- background-color: #abd6ff;
+.claro .dijitSliderHover .dijitSliderProgressBarV, .claro .dijitSliderHover .dijitSliderBottomBumper {
+ background-position: -36px 0;
+ background-color: #abd6ff;
}
-.claro .dijitSliderHover .dijitSliderRemainingBarV,
-.claro .dijitSliderHover .dijitSliderTopBumper{
- background-position:0 0;
- background-color: #fff;
+.claro .dijitSliderHover .dijitSliderRemainingBarV, .claro .dijitSliderHover .dijitSliderTopBumper {
+ background-position: 0 0;
+ background-color: #ffffff;
}
-.claro .dijitSliderFocused .dijitSliderProgressBarV,
-.claro .dijitSliderFocused .dijitSliderBottomBumper{
- background-position:-56px 0;
- background-color: #abd6ff;
+.claro .dijitSliderFocused .dijitSliderProgressBarV, .claro .dijitSliderFocused .dijitSliderBottomBumper {
+ background-position: -56px 0;
+ background-color: #abd6ff;
}
-.claro .dijitSliderFocused .dijitSliderRemainingBarV,
-.claro .dijitSliderFocused .dijitSliderTopBumper{
- background-position:-18px 0;
- background-color: #fff;
+.claro .dijitSliderFocused .dijitSliderRemainingBarV, .claro .dijitSliderFocused .dijitSliderTopBumper {
+ background-position: -18px 0;
+ background-color: #ffffff;
}
-.claro .dijitSliderDisabled .dijitSliderProgressBarV,
-.claro .dijitSliderDisabled .dijitSliderBottomBumper{
- background-color: #cdcdcd;
+.claro .dijitSliderDisabled .dijitSliderProgressBarV, .claro .dijitSliderDisabled .dijitSliderBottomBumper {
+ background-color: #d3d3d3;
+ /* bottom side of slider, fill matches border */
+
}
-.claro .dijitSliderDisabled .dijitSliderRemainingBarV,
-.claro .dijitSliderDisabled .dijitSliderTopBumper{
- background-color: #efefef;
+.claro .dijitSliderDisabled .dijitSliderRemainingBarV, .claro .dijitSliderDisabled .dijitSliderTopBumper {
+ background-color: #efefef;
}
+/* ------- Thumbs ------- */
.claro .dijitSliderImageHandleH {
- border: 0px;
- width: 18px;
- height: 16px;
- background-image: url("images/sliderThumbs.png");
- background-repeat:no-repeat;
- background-position:0 0;
+ border: 0;
+ width: 18px;
+ height: 16px;
+ background-image: url("images/sliderThumbs.png");
+ background-repeat: no-repeat;
+ background-position: 0 0;
}
.claro .dijitSliderHover .dijitSliderImageHandleH {
- background-position:-18px 0;
+ background-position: -18px 0;
}
.claro .dijitSliderFocused .dijitSliderImageHandleH {
- background-position:-36px 0;
+ background-position: -36px 0;
}
-.claro .dijitSliderProgressBarH .dijitSliderThumbHover{
- background-position:-36px 0;
+.claro .dijitSliderProgressBarH .dijitSliderThumbHover {
+ background-position: -36px 0;
}
-.claro .dijitSliderProgressBarH .dijitSliderThumbActive{
- background-position:-36px 0;
+.claro .dijitSliderProgressBarH .dijitSliderThumbActive {
+ background-position: -36px 0;
}
-.claro .dijitSliderReadOnly .dijitSliderImageHandleH,
-.claro .dijitSliderDisabled .dijitSliderImageHandleH {
- background-position:-54px 0;
+.claro .dijitSliderReadOnly .dijitSliderImageHandleH, .claro .dijitSliderDisabled .dijitSliderImageHandleH {
+ background-position: -54px 0;
}
.claro .dijitSliderImageHandleV {
- border: 0px;
- width: 18px;
- height: 16px;
- background-image: url("images/sliderThumbs.png");
- background-repeat:no-repeat;
- background-position:-289px 0;
+ border: 0;
+ width: 18px;
+ height: 16px;
+ background-image: url("images/sliderThumbs.png");
+ background-repeat: no-repeat;
+ background-position: -289px 0;
}
.claro .dijitSliderHover .dijitSliderImageHandleV {
- background-position:-307px 0;
+ background-position: -307px 0;
}
.claro .dijitSliderFocused .dijitSliderImageHandleV {
- background-position:-325px 0;
+ background-position: -325px 0;
}
-.claro .dijitSliderProgressBarV .dijitSliderThumbHover{
- background-position:-325px 0;
+.claro .dijitSliderProgressBarV .dijitSliderThumbHover {
+ background-position: -325px 0;
}
-.claro .dijitSliderProgressBarV .dijitSliderThumbActive{
- background-position:-325px 0;
+.claro .dijitSliderProgressBarV .dijitSliderThumbActive {
+ background-position: -325px 0;
}
-.claro .dijitSliderReadOnly .dijitSliderImageHandleV,
-.claro .dijitSliderDisabled .dijitSliderImageHandleV {
- background-position:-343px 0;
+.claro .dijitSliderReadOnly .dijitSliderImageHandleV, .claro .dijitSliderDisabled .dijitSliderImageHandleV {
+ background-position: -343px 0;
}
-.claro .dijitSliderButtonContainerH{
- padding: 1px 3px 1px 2px;
+/* ---- Increment/Decrement Buttons ---- */
+.claro .dijitSliderButtonContainerH {
+ padding: 1px 3px 1px 2px;
}
-.claro .dijitSliderButtonContainerV{
- padding: 3px 1px 2px 1px;
+.claro .dijitSliderButtonContainerV {
+ padding: 3px 1px 2px 1px;
}
.claro .dijitSliderDecrementIconH,
.claro .dijitSliderIncrementIconH,
.claro .dijitSliderDecrementIconV,
.claro .dijitSliderIncrementIconV {
- background-image: url('images/commonFormArrows.png');
- background-repeat:no-repeat;
- background-color: #e9ecf2;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border: solid 1px #b5bcc7;
- font-size: 1px;
-}
-.claro .dijitSliderDecrementIconH,
-.claro .dijitSliderIncrementIconH {
- height: 12px;
- width: 9px;
-}
-.claro .dijitSliderDecrementIconV,
-.claro .dijitSliderIncrementIconV {
- height: 9px;
- width: 12px;
+ background-image: url('images/commonFormArrows.png');
+ background-repeat: no-repeat;
+ background-color: #efefef;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ border: solid 1px #b5bcc7;
+ font-size: 1px;
+}
+.claro .dijitSliderDecrementIconH, .claro .dijitSliderIncrementIconH {
+ height: 12px;
+ width: 9px;
+}
+.claro .dijitSliderDecrementIconV, .claro .dijitSliderIncrementIconV {
+ height: 9px;
+ width: 12px;
}
.claro .dijitSliderActive .dijitSliderDecrementIconH,
.claro .dijitSliderActive .dijitSliderIncrementIconH,
@@ -208,79 +246,73 @@
.claro .dijitSliderHover .dijitSliderIncrementIconH,
.claro .dijitSliderHover .dijitSliderDecrementIconV,
.claro .dijitSliderHover .dijitSliderIncrementIconV {
- border: solid 1px #769dc0;
- background-color:#fff;
+ /* dijitSliderActive should be treated as dijitSliderHover since "clicking the slider" has no meaning */
+
+ border: solid 1px #769dc0;
+ background-color: #ffffff;
}
.claro .dijitSliderDecrementIconH {
- background-position:-357px 50%;
+ background-position: -357px 50%;
}
-.claro .dijitSliderActive .dijitSliderDecrementIconH
-.claro .dijitSliderHover .dijitSliderDecrementIconH {
- background-position:-393px 50%;
+.claro .dijitSliderActive .dijitSliderDecrementIconH.claro .dijitSliderHover .dijitSliderDecrementIconH {
+ background-position: -393px 50%;
}
.claro .dijitSliderIncrementIconH {
- background-position:-251px 50%;
+ background-position: -251px 50%;
}
-.claro .dijitSliderActive .dijitSliderIncrementIconH
-.claro .dijitSliderHover .dijitSliderIncrementIconH {
- background-position:-283px 50%;
+.claro .dijitSliderActive .dijitSliderIncrementIconH.claro .dijitSliderHover .dijitSliderIncrementIconH {
+ background-position: -283px 50%;
}
.claro .dijitSliderDecrementIconV {
- background-position:-38px 50%;
+ background-position: -38px 50%;
}
-.claro .dijitSliderActive .dijitSliderDecrementIconV
-.claro .dijitSliderHover .dijitSliderDecrementIconV {
- background-position:-73px 50%;
+.claro .dijitSliderActive .dijitSliderDecrementIconV.claro .dijitSliderHover .dijitSliderDecrementIconV {
+ background-position: -73px 50%;
}
.claro .dijitSliderIncrementIconV {
- background-position:-143px 49%;
+ background-position: -143px 49%;
}
-.claro .dijitSliderActive .dijitSliderIncrementIconV
-.claro .dijitSliderHover .dijitSliderIncrementIconV {
- background-position:-178px 49%;
+.claro .dijitSliderActive .dijitSliderIncrementIconV.claro .dijitSliderHover .dijitSliderIncrementIconV {
+ background-position: -178px 49%;
}
.claro .dijitSliderButtonContainerV .dijitSliderDecrementButtonHover,
.claro .dijitSliderButtonContainerH .dijitSliderDecrementButtonHover,
.claro .dijitSliderButtonContainerV .dijitSliderIncrementButtonHover,
.claro .dijitSliderButtonContainerH .dijitSliderIncrementButtonHover {
- background-color: #cce3fc;
+ background-color: #cfe5fa;
}
.claro .dijitSliderButtonContainerV .dijitSliderDecrementButtonActive,
.claro .dijitSliderButtonContainerH .dijitSliderDecrementButtonActive,
.claro .dijitSliderButtonContainerV .dijitSliderIncrementButtonActive,
.claro .dijitSliderButtonContainerH .dijitSliderIncrementButtonActive {
- background-color: #a5d0fc;
- border-color:#6591b9;
+ background-color: #abd6ff;
+ border-color: #769dc0;
}
.claro .dijitSliderButtonInner {
- visibility: hidden;
+ visibility: hidden;
}
-.claro .dijitSliderDisabled .dijitSliderBar{
- border-color: #d3d3d3;
+.claro .dijitSliderDisabled .dijitSliderBar {
+ border-color: #d3d3d3;
}
-.claro .dijitSliderReadOnly *,.claro .dijitSliderDisabled * {
- border-color: #d3d3d3;
- color: #bdbdbd;
+.claro .dijitSliderReadOnly *, .claro .dijitSliderDisabled * {
+ border-color: #d3d3d3;
+ color: #818181;
}
-.claro .dijitSliderReadOnly .dijitSliderDecrementIconH,
-.claro .dijitSliderDisabled .dijitSliderDecrementIconH {
- background-position:-321px 50%;
- background-color:#e9e9e9;
+.claro .dijitSliderReadOnly .dijitSliderDecrementIconH, .claro .dijitSliderDisabled .dijitSliderDecrementIconH {
+ background-position: -321px 50%;
+ background-color: #efefef;
}
-.claro .dijitSliderReadOnly .dijitSliderIncrementIconH,
-.claro .dijitSliderDisabled .dijitSliderIncrementIconH {
- background-position:-215px 50%;
- background-color:#e9e9e9;
+.claro .dijitSliderReadOnly .dijitSliderIncrementIconH, .claro .dijitSliderDisabled .dijitSliderIncrementIconH {
+ background-position: -215px 50%;
+ background-color: #efefef;
}
-.claro .dijitSliderReadOnly .dijitSliderDecrementIconV,
-.claro .dijitSliderDisabled .dijitSliderDecrementIconV {
- background-position:-3px 49%;
- background-color:#e9e9e9;
+.claro .dijitSliderReadOnly .dijitSliderDecrementIconV, .claro .dijitSliderDisabled .dijitSliderDecrementIconV {
+ background-position: -3px 49%;
+ background-color: #efefef;
}
-.claro .dijitSliderReadOnly .dijitSliderIncrementIconV,
-.claro .dijitSliderDisabled .dijitSliderIncrementIconV {
- background-position:-107px 49%;
- background-color:#e9e9e9;
+.claro .dijitSliderReadOnly .dijitSliderIncrementIconV, .claro .dijitSliderDisabled .dijitSliderIncrementIconV {
+ background-position: -107px 49%;
+ background-color: #efefef;
}
.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarH,
.dj_ie6 .claro .dijitSlider .dijitSliderLeftBumper,
@@ -290,5 +322,5 @@
.dj_ie6 .claro .dijitSlider .dijitSliderTopBumper,
.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarV,
.dj_ie6 .claro .dijitSlider .dijitSliderBottomBumper {
- background-image:none;
+ background-image: none;
}
diff --git a/lib/dijit/themes/claro/form/Slider.less b/lib/dijit/themes/claro/form/Slider.less
new file mode 100644
index 000000000..82451b506
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Slider.less
@@ -0,0 +1,362 @@
+/* Slider
+ *
+ * Styling Slider mainly includes styling the Slider progress bar (dijitSliderProgressBar)
+ *
+ * Slider progress bar:
+ * 1. Slider progress bar (default styling):
+ * .dijitSliderProgressBarH - progress bar at the middle of horizontal slider
+ * .dijitSliderLeftBumper - bar at the left of horizontal slider
+ * .dijitSliderRightBumper - bar at the right of horizontal slider
+ * .dijitSliderProgressBarV - progress bar at the middle of vertical slider
+ * .dijitSliderTopBumper - bar at the top of vertical slider
+ * .dijitSliderBottomtBumper - bar at the bottom of vertical slider
+ *
+ * 2. hovered Slider progress bar (ie, mouse hover on progress bar)
+ * .dijitSliderHover .dijitSliderProgressBarH(horizontal) - hovered bar style: background, border
+ *
+ * 3. focused Slider progress bar (ie, mouse focused on progress bar)
+ * .dijitSliderFocused .dijitSliderProgressBarH(horizontal) - focus bar style: background, border
+ *
+ * 4. disabled/read-only Slider progress bar
+ * .dijitSliderDisabled .dijitSliderProgressBarH(horizontal) - bar styles when slider is disabled
+ *
+ *
+ * Slider Thumbs:
+ * 1. Slider Thumbs (default styling):
+ * .dijitSliderImageHandleH / .dijitSliderImageHandleV - styles for the controller on the progress bar
+ *
+ * 2. hovered Slider Thumbs (ie, mouse hover on slider thumbs)
+ * .dijitSliderHover .dijitSliderImageHandleH - hovered controller style
+ *
+ * 3. focused Slider progress bar (ie, mouse focused on slider thumbs)
+ * .dijitSliderFocused .dijitSliderImageHandleV - focused controller style
+ *
+ *
+ * Slider Increment/Decrement Buttons:
+ * 1. Slider Increment/Decrement Buttons (default styling):
+ * .dijitSliderDecrementIconH - decrement icon which lies at the left of horizontal slider
+ * .dijitSliderIncrementIconH - increment icon which lies at the right of horizontal slider
+ * .dijitSliderDecrementIconV - decrement icon which lies at the bottom of vertical slider
+ * .dijitSliderIncrementIconV - increment icon which lies at the top of vertical slider
+ *
+ * 2. hovered Slider Increment/Decrement Buttons (mouse hover on the icons)
+ * .dijitSliderHover .dijitSliderDecrementIconH - for background, border
+ *
+ * 3. active Slider Increment/Decrement Buttons (mouse down on the icons)
+ * .dijitSliderActive .dijitSliderIncrementIconV - for background, border
+ *
+ * 4. disabled/read-only Slider Increment/Decrement Buttons
+ * .dijitSliderDisabled .dijitSliderDecrementIconH - styles for the icons in disabled slider
+ * .dijitSliderReadOnly .dijitSliderIncrementIconV - styles for the icons in read-only slider
+ */
+
+@import "../variables";
+
+.claro .dijitSliderBar {
+ border-style: solid;
+ outline: 1px;
+}
+.claro .dijitSliderFocused .dijitSliderBar {
+ border-color: @focused-border-color;
+}
+.claro .dijitSliderHover .dijitSliderBar {
+ border-color: @hovered-border-color;
+}
+.claro .dijitSliderDisabled .dijitSliderBar {
+ background-image: none;
+ border-color: @disabled-border-color;
+}
+
+/* Horizontal Slider */
+
+.claro .dijitRuleLabelsContainerH {
+ padding: 2px 0;
+}
+.claro .dijitSlider .dijitSliderProgressBarH,
+.claro .dijitSlider .dijitSliderLeftBumper{
+ background-image: url("images/sliderHorizontal.png");
+ background-repeat:repeat-x;
+ background-position:0 -20px;
+ border-color: @border-color;
+ background-color: @slider-fullbar-background-color;
+}
+.claro .dijitSlider .dijitSliderRemainingBarH,
+.claro .dijitSlider .dijitSliderRightBumper{
+ background-image: url("images/sliderHorizontal.png");
+ background-repeat:repeat-x;
+ background-position:0 -11px;
+ border-color: @border-color;
+ background-color: @slider-remainingbar-background-color;
+}
+.claro .dijitSliderRightBumper {
+ border-right: solid 1px @border-color;
+}
+.claro .dijitSliderLeftBumper {
+ border-left: solid 1px @border-color;
+}
+.claro .dijitSliderHover .dijitSliderProgressBarH,
+.claro .dijitSliderHover .dijitSliderLeftBumper{
+ background-position:0 -20px;
+ background-color: @slider-hovered-fullbar-background-color;
+ border-color: @hovered-border-color;
+}
+.claro .dijitSliderHover .dijitSliderRemainingBarH,
+.claro .dijitSliderHover .dijitSliderRightBumper{
+ background-position:0 0;
+ background-color: @slider-hovered-remainingbar-background-color;
+ border-color: @hovered-border-color;
+}
+.claro .dijitSliderFocused .dijitSliderProgressBarH,
+.claro .dijitSliderFocused .dijitSliderLeftBumper{
+ background-position:0 -30px;
+ background-color: @slider-focused-fullbar-background-color;
+ border-color: @focused-border-color;
+}
+.claro .dijitSliderFocused .dijitSliderRemainingBarH,
+.claro .dijitSliderFocused .dijitSliderRightBumper{
+ background-position:0 -9px;
+ background-color: @slider-focused-remainingbar-background-color;
+ border-color: @focused-border-color;
+}
+.claro .dijitSliderDisabled .dijitSliderProgressBarH,
+.claro .dijitSliderDisabled .dijitSliderLeftBumper{
+ background-color: @disabled-border-color; /* left side of slider, fill matches border */
+ background-image:none;
+}
+.claro .dijitSliderDisabled .dijitSliderRemainingBarH,
+.claro .dijitSliderDisabled .dijitSliderRightBumper{
+ background-color: @disabled-background-color;
+}
+
+/* Vertical Slider */
+
+.claro .dijitRuleLabelsContainerV {
+ padding: 0 2px;
+}
+.claro .dijitSlider .dijitSliderProgressBarV,
+.claro .dijitSlider .dijitSliderBottomBumper{
+ background-image: url("images/sliderVertical.png");
+ background-repeat:repeat-y;
+ background-position:-36px 0;
+ border-color: @border-color;
+ background-color: @slider-fullbar-background-color;
+}
+.claro .dijitSlider .dijitSliderRemainingBarV,
+.claro .dijitSlider .dijitSliderTopBumper{
+ background-image: url("images/sliderVertical.png");
+ background-repeat:repeat-y;
+ background-position:-3px 0;
+ border-color: @border-color;
+ background-color: @slider-remainingbar-background-color;
+}
+.claro .dijitSliderBottomBumper {
+ border-bottom: solid 1px @border-color;
+}
+.claro .dijitSliderTopBumper {
+ border-top: solid 1px @border-color;
+}
+.claro .dijitSliderHover .dijitSliderProgressBarV,
+.claro .dijitSliderHover .dijitSliderBottomBumper{
+ background-position:-36px 0;
+ background-color: @slider-hovered-fullbar-background-color;
+}
+.claro .dijitSliderHover .dijitSliderRemainingBarV,
+.claro .dijitSliderHover .dijitSliderTopBumper{
+ background-position:0 0;
+ background-color: @slider-hovered-remainingbar-background-color;
+}
+.claro .dijitSliderFocused .dijitSliderProgressBarV,
+.claro .dijitSliderFocused .dijitSliderBottomBumper{
+ background-position:-56px 0;
+ background-color: @slider-focused-fullbar-background-color;
+}
+.claro .dijitSliderFocused .dijitSliderRemainingBarV,
+.claro .dijitSliderFocused .dijitSliderTopBumper{
+ background-position:-18px 0;
+ background-color: @slider-focused-remainingbar-background-color;
+}
+.claro .dijitSliderDisabled .dijitSliderProgressBarV,
+.claro .dijitSliderDisabled .dijitSliderBottomBumper{
+ background-color: @disabled-border-color; /* bottom side of slider, fill matches border */
+}
+.claro .dijitSliderDisabled .dijitSliderRemainingBarV,
+.claro .dijitSliderDisabled .dijitSliderTopBumper{
+ background-color: @disabled-background-color;
+}
+
+
+/* ------- Thumbs ------- */
+
+.claro .dijitSliderImageHandleH {
+ border: 0;
+ width: 18px;
+ height: 16px;
+ background-image: url("images/sliderThumbs.png");
+ background-repeat:no-repeat;
+ background-position:0 0;
+}
+.claro .dijitSliderHover .dijitSliderImageHandleH {
+ background-position:-18px 0;
+}
+.claro .dijitSliderFocused .dijitSliderImageHandleH {
+ background-position:-36px 0;
+}
+.claro .dijitSliderProgressBarH .dijitSliderThumbHover{
+ background-position:-36px 0;
+}
+.claro .dijitSliderProgressBarH .dijitSliderThumbActive{
+ background-position:-36px 0;
+}
+.claro .dijitSliderReadOnly .dijitSliderImageHandleH,
+.claro .dijitSliderDisabled .dijitSliderImageHandleH {
+ background-position:-54px 0;
+}
+.claro .dijitSliderImageHandleV {
+ border: 0;
+ width: 18px;
+ height: 16px;
+ background-image: url("images/sliderThumbs.png");
+ background-repeat:no-repeat;
+ background-position:-289px 0;
+}
+.claro .dijitSliderHover .dijitSliderImageHandleV {
+ background-position:-307px 0;
+}
+.claro .dijitSliderFocused .dijitSliderImageHandleV {
+ background-position:-325px 0;
+}
+.claro .dijitSliderProgressBarV .dijitSliderThumbHover{
+ background-position:-325px 0;
+}
+.claro .dijitSliderProgressBarV .dijitSliderThumbActive{
+ background-position:-325px 0;
+}
+.claro .dijitSliderReadOnly .dijitSliderImageHandleV,
+.claro .dijitSliderDisabled .dijitSliderImageHandleV {
+ background-position:-343px 0;
+}
+
+/* ---- Increment/Decrement Buttons ---- */
+
+.claro .dijitSliderButtonContainerH{
+ padding: 1px 3px 1px 2px;
+}
+.claro .dijitSliderButtonContainerV{
+ padding: 3px 1px 2px 1px;
+}
+.claro .dijitSliderDecrementIconH,
+.claro .dijitSliderIncrementIconH,
+.claro .dijitSliderDecrementIconV,
+.claro .dijitSliderIncrementIconV {
+ background-image: url('images/commonFormArrows.png');
+ background-repeat:no-repeat;
+ background-color: @arrowbutton-background-color;
+ .border-radius(2px);
+ border: solid 1px @border-color;
+ font-size: 1px;
+}
+.claro .dijitSliderDecrementIconH,
+.claro .dijitSliderIncrementIconH {
+ height: 12px;
+ width: 9px;
+}
+.claro .dijitSliderDecrementIconV,
+.claro .dijitSliderIncrementIconV {
+ height: 9px;
+ width: 12px;
+}
+.claro .dijitSliderActive .dijitSliderDecrementIconH,
+.claro .dijitSliderActive .dijitSliderIncrementIconH,
+.claro .dijitSliderActive .dijitSliderDecrementIconV,
+.claro .dijitSliderActive .dijitSliderIncrementIconV,
+.claro .dijitSliderHover .dijitSliderDecrementIconH,
+.claro .dijitSliderHover .dijitSliderIncrementIconH,
+.claro .dijitSliderHover .dijitSliderDecrementIconV,
+.claro .dijitSliderHover .dijitSliderIncrementIconV {
+ /* dijitSliderActive should be treated as dijitSliderHover since "clicking the slider" has no meaning */
+ border: solid 1px @hovered-border-color;
+ background-color: @slider-hoveredButton-background-color;
+}
+
+.claro .dijitSliderDecrementIconH {
+ background-position:-357px 50%;
+}
+.claro .dijitSliderActive .dijitSliderDecrementIconH
+.claro .dijitSliderHover .dijitSliderDecrementIconH {
+ background-position:-393px 50%;
+}
+.claro .dijitSliderIncrementIconH {
+ background-position:-251px 50%;
+}
+.claro .dijitSliderActive .dijitSliderIncrementIconH
+.claro .dijitSliderHover .dijitSliderIncrementIconH {
+ background-position:-283px 50%;
+}
+.claro .dijitSliderDecrementIconV {
+ background-position:-38px 50%;
+}
+.claro .dijitSliderActive .dijitSliderDecrementIconV
+.claro .dijitSliderHover .dijitSliderDecrementIconV {
+ background-position:-73px 50%;
+}
+.claro .dijitSliderIncrementIconV {
+ background-position:-143px 49%;
+}
+.claro .dijitSliderActive .dijitSliderIncrementIconV
+.claro .dijitSliderHover .dijitSliderIncrementIconV {
+ background-position:-178px 49%;
+}
+.claro .dijitSliderButtonContainerV .dijitSliderDecrementButtonHover,
+.claro .dijitSliderButtonContainerH .dijitSliderDecrementButtonHover,
+.claro .dijitSliderButtonContainerV .dijitSliderIncrementButtonHover,
+.claro .dijitSliderButtonContainerH .dijitSliderIncrementButtonHover {
+ background-color: @slider-button-hovered-background-color;
+}
+.claro .dijitSliderButtonContainerV .dijitSliderDecrementButtonActive,
+.claro .dijitSliderButtonContainerH .dijitSliderDecrementButtonActive,
+.claro .dijitSliderButtonContainerV .dijitSliderIncrementButtonActive,
+.claro .dijitSliderButtonContainerH .dijitSliderIncrementButtonActive {
+ background-color: @slider-button-pressed-background-color;
+ border-color:@pressed-border-color;
+}
+.claro .dijitSliderButtonInner {
+ visibility: hidden;
+}
+.claro .dijitSliderDisabled .dijitSliderBar{
+ border-color: @disabled-border-color;
+}
+.claro .dijitSliderReadOnly *,.claro .dijitSliderDisabled * {
+ border-color: @disabled-border-color;
+ color: @disabled-text-color;
+}
+.claro .dijitSliderReadOnly .dijitSliderDecrementIconH,
+.claro .dijitSliderDisabled .dijitSliderDecrementIconH {
+ background-position:-321px 50%;
+ background-color:@disabled-background-color;
+}
+.claro .dijitSliderReadOnly .dijitSliderIncrementIconH,
+.claro .dijitSliderDisabled .dijitSliderIncrementIconH {
+ background-position:-215px 50%;
+ background-color:@disabled-background-color;
+}
+.claro .dijitSliderReadOnly .dijitSliderDecrementIconV,
+.claro .dijitSliderDisabled .dijitSliderDecrementIconV {
+ background-position:-3px 49%;
+ background-color:@disabled-background-color;
+}
+.claro .dijitSliderReadOnly .dijitSliderIncrementIconV,
+.claro .dijitSliderDisabled .dijitSliderIncrementIconV {
+ background-position:-107px 49%;
+ background-color:@disabled-background-color;
+}
+
+.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarH,
+.dj_ie6 .claro .dijitSlider .dijitSliderLeftBumper,
+.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarH,
+.dj_ie6 .claro .dijitSlider .dijitSliderRightBumper,
+.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarV,
+.dj_ie6 .claro .dijitSlider .dijitSliderTopBumper,
+.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarV,
+.dj_ie6 .claro .dijitSlider .dijitSliderBottomBumper {
+ background-image:none;
+}
diff --git a/lib/dijit/themes/claro/form/Slider_rtl.css b/lib/dijit/themes/claro/form/Slider_rtl.css
index ebff4268d..97e078b9f 100644
--- a/lib/dijit/themes/claro/form/Slider_rtl.css
+++ b/lib/dijit/themes/claro/form/Slider_rtl.css
@@ -3,24 +3,22 @@
.claro .dijitSliderRtl .dijitSliderLeftBumper,
.claro .dijitSliderRtl .dijitSliderRightBumper,
.claro .dijitSliderRtl .dijitSliderTopBumper {
- background-position: top right;
+ background-position: top right;
}
-.claro .dijitSliderRtl .dijitSliderProgressBarV,
-.claro .dijitSliderRtl .dijitSliderRemainingBarV,
-.claro .dijitSliderRtl .dijitSliderBottomBumper {
- background-position: bottom right;
+.claro .dijitSliderRtl .dijitSliderProgressBarV, .claro .dijitSliderRtl .dijitSliderRemainingBarV, .claro .dijitSliderRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
}
.claro .dijitSliderRtl .dijitSliderLeftBumper {
- border-left-width: 0px;
- border-right-width: 1px;
+ border-left-width: 0;
+ border-right-width: 1px;
}
.claro .dijitSliderRtl .dijitSliderRightBumper {
- border-left-width: 1px;
- border-right-width: 0px;
+ border-left-width: 1px;
+ border-right-width: 0;
}
.claro .dijitSliderRtl .dijitSliderIncrementIconH {
- background-position:-357px 50%;
+ background-position: -357px 50%;
}
.claro .dijitSliderRtl .dijitSliderDecrementIconH {
- background-position:-251px 50%;
+ background-position: -251px 50%;
}
diff --git a/lib/dijit/themes/claro/form/Slider_rtl.less b/lib/dijit/themes/claro/form/Slider_rtl.less
new file mode 100644
index 000000000..66a711668
--- /dev/null
+++ b/lib/dijit/themes/claro/form/Slider_rtl.less
@@ -0,0 +1,33 @@
+@import "../variables";
+
+.claro .dijitSliderRtl .dijitSliderProgressBarH,
+.claro .dijitSliderRtl .dijitSliderRemainingBarH,
+.claro .dijitSliderRtl .dijitSliderLeftBumper,
+.claro .dijitSliderRtl .dijitSliderRightBumper,
+.claro .dijitSliderRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+
+.claro .dijitSliderRtl .dijitSliderProgressBarV,
+.claro .dijitSliderRtl .dijitSliderRemainingBarV,
+.claro .dijitSliderRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+
+.claro .dijitSliderRtl .dijitSliderLeftBumper {
+ border-left-width: 0;
+ border-right-width: 1px;
+}
+
+.claro .dijitSliderRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0;
+}
+
+.claro .dijitSliderRtl .dijitSliderIncrementIconH {
+ background-position:-357px 50%;
+}
+
+.claro .dijitSliderRtl .dijitSliderDecrementIconH {
+ background-position:-251px 50%;
+}
diff --git a/lib/dijit/themes/claro/images/loading.gif b/lib/dijit/themes/claro/images/loading.gif
deleted file mode 100644
index 6e7c8e5ec..000000000
--- a/lib/dijit/themes/claro/images/loading.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/images/tooltip.png b/lib/dijit/themes/claro/images/tooltip.png
index aca14988a..2b222739c 100644
--- a/lib/dijit/themes/claro/images/tooltip.png
+++ b/lib/dijit/themes/claro/images/tooltip.png
Binary files differ
diff --git a/lib/dijit/themes/claro/images/tooltipGradient.png b/lib/dijit/themes/claro/images/tooltipGradient.png
new file mode 100644
index 000000000..ce4860e79
--- /dev/null
+++ b/lib/dijit/themes/claro/images/tooltipGradient.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/AccordionContainer.css b/lib/dijit/themes/claro/layout/AccordionContainer.css
index 77b8bd967..f76947959 100644
--- a/lib/dijit/themes/claro/layout/AccordionContainer.css
+++ b/lib/dijit/themes/claro/layout/AccordionContainer.css
@@ -1,65 +1,124 @@
-
+/* Accordion
+ *
+ * Styling AccordionContainer basically means styling the accordion pane (dijitAccordionInnerContainer)
+ * and the title inside of it (dijitAccordionTitle). There are 4 basic states to style:
+ *
+ * 1. closed pane (and default styling):
+ * .dijitAccordionInnerContainer - container for each accordion child
+ * .dijitAccordionTitle - title for each accordion child
+ *
+ * 2. active closed pane (ie, mouse down on a title bar)
+ * .dijitAccordionInnerContainerActive - for background-color, border
+ * .dijitAccordionInnerContainerActive dijitAccordionTitle - for text color
+ *
+ * 3. open pane (expanded child)
+ * .dijitAccordionChildWrapper - wraps around the child widget (typically ContentPane)
+ * setting a margin so that there's blue trim all the way around the child
+ *
+ * These rules need to override the closed pane active:
+ *
+ * .dijitAccordionInnerContainerSelected - for background-color, border
+ * .dijitAccordionInnerContainerSelected .dijitAccordionTitle - for text color
+ *
+ * 4. hovered pane, open or closed
+ * The selectors below affect hovering over both a closed pane (ie, hovering a title bar),
+ * and hovering over an open pane. Also, treat mouse down on an open pane as a hover:
+ *
+ * .dijitAccordionInnerContainerHover, .dijitAccordionInnerContainerSelectedActive - for background-color, border
+ * .dijitAccordionInnerContainerHover .dijitAccordionTitle - for text color
+ */
.claro .dijitAccordionContainer {
- border:none;
+ border: none;
}
.claro .dijitAccordionInnerContainer {
- background-color: #e6e6e7;
- border:solid 1px #b5bcc7;
- margin-bottom:1px;
- -webkit-transition-property:background-color,border;
- -webkit-transition-duration:.3s;
- -webkit-transition-timing-function:linear;
+ background-color: #efefef;
+ /* gray, for closed pane */
+
+ border: solid 1px #b5bcc7;
+ margin-bottom: 1px;
+ -webkit-transition-property: background-color, border;
+ -moz-transition-property: background-color, border;
+ transition-property: background-color, border;
+ -webkit-transition-duration: 0.3s;
+ -moz-transition-duration: 0.3s;
+ transition-duration: 0.3s;
+ -webkit-transition-timing-function: linear;
+ -moz-transition-timing-function: linear;
+ transition-timing-function: linear;
}
.claro .dijitAccordionTitle {
- background-color: transparent;
- background-image: url("images/accordion.png");
- background-position:0px 0px;
- background-repeat:repeat-x;
- padding: 5px 7px 2px 7px;
- min-height:17px;
- color:#4a4a4a;
+ background-color: transparent;
+ /* pick up color from dijitAccordionInnerContainer */
+
+ background-image: url("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;
}
.dj_ie6 .claro .dijitAccordionTitle {
- background-image: none;
+ background-image: none;
+}
+.claro .dijitAccordionContainer .dijitAccordionChildWrapper {
+ /* this extends the blue trim styling of the title bar to wrapping around the node.
+ * done by setting margin
+ */
+
+ background-color: #ffffff;
+ border: 1px solid #769dc0;
+ margin: 0 2px 2px;
}
.claro .dijitAccordionContainer .dijitAccordionContainer-child {
- background-color:#fff;
-
- border:1px solid #92bce1 !important;
- margin: 0px 2px 2px;
- padding: 9px;
+ /* this is affecting the child widget itself */
+
+ padding: 9px;
}
+/* Active state for closed pane */
.claro .dijitAccordionInnerContainerActive {
- border:1px solid #769DC0;
- background-color:#7dbefa;
- -webkit-transition-duration:.1s;
+ border: 1px solid #769dc0;
+ background-color: #7dbefa;
+ -webkit-transition-duration: 0.1s;
+ -moz-transition-duration: 0.1s;
+ transition-duration: 0.1s;
}
.claro .dijitAccordionInnerContainerActive .dijitAccordionTitle {
- background-position:0px -136px;
- color:#000;
+ background-position: 0 -136px;
+ color: #000000;
}
+/* Open (a.k.a. selected) pane */
.claro .dijitAccordionInnerContainerSelected {
- border-color:#92bce1;
- background-color: #cde8ff;
+ border-color: #769dc0;
+ background-color: #cfe5fa;
}
.claro .dijitAccordionInnerContainerSelected .dijitAccordionTitle {
- color:#000;
- background-position: 0 0;
+ color: #000000;
+ background-position: 0 0;
+ /* avoid effect when clicking the title of the open pane */
+
}
+/* Hovering open or closed pane */
.claro .dijitAccordionInnerContainerHover dijitAccordionTitle {
-
- color:#000;
+ /* both open and closed */
+
+ color: #000000;
}
-.claro .dijitAccordionInnerContainerHover,
-.claro .dijitAccordionInnerContainerSelectedActive {
- border:1px solid #769DC0;
- background-color:#9dcfff;
- -webkit-transition-duration:.2s;
+.claro .dijitAccordionInnerContainerHover, .claro .dijitAccordionInnerContainerSelectedActive {
+ /* note: clicking the currently selected Accordion pane should have no effect, so treating same as hover. */
+
+ border: 1px solid #769dc0;
+ background-color: #abd6ff;
+ -webkit-transition-duration: 0.2s;
+ -moz-transition-duration: 0.2s;
+ transition-duration: 0.2s;
}
-.claro .dijitAccordionInnerContainerSelectedHover .dijitAccordionContainer-child,
-.claro .dijitAccordionInnerContainerSelectedActive .dijitAccordionContainer-child {
- background-color:#ffffff;
- border:1px solid #769DC0 !important;
- -webkit-box-shadow:inset 0px 0px 3px rgba(0, 0, 0, .25);
- -moz-box-shadow:inset 0px 0px 3px rgba(0, 0, 0, .25);
+.claro .dijitAccordionInnerContainerSelectedHover .dijitAccordionChildWrapper, .claro .dijitAccordionInnerContainerSelectedActive .dijitAccordionChildWrapper {
+ background-color: #ffffff;
+ border: 1px solid #769dc0 !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
new file mode 100644
index 000000000..01f4427f4
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/AccordionContainer.less
@@ -0,0 +1,116 @@
+/* Accordion
+ *
+ * Styling AccordionContainer basically means styling the accordion pane (dijitAccordionInnerContainer)
+ * and the title inside of it (dijitAccordionTitle). There are 4 basic states to style:
+ *
+ * 1. closed pane (and default styling):
+ * .dijitAccordionInnerContainer - container for each accordion child
+ * .dijitAccordionTitle - title for each accordion child
+ *
+ * 2. active closed pane (ie, mouse down on a title bar)
+ * .dijitAccordionInnerContainerActive - for background-color, border
+ * .dijitAccordionInnerContainerActive dijitAccordionTitle - for text color
+ *
+ * 3. open pane (expanded child)
+ * .dijitAccordionChildWrapper - wraps around the child widget (typically ContentPane)
+ * setting a margin so that there's blue trim all the way around the child
+ *
+ * These rules need to override the closed pane active:
+ *
+ * .dijitAccordionInnerContainerSelected - for background-color, border
+ * .dijitAccordionInnerContainerSelected .dijitAccordionTitle - for text color
+ *
+ * 4. hovered pane, open or closed
+ * The selectors below affect hovering over both a closed pane (ie, hovering a title bar),
+ * and hovering over an open pane. Also, treat mouse down on an open pane as a hover:
+ *
+ * .dijitAccordionInnerContainerHover, .dijitAccordionInnerContainerSelectedActive - for background-color, border
+ * .dijitAccordionInnerContainerHover .dijitAccordionTitle - for text color
+ */
+
+@import "../variables";
+
+.claro .dijitAccordionContainer {
+ border:none;
+}
+.claro .dijitAccordionInnerContainer {
+ background-color: @unselected-background-color; /* gray, for closed pane */
+ border:solid 1px @border-color;
+ margin-bottom:1px;
+ .transition-property(background-color,border);
+ .transition-duration(.3s);
+ .transition-timing-function(linear);
+}
+.claro .dijitAccordionTitle {
+ background-color: transparent; /* pick up color from dijitAccordionInnerContainer */
+ background-image: url("images/accordion.png");
+ 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;
+}
+.claro .dijitAccordionContainer .dijitAccordionChildWrapper {
+ /* this extends the blue trim styling of the title bar to wrapping around the node.
+ * done by setting margin
+ */
+ background-color:@pane-background-color;
+ border:1px solid @selected-border-color;
+ margin: 0 2px 2px;
+}
+
+.claro .dijitAccordionContainer .dijitAccordionContainer-child {
+ /* this is affecting the child widget itself */
+ padding: 9px;
+}
+
+/* Active state for closed pane */
+
+.claro .dijitAccordionInnerContainerActive {
+ border:1px solid @selected-border-color;
+ background-color:@pressed-background-color;
+ .transition-duration(.1s);
+}
+.claro .dijitAccordionInnerContainerActive .dijitAccordionTitle {
+ background-position:0 -136px;
+ color:@selected-text-color;
+}
+
+/* Open (a.k.a. selected) pane */
+
+.claro .dijitAccordionInnerContainerSelected {
+ border-color:@selected-border-color;
+ background-color: @selected-background-color;
+}
+.claro .dijitAccordionInnerContainerSelected .dijitAccordionTitle {
+ color:@selected-text-color;
+ background-position: 0 0; /* avoid effect when clicking the title of the open pane */
+}
+
+/* Hovering open or closed pane */
+
+.claro .dijitAccordionInnerContainerHover dijitAccordionTitle {
+ /* both open and closed */
+ color:@hovered-text-color;
+}
+
+.claro .dijitAccordionInnerContainerHover,
+.claro .dijitAccordionInnerContainerSelectedActive {
+ /* note: clicking the currently selected Accordion pane should have no effect, so treating same as hover. */
+ border:1px solid @hovered-border-color;
+ background-color:@hovered-background-color;
+ .transition-duration(.2s);
+}
+
+.claro .dijitAccordionInnerContainerSelectedHover .dijitAccordionChildWrapper,
+.claro .dijitAccordionInnerContainerSelectedActive .dijitAccordionChildWrapper {
+ background-color:@pane-background-color;
+ border:1px solid @hovered-border-color !important;
+ .box-shadow(inset 0 0 3px rgba(0, 0, 0, .25));
+}
diff --git a/lib/dijit/themes/claro/layout/BorderContainer.css b/lib/dijit/themes/claro/layout/BorderContainer.css
index 333a45890..ede2a56c5 100644
--- a/lib/dijit/themes/claro/layout/BorderContainer.css
+++ b/lib/dijit/themes/claro/layout/BorderContainer.css
@@ -1,77 +1,109 @@
+/* BorderContainer
+Splitters and gutters separate panes within a BorderContainer. Splitters can be moved up and down (horizonal splitters) or left and right (vertical splitters), while Gutters are static. A "thumb" is the slit on a Splitter that indicates it is movable.
+
+Styling the BorderContainer widget consists of the following:
+
+.dijitBorderContainer - for border and padding of the entire border container
+
+.dijitSplitContainer-child, .dijitBorderContainer-child - for border or child panes of the border container. By default borders are put on all children of BorderContainer.
+
+.dijitBorderContainer-dijitTabContainerTop,
+.dijitBorderContainer-dijitTabContainerBottom,
+.dijitBorderContainer-dijitTabContainerLeft,
+.dijitBorderContainer-dijitTabContainerRight,
+.dijitBorderContainer-dijitAccordionContainer -for border of the border containers within TabContainer or AccordionContainer widget
+
+.dijitBorderContainer-dijitBorderContainer - for border and padding of nested BorderContainers
+
+Splitters and gutters:
+
+.dijitSplitterH, .dijitGutterH - for height, background, and border of a horizontal splitter and gutter
+.dijitSplitterH .dijitSplitterThumb - for color, height/width of the thumb on a horizontal splitter
+.dijitSplitterV, .dijitGutterV - - for height, background, and border of a vertical splitter and gutter
+.dijitSplitterV .dijitSplitterThumb - for color, height/width of the thumb on a vertical splitter
+.dijitSplitterHHover - for background-color of a hovered horizontal splitter
+.dijitSplitterHHover .dijitSplitterThumb - for background-color of a hovered thumb on a horizontal splitter
+.dijitSplitterVHover - for background-color of a hovered vertical splitter
+.dijitSplitterVHover .dijitSplitterThumb - for background-color of a hovered thumb on a vertical splitter
+.dijitSplitterHActive - for background-color of an active horizontal splitter
+.dijitSplitterVActive - for background-color of an active horizontal splitter
+*/
.claro .dijitBorderContainer {
- border: 1px #b5bcc7 solid;
- padding: 5px;
+ /* matches the width of the splitters between panes */
+
+ padding: 5px;
}
-.claro .dijitSplitContainer-child,
-.claro .dijitBorderContainer-child {
-
- border: 1px #b5bcc7 solid;
+.claro .dijitSplitContainer-child, .claro .dijitBorderContainer-child {
+ /* By default put borders on all children of BorderContainer,
+ * to give illusion of borders on the splitters themselves.
+ */
+
+ border: 1px #b5bcc7 solid;
}
.claro .dijitBorderContainer-dijitTabContainerTop,
.claro .dijitBorderContainer-dijitTabContainerBottom,
.claro .dijitBorderContainer-dijitTabContainerLeft,
.claro .dijitBorderContainer-dijitTabContainerRight,
.claro .dijitBorderContainer-dijitAccordionContainer {
-
- border: none;
+ /* except that TabContainer defines borders on it's sub-nodes (tablist and dijitTabPaneWrapper),
+ * so override rule setting border on domNode
+ */
+
+ border: none;
}
.claro .dijitBorderContainer-dijitBorderContainer {
-
- border: 1px #c0ccdf solid;
- padding: 5px;
+ /* make nested BorderContainers look like a single big widget with lots of splitters */
+
+ border: 0;
+ padding: 0;
}
-.claro .dijitSplitterH,
-.claro .dijitGutterH {
- background:none;
- border:0;
- height:5px;
+/* Splitters and gutters */
+.claro .dijitSplitterH, .claro .dijitGutterH {
+ background: none;
+ border: 0;
+ height: 5px;
}
.claro .dijitSplitterH .dijitSplitterThumb {
- background:#dde2e9 none;
- height:1px;
- top:2px;
- width:19px;
+ background: #b5bcc7 none;
+ height: 1px;
+ top: 2px;
+ width: 19px;
}
-.claro .dijitSplitterV,
-.claro .dijitGutterV {
- background:none;
- border:0;
- width:5px;
- margin: 0;
+.claro .dijitSplitterV, .claro .dijitGutterV {
+ background: none;
+ border: 0;
+ width: 5px;
+ margin: 0;
}
.claro .dijitSplitterV .dijitSplitterThumb {
- background:#dde2e9 none;
- height:19px;
- left:2px;
- width:1px;
- margin: 0;
+ background: #b5bcc7 none;
+ height: 19px;
+ left: 2px;
+ width: 1px;
+ margin: 0;
}
+/* hovered splitter */
.claro .dijitSplitterHHover {
- font-size: 1px;
- background: url("images/splitterHorizontalHover.png") no-repeat center top;
+ font-size: 1px;
+ background: url("images/splitterHorizontalHover.png") no-repeat center top;
}
.claro .dijitSplitterHHover .dijitSplitterThumb {
- background:#769dc0 none;
+ background: #769dc0 none;
}
.claro .dijitSplitterVHover {
- font-size: 1px;
- background: url("images/splitterVerticalHover.png") no-repeat center left;
+ font-size: 1px;
+ background: url("images/splitterVerticalHover.png") no-repeat center left;
}
.claro .dijitSplitterVHover .dijitSplitterThumb {
- background:#769dc0 none;
-}
-.dj_ie6 .dijitSplitterHHover,
-.dj_ie6 .claro .dijitSplitterVHover {
- background-color:#cfe9ff;
- background-image:none;
+ background: #769dc0 none;
}
-.claro .dijitSplitterHActive {
- font-size: 1px;
- background-color:#abd4fb;
- border-top:blue;
+.dj_ie6 .dijitSplitterHHover, .dj_ie6 .claro .dijitSplitterVHover {
+ background-color: #cfe5fa;
+ background-image: none;
}
-.claro .dijitSplitterVActive {
- font-size: 1px;
- background-color:#abd4fb;
+/* active splitter */
+.claro .dijitSplitterHActive, .claro .dijitSplitterVActive {
+ font-size: 1px;
+ background-color: #abd6ff;
}
diff --git a/lib/dijit/themes/claro/layout/BorderContainer.less b/lib/dijit/themes/claro/layout/BorderContainer.less
new file mode 100644
index 000000000..17c4b63cb
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/BorderContainer.less
@@ -0,0 +1,128 @@
+/* BorderContainer
+
+Splitters and gutters separate panes within a BorderContainer. Splitters can be moved up and down (horizonal splitters) or left and right (vertical splitters), while Gutters are static. A "thumb" is the slit on a Splitter that indicates it is movable.
+
+Styling the BorderContainer widget consists of the following:
+
+.dijitBorderContainer - for border and padding of the entire border container
+
+.dijitSplitContainer-child, .dijitBorderContainer-child - for border or child panes of the border container. By default borders are put on all children of BorderContainer.
+
+.dijitBorderContainer-dijitTabContainerTop,
+.dijitBorderContainer-dijitTabContainerBottom,
+.dijitBorderContainer-dijitTabContainerLeft,
+.dijitBorderContainer-dijitTabContainerRight,
+.dijitBorderContainer-dijitAccordionContainer -for border of the border containers within TabContainer or AccordionContainer widget
+
+.dijitBorderContainer-dijitBorderContainer - for border and padding of nested BorderContainers
+
+Splitters and gutters:
+
+.dijitSplitterH, .dijitGutterH - for height, background, and border of a horizontal splitter and gutter
+.dijitSplitterH .dijitSplitterThumb - for color, height/width of the thumb on a horizontal splitter
+.dijitSplitterV, .dijitGutterV - - for height, background, and border of a vertical splitter and gutter
+.dijitSplitterV .dijitSplitterThumb - for color, height/width of the thumb on a vertical splitter
+.dijitSplitterHHover - for background-color of a hovered horizontal splitter
+.dijitSplitterHHover .dijitSplitterThumb - for background-color of a hovered thumb on a horizontal splitter
+.dijitSplitterVHover - for background-color of a hovered vertical splitter
+.dijitSplitterVHover .dijitSplitterThumb - for background-color of a hovered thumb on a vertical splitter
+.dijitSplitterHActive - for background-color of an active horizontal splitter
+.dijitSplitterVActive - for background-color of an active horizontal splitter
+*/
+
+@import "../variables";
+
+.claro .dijitBorderContainer {
+ /* matches the width of the splitters between panes */
+ padding: 5px;
+}
+
+.claro .dijitSplitContainer-child,
+.claro .dijitBorderContainer-child {
+ /* By default put borders on all children of BorderContainer,
+ * to give illusion of borders on the splitters themselves.
+ */
+ border: 1px @border-color solid;
+}
+
+.claro .dijitBorderContainer-dijitTabContainerTop,
+.claro .dijitBorderContainer-dijitTabContainerBottom,
+.claro .dijitBorderContainer-dijitTabContainerLeft,
+.claro .dijitBorderContainer-dijitTabContainerRight,
+.claro .dijitBorderContainer-dijitAccordionContainer {
+ /* except that TabContainer defines borders on it's sub-nodes (tablist and dijitTabPaneWrapper),
+ * so override rule setting border on domNode
+ */
+ border: none;
+
+}
+.claro .dijitBorderContainer-dijitBorderContainer {
+ /* make nested BorderContainers look like a single big widget with lots of splitters */
+ border: 0;
+ padding: 0;
+}
+
+/* Splitters and gutters */
+
+.claro .dijitSplitterH,
+.claro .dijitGutterH {
+ background:none;
+ border:0;
+ height:5px;
+}
+
+.claro .dijitSplitterH .dijitSplitterThumb {
+ background:@border-color none;
+ height:1px;
+ top:2px;
+ width:19px;
+}
+
+.claro .dijitSplitterV,
+.claro .dijitGutterV {
+ background:none;
+ border:0;
+ width:5px;
+ margin: 0;
+}
+
+.claro .dijitSplitterV .dijitSplitterThumb {
+ background:@border-color none;
+ height:19px;
+ left:2px;
+ width:1px;
+ margin: 0;
+}
+
+/* hovered splitter */
+.claro .dijitSplitterHHover {
+ font-size: 1px;
+ background: url("images/splitterHorizontalHover.png") no-repeat center top;
+}
+
+
+.claro .dijitSplitterHHover .dijitSplitterThumb {
+ background:@hovered-border-color none;
+}
+
+.claro .dijitSplitterVHover {
+ font-size: 1px;
+ background: url("images/splitterVerticalHover.png") no-repeat center left;
+}
+
+.claro .dijitSplitterVHover .dijitSplitterThumb {
+ background:@hovered-border-color none;
+}
+
+.dj_ie6 .dijitSplitterHHover,
+.dj_ie6 .claro .dijitSplitterVHover {
+ background-color: @splitter-hovered-background-color;
+ background-image:none;
+}
+
+/* active splitter */
+.claro .dijitSplitterHActive,
+.claro .dijitSplitterVActive {
+ font-size: 1px;
+ background-color:@splitter-dragged-background-color;
+}
diff --git a/lib/dijit/themes/claro/layout/ContentPane.css b/lib/dijit/themes/claro/layout/ContentPane.css
index f9f543cd1..a7753de1d 100644
--- a/lib/dijit/themes/claro/layout/ContentPane.css
+++ b/lib/dijit/themes/claro/layout/ContentPane.css
@@ -1,17 +1,38 @@
-
+/* ContentPane
+ *
+ * .dijitContentPane
+ * set padding for basic content pane
+ *
+ * Nested layouts:
+ *
+ * .dijitTabContainerTop-dijitContentPane,
+ * .dijitTabContainerLeft-dijitContentPane,
+ * .dijitTabContainerBottom-dijitContentPane,
+ * .dijitTabContainerRight-dijitContentPane
+ * set background-color and padding of ContentPanes nested within TabContainer (can do top, left, bottom, or right) or Accordion Container
+ *
+ * .dijitAccordionContainer-dijitContentPane
+ * set background-color and padding of ContentPane nested within Accordion
+ *
+ * .dijitSplitContainer-dijitContentPane,
+ * set background-color and padding of ContentPane nested within a SplitContainer
+ *
+ * .dijitBorderContainer-dijitContentPane
+ * set background-color and padding of ContentPane nested within a BorderContainer
+ */
.claro .dijitContentPane {
- padding: 8px;
-}
+ padding: 8px;
+}
+/* nested layouts */
.claro .dijitTabContainerTop-dijitContentPane,
.claro .dijitTabContainerLeft-dijitContentPane,
.claro .dijitTabContainerBottom-dijitContentPane,
.claro .dijitTabContainerRight-dijitContentPane,
.claro .dijitAccordionContainer-dijitContentPane {
- background-color: #fff;
- padding: 8px;
+ background-color: #ffffff;
+ padding: 8px;
}
-.claro .dijitSplitContainer-dijitContentPane,
-.claro .dijitBorderContainer-dijitContentPane {
- background-color: #fff;
- padding: 8px;
+.claro .dijitSplitContainer-dijitContentPane, .claro .dijitBorderContainer-dijitContentPane {
+ background-color: #ffffff;
+ padding: 8px;
}
diff --git a/lib/dijit/themes/claro/layout/ContentPane.less b/lib/dijit/themes/claro/layout/ContentPane.less
new file mode 100644
index 000000000..83329bdb7
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/ContentPane.less
@@ -0,0 +1,43 @@
+/* ContentPane
+ *
+ * .dijitContentPane
+ * set padding for basic content pane
+ *
+ * Nested layouts:
+ *
+ * .dijitTabContainerTop-dijitContentPane,
+ * .dijitTabContainerLeft-dijitContentPane,
+ * .dijitTabContainerBottom-dijitContentPane,
+ * .dijitTabContainerRight-dijitContentPane
+ * set background-color and padding of ContentPanes nested within TabContainer (can do top, left, bottom, or right) or Accordion Container
+ *
+ * .dijitAccordionContainer-dijitContentPane
+ * set background-color and padding of ContentPane nested within Accordion
+ *
+ * .dijitSplitContainer-dijitContentPane,
+ * set background-color and padding of ContentPane nested within a SplitContainer
+ *
+ * .dijitBorderContainer-dijitContentPane
+ * set background-color and padding of ContentPane nested within a BorderContainer
+ */
+
+@import "../variables";
+
+.claro .dijitContentPane {
+ padding: 8px;
+}
+
+/* nested layouts */
+.claro .dijitTabContainerTop-dijitContentPane,
+.claro .dijitTabContainerLeft-dijitContentPane,
+.claro .dijitTabContainerBottom-dijitContentPane,
+.claro .dijitTabContainerRight-dijitContentPane,
+.claro .dijitAccordionContainer-dijitContentPane {
+ background-color: @pane-background-color;
+ padding: 8px;
+}
+.claro .dijitSplitContainer-dijitContentPane,
+.claro .dijitBorderContainer-dijitContentPane {
+ background-color: @pane-background-color;
+ padding: 8px;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/claro/layout/TabContainer.css b/lib/dijit/themes/claro/layout/TabContainer.css
index 95fe2c262..030e4b761 100644
--- a/lib/dijit/themes/claro/layout/TabContainer.css
+++ b/lib/dijit/themes/claro/layout/TabContainer.css
@@ -1,348 +1,434 @@
-
+/* TabContainer
+ *
+ * Styling TabContainer means styling the TabList and Its content container (dijitTitlePane)
+ *
+ * Tab List: (including 4 kinds of tab location)
+ * .dijitTabContainerTop-tabs - tablist container at top
+ * .dijitTabContainerBottom-tabs - tablist container at bottom
+ * .dijitTabContainerLeft-tabs - tablist container at left
+ * .dijitTabContainerRight-tabs - tablist container at right
+ *
+ * Tab Strip Button:
+ * .dijitTabStripIcon - tab strip button icon
+ * .dijitTabStripMenuIcon - down arrow icon position
+ * .dijitTabStripSlideLeftIcon - left arrow icon position
+ * .dijitTabStripSlideRightIcon - right arrow icon position
+ *
+ * .tabStripButtonDisabled - styles for disabled tab strip buttons
+ *
+ * Tab Button:
+ * .dijitTabContainerTop-tabs .dijitTabInnerDiv/.dijitTabContent - styles for top tab button container
+ * .dijitTabContainerBottom-tabs .dijitTabInnerDiv/.dijitTabContent - styles for bottom tab button container
+ * .dijitTabContainerLeft-tabs .dijitTabInnerDiv/.dijitTabContent - styles for left tab button container
+ * .dijitTabContainerRight-tabs .dijitTabInnerDiv/.dijitTabContent - styles for right tab button container
+ *
+ * .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv/.dijitTabContent
+ * - styles for selected status of top tab button
+ * same to Bottom, Left, Right Tabs
+ *
+ * .dijitTabHover .dijitTabInnerDiv - styles when mouse hover on tab buttons
+ * .dijitTabActive .dijitTabInnerDiv - styles when mouse down on tab buttons
+ * .dijitTabChecked .dijitTabInnerDiv - styles when on buttons of selected tab
+ *
+ * .dijitTabCloseButton - the close action buttons lie at the right top of each tab button on closable tabs
+ * .dijitTabCloseButtonHover - styles when mouse hover on close action button
+ * .dijitTabCloseButtonActive - styles when mouse down on close action button
+ *
+ * Tab Button: (checked status)
+ *
+ * Tab Content Container:
+ * .dijitTabContainerTop-dijitContentPane
+ * .dijitTabContainerBottom-dijitContentPane
+ * .dijitTabContainerLeft-dijitContentPane
+ * .dijitTabContainerRight-dijitContentPane - for background and padding
+ *
+ * Nested Tabs:
+ * .dijitTabContainerNested - Container for nested tabs
+ * .dijitTabContainerTabListNested - tab list container for nested tabs
+ */
+/*** some common features ***/
.claro .dijitTabPaneWrapper {
- background:#fff;
+ background: #ffffff;
}
.claro .dijitTabPaneWrapper,
.claro .dijitTabContainerTop-tabs,
.claro .dijitTabContainerBottom-tabs,
.claro .dijitTabContainerLeft-tabs,
.claro .dijitTabContainerRight-tabs {
-
- border-color: #b5bcc7;
+ /* todo: add common class name for this div */
+
+ border-color: #b5bcc7;
}
.claro .dijitTabCloseButton {
- background: url("images/tabClose.png") no-repeat;
- width: 14px;
- height: 14px;
- margin-left: 5px;
- margin-right:-3px;
+ background: url("images/tabClose.png") no-repeat;
+ width: 14px;
+ height: 14px;
+ margin-left: 5px;
+ margin-right: -5px;
}
.claro .dijitTabCloseButtonHover {
- background-position:-14px;
+ background-position: -14px;
}
.claro .dijitTabCloseButtonActive {
- background-position:-28px;
+ background-position: -28px;
}
.claro .dijitTabSpacer {
-
- display: none;
+ /* set the spacer invisible. note that height:0 doesn't work on IE/quirks, it's still 10px. */
+
+ display: none;
}
.claro .dijitTabInnerDiv {
- background-color:#e6e6e7;
- -webkit-transition-property:background-color, border;
- -webkit-transition-duration:.35s;
- color:#4a4a4a;
+ background-color: #efefef;
+ -webkit-transition-property: background-color, border;
+ -moz-transition-property: background-color, border;
+ transition-property: background-color, border;
+ -webkit-transition-duration: 0.35s;
+ -moz-transition-duration: 0.35s;
+ transition-duration: 0.35s;
+ color: #4a4a4a;
}
.claro .dijitTabHover .dijitTabInnerDiv {
- background-color:#a9d6ff;
- -webkit-transition-duration:.25s;
- color:#000;
+ background-color: #abd6ff;
+ -webkit-transition-duration: 0.25s;
+ -moz-transition-duration: 0.25s;
+ transition-duration: 0.25s;
+ color: #000000;
}
.claro .dijitTabActive .dijitTabInnerDiv {
- background-color:#8bc4f9;
- color:#000;
- -webkit-transition-duration:.1s;
+ background-color: #7dbefa;
+ color: #000000;
+ -webkit-transition-duration: 0.1s;
+ -moz-transition-duration: 0.1s;
+ transition-duration: 0.1s;
}
.claro .dijitTabChecked .dijitTabInnerDiv {
- background-color:#b2d4f3;
- color:#000;
+ background-color: #cfe5fa;
+ color: #000000;
}
.claro .dijitTabContent {
- border: 1px solid #b5bcc7;
+ border: 1px solid #b5bcc7;
+}
+.claro .dijitTabHover .dijitTabContent {
+ border-color: #769dc0;
}
-.claro .dijitTabHover .dijitTabContent,
.claro .dijitTabActive .dijitTabContent {
- border-color: #769dc0;
+ border-color: #769dc0;
}
.claro .dijitTabChecked .dijitTabContent {
- color:#000;
- border-color: #b5bcc7;
+ color: #000000;
+ border-color: #b5bcc7;
}
.claro .tabStripButton .dijitTabInnerDiv {
- background-color: transparent;
+ background-color: transparent;
}
.claro .tabStripButton .dijitTabContent {
- border: none;
+ border: none;
}
+/*** end common ***/
+/*************** top tab ***************/
.claro .dijitTabContainerTop-tabs .dijitTab {
- top: 1px;
- margin-right: 1px;
- padding-top: 3px;
+ top: 1px;
+ /* used for overlap */
+
+ margin-right: 1px;
+ padding-top: 3px;
}
.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTab {
- top: 3px;
+ top: 3px;
}
+/* for top tab padding. change height when status changes */
.claro .dijitTabContainerTop-tabs .dijitTabContent {
- padding:3px 8px 3px 4px;
- border-bottom: 1px;
- background-image:url("images/tabTop.png");
- background-position:0px 0px;
- background-repeat:repeat-x;
- min-width: 60px;
- text-align: center;
+ padding: 3px 6px;
+ border-bottom-width: 0;
+ background-image: url("images/tabTop.png");
+ background-position: 0 0;
+ background-repeat: repeat-x;
+ min-width: 60px;
+ text-align: center;
}
.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- padding-bottom: 4px;
- padding-top: 6px;
-}
-.dj_ie .claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- border-bottom: none;
+ padding-bottom: 4px;
+ padding-top: 6px;
}
+/* normal status */
.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv {
- background-image:url("images/tabTop.png");
- background-position:0px -248px;
- background-position:bottom;
- background-repeat:repeat-x;
- box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.04);
- -webkit-box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.04);
- -moz-box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.04);
-}
+ background-image: url("images/tabTop.png");
+ background-position: 0 -248px;
+ background-position: bottom;
+ background-repeat: repeat-x;
+ -webkit-box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
+ -moz-box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
+ box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
+}
+/* checked status */
.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-image:none;
- box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.05);
- -webkit-box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.05);
+ background-image: none;
+ -webkit-box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
}
.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- background-position:0px -102px;
- background-repeat:repeat-x;
+ background-position: 0 -102px;
+ background-repeat: repeat-x;
}
+/** end top tab **/
+/*************** bottom tab ***************/
.claro .dijitTabContainerBottom-tabs .dijitTab {
- top: -1px;
- margin-right: 1px;
+ top: -1px;
+ /* used for overlap */
+
+ margin-right: 1px;
}
+/* calculate the position and size */
.claro .dijitTabContainerBottom-tabs .dijitTabContent {
- padding:3px 8px 4px 4px;
- border-top: none;
- background-image: url("images/tabBottom.png");
- background-position:0px -249px;
- background-repeat: repeat-x;
- background-position:bottom;
- min-width: 60px;
- text-align: center;
+ padding: 3px 6px;
+ border-top-width: 0;
+ background-image: url("images/tabBottom.png");
+ background-position: 0 -249px;
+ background-repeat: repeat-x;
+ background-position: bottom;
+ min-width: 60px;
+ text-align: center;
}
.claro .dijitTabContainerBottom-tabs .dijitTab {
- padding-bottom: 3px;
+ padding-bottom: 3px;
}
+/* normal status */
.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background-image: url("images/tabBottom.png");
- background-position: top;
- background-repeat: repeat-x;
- box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.04);
- -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.04);
- -moz-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.04);
-
-}
+ background-image: url("images/tabBottom.png");
+ background-position: top;
+ background-repeat: repeat-x;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
+ -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
+}
+/* checked status */
.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabContent {
- padding-bottom: 7px;
- padding-top: 4px;
- background-position:0px -119px;
+ padding-bottom: 7px;
+ padding-top: 4px;
+ background-position: 0 -119px;
}
.claro .dijitTabContainerBottom-tabs .dijitTabChecked {
- padding-bottom: 0;
+ padding-bottom: 0;
}
.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-image:none;
- box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05);
- -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05);
+ background-image: none;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}
+/** end bottom tab **/
+/*************** left tab ***************/
.claro .dijitTabContainerLeft-tabs .dijitTab {
- left: 1px;
- margin-bottom: 1px;
+ border-right-width: 0;
+ left: 1px;
+ /* used for overlap */
+
+ margin-bottom: 1px;
}
+/* normal status */
.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background-image: url("images/tabLeft.png");
- background-position: -347px -340px;
- background-repeat: repeat-y;
+ background-image: url("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-repeat: repeat-y;
- background-position:0px 0px;
+ padding: 3px 8px 4px 4px;
+ background-image: url("images/tabLeft.png");
+ background-repeat: repeat-y;
+ background-position: 0 0;
}
+/* checked status */
.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabContent {
- padding-right: 9px;
- border-right: none;
- background-image: none;
+ padding-right: 9px;
+ border-right: none;
+ background-image: none;
}
.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-position:0px -179px;
- background-repeat:repeat-y;
- box-shadow: -1px 0px 2px rgba(0, 0, 0, .05);
- -webkit-box-shadow: -1px 0px 2px rgba(0, 0, 0, .05);
- -moz-box-shadow: -1px 0px 2px rgba(0, 0, 0, 0.05);
-}
+ background-position: 0 -179px;
+ background-repeat: repeat-y;
+ -webkit-box-shadow: -1px 0 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: -1px 0 2px rgba(0, 0, 0, 0.05);
+ box-shadow: -1px 0 2px rgba(0, 0, 0, 0.05);
+}
+/** end left tab **/
+/*************** right tab ***************/
.claro .dijitTabContainerRight-tabs .dijitTab {
- left: -1px;
- margin-bottom: 1px;
+ border-left-width: 0;
+ left: -1px;
+ /* used for overlap */
+
+ margin-bottom: 1px;
}
+/* normal status */
.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv {
- background-image: url("images/tabRight.png");
- background-repeat: repeat-y;
- background-position: -1px -347px;
+ background-image: url("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-position:right top;
- background-repeat: repeat-y;
+ padding: 3px 8px 4px 4px;
+ background-image: url("images/tabRight.png");
+ background-position: right top;
+ background-repeat: repeat-y;
}
+/* checked status */
.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabContent {
- padding-left: 5px;
- border-left: none;
- background-image: none;
+ padding-left: 5px;
+ border-left: none;
+ background-image: none;
}
.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-position:-348px -179px;
- box-shadow: 1px 0px 2px rgba(0, 0, 0, 0.07);
- -webkit-box-shadow: 1px 0px 2px rgba(0, 0, 0, 0.07);
- -moz-box-shadow: 1px 0px 2px rgba(0, 0, 0, 0.07);
-}
-.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerTop-tabs .dijitTabContent {
- border-radius: 2px 2px 0px 0px;
- -moz-border-radius: 2px 2px 0px 0px;
- -webkit-border-top-left-radius:2px;
- -webkit-border-top-right-radius:2px;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerBottom-tabs .dijitTabContent{
- border-radius: 0px 0px 2px 2px;
- -moz-border-radius: 0px 0px 2px 2px;
- -webkit-border-bottom-right-radius:2px;
- -webkit-border-bottom-left-radius:2px;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerLeft-tabs .dijitTabContent{
- border-radius: 2px 0px 0px 2px;
- -moz-border-radius: 2px 0px 0px 2px;
- -webkit-border-top-left-radius:2px;
- -webkit-border-bottom-left-radius:2px;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerRight-tabs .dijitTabContent{
- border-radius: 0px 2px 2px 0px;
- -moz-border-radius: 0px 2px 2px 0px;
- -webkit-border-top-right-radius:2px;
- -webkit-border-bottom-right-radius:2px;
-}
+ background-position: -348px -179px;
+ -webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.07);
+ -moz-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.07);
+ box-shadow: 1px 0 2px rgba(0, 0, 0, 0.07);
+}
+/** end right tab **/
+/** round corner **/
+.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv, .claro .dijitTabContainerTop-tabs .dijitTabContent {
+ -moz-border-radius: 2px 2px 0 0;
+ border-radius: 2px 2px 0 0;
+}
+.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv, .claro .dijitTabContainerBottom-tabs .dijitTabContent {
+ -moz-border-radius: 0 0 2px 2px;
+ border-radius: 0 0 2px 2px;
+}
+.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv, .claro .dijitTabContainerLeft-tabs .dijitTabContent {
+ -moz-border-radius: 2px 0 0 2px;
+ border-radius: 2px 0 0 2px;
+}
+.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv, .claro .dijitTabContainerRight-tabs .dijitTabContent {
+ -moz-border-radius: 0 2px 2px 0;
+ border-radius: 0 2px 2px 0;
+}
+/************ left/right scroll buttons + menu button ************/
.claro .tabStripButton {
- background-color:#deecf9;
- border: 1px solid #b5bcc7;
+ background-color: #e9f4fe;
+ border: 1px solid #b5bcc7;
}
.claro .dijitTabListContainer-top .tabStripButton {
- padding: 4px 3px;
- margin-top:7px;
- background-image: url("images/tabTop.png");
- background-position:0px 0px;
+ padding: 4px 3px;
+ margin-top: 7px;
+ background-image: url("images/tabTop.png");
+ background-position: 0 0;
}
.claro .dijitTabListContainer-bottom .tabStripButton {
- padding:5px 3px;
- margin-bottom:4px;
- background-image: url("images/tabTop.png");
- background-position:0px -248px;
- background-position:bottom;
+ padding: 5px 3px;
+ margin-bottom: 4px;
+ background-image: url("images/tabTop.png");
+ background-position: 0 -248px;
+ background-position: bottom;
}
.claro .tabStripButtonHover {
- background-color:#a6d2fb;
+ background-color: #abd6ff;
}
.claro .tabStripButtonActive {
- background-color:#7dbefa;
+ background-color: #7dbefa;
}
.claro .dijitTabStripIcon {
- height:15px;
- width:15px;
- margin: 0 auto;
- background:url("../form/images/buttonArrows.png") no-repeat -75px 50%;
- background-color: transparent;
+ height: 15px;
+ width: 15px;
+ margin: 0 auto;
+ background: url("../form/images/buttonArrows.png") no-repeat -75px 50%;
+ background-color: transparent;
}
-.claro .dijitTabStripSlideRightIcon{
- background-position: -24px 50%;
+.claro .dijitTabStripSlideRightIcon {
+ background-position: -24px 50%;
}
.claro .dijitTabStripMenuIcon {
- background-position: -51px 50%;
+ background-position: -51px 50%;
}
-.claro .dijitTabListContainer-top .tabStripButtonDisabled,
-.claro .dijitTabListContainer-bottom .tabStripButtonDisabled {
- background-color:#dddddd;
- border:1px solid #c9c9c9;
+/*disabled styles for tab strip buttons*/
+.claro .dijitTabListContainer-top .tabStripButtonDisabled, .claro .dijitTabListContainer-bottom .tabStripButtonDisabled {
+ background-color: #d3d3d3;
+ border: 1px solid #b5bcc7;
+ /* to match border of TabContainer itself */
+
}
.claro .tabStripButtonDisabled .dijitTabStripSlideLeftIcon {
- background-position:-175px 50%;
+ background-position: -175px 50%;
}
.claro .tabStripButtonDisabled .dijitTabStripSlideRightIcon {
- background-position: -124px 50%;
+ background-position: -124px 50%;
}
.claro .tabStripButtonDisabled .dijitTabStripMenuIcon {
- background-position: -151px 50%;
-}
+ background-position: -151px 50%;
+}
+/* Nested Tabs */
.claro .dijitTabContainerNested .dijitTabListWrapper {
- height: auto;
+ height: auto;
}
.claro .dijitTabContainerNested .dijitTabContainerTop-tabs {
- border-bottom:solid 1px #b5bcc7;
- padding:1px 2px 4px;
- margin-top:-2px;
+ border-bottom: solid 1px #b5bcc7;
+ padding: 1px 2px 4px;
+ margin-top: -2px;
}
.claro .dijitTabContainerTabListNested .dijitTabContent {
- background:rgba(255, 255, 255, 0) none repeat scroll 0 0;
- border: none;
- padding: 4px;
- border-color: rgba(118,157,192,0);
- -webkit-transition-property:background-color, border-color;
- -webkit-transition-duration:.3s;
+ background: rgba(255, 255, 255, 0) none repeat scroll 0 0;
+ border: none;
+ padding: 4px;
+ border-color: rgba(118, 157, 192, 0);
+ -webkit-transition-property: background-color, border-color;
+ -moz-transition-property: background-color, border-color;
+ transition-property: background-color, border-color;
+ -webkit-transition-duration: 0.3s;
+ -moz-transition-duration: 0.3s;
+ transition-duration: 0.3s;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
}
.claro .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv {
-
- background: none;
- border: none;
- top: 0px;
- box-shadow: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
+ /* 4 element selector to override box-shadow setting from above rule:
+ * .claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv { ... }
+ */
+
+ background: none;
+ border: none;
+ top: 0;
+ /* to override top: 1px/-1px for normal tabs */
+
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
}
.claro .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent {
- background-color:#eaf4fc;
- border-radius: 2px 2px 2px 2px;
- -moz-border-radius: 2px 2px 2px 2px;
- -webkit-border-radius:2px;
- border:solid 1px #c8dff3;
- padding: 3px;
- webkit-transition-duration:.2s;
+ background-color: #e9f4fe;
+ border: solid 1px #cfe5fa;
+ padding: 3px;
+ -webkit-transition-duration: 0.2s;
+ -moz-transition-duration: 0.2s;
+ transition-duration: 0.2s;
}
.claro .dijitTabContainerTabListNested .dijitTabHover .tabLabel {
- text-decoration: none;
+ text-decoration: none;
}
.claro .dijitTabContainerTabListNested .dijitTabActive .dijitTabContent {
- border-radius: 2px 2px 2px 2px;
- -moz-border-radius: 2px 2px 2px 2px;
- -webkit-border-radius:2px;
- border:solid 1px #a8c7e2;
- padding: 3px;
- background:#b9d9f5 url("images/tabNested.png") repeat-x;
- -webkit-transition-duration:.1s;
+ border: solid 1px #769dc0;
+ padding: 3px;
+ background: #abd6ff url("images/tabNested.png") repeat-x;
+ -webkit-transition-duration: 0.1s;
+ -moz-transition-duration: 0.1s;
+ transition-duration: 0.1s;
}
.claro .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent {
- border-radius: 2px 2px 2px 2px;
- -moz-border-radius: 2px 2px 2px 2px;
- -webkit-border-radius:2px;
- padding: 3px;
- border:solid 1px #a8c7e2;
- background-position: 0px 105px;
- background-color:#d4e8f9;
+ padding: 3px;
+ border: solid 1px #769dc0;
+ background-position: 0 105px;
+ background-color: #cfe5fa;
}
.claro .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
- text-decoration: none;
- background-image:none;
+ text-decoration: none;
+ background-image: none;
}
.claro .dijitTabPaneWrapperNested {
- border: none;
+ border: none;
+ /* prevent double border */
+
}
.dj_ie6 .claro .dijitTabContent,
.dj_ie6 .claro .dijitTabInnerDiv,
.dj_ie6 .dijitTabListContainer-top .tabStripButton,
-.dj_ie6 .dijitTabListContainer-bottom .tabStripButton{
- background-image: none;
+.dj_ie6 .dijitTabListContainer-bottom .tabStripButton {
+ background-image: none;
}
diff --git a/lib/dijit/themes/claro/layout/TabContainer.less b/lib/dijit/themes/claro/layout/TabContainer.less
new file mode 100644
index 000000000..691900eba
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/TabContainer.less
@@ -0,0 +1,408 @@
+/* TabContainer
+ *
+ * Styling TabContainer means styling the TabList and Its content container (dijitTitlePane)
+ *
+ * Tab List: (including 4 kinds of tab location)
+ * .dijitTabContainerTop-tabs - tablist container at top
+ * .dijitTabContainerBottom-tabs - tablist container at bottom
+ * .dijitTabContainerLeft-tabs - tablist container at left
+ * .dijitTabContainerRight-tabs - tablist container at right
+ *
+ * Tab Strip Button:
+ * .dijitTabStripIcon - tab strip button icon
+ * .dijitTabStripMenuIcon - down arrow icon position
+ * .dijitTabStripSlideLeftIcon - left arrow icon position
+ * .dijitTabStripSlideRightIcon - right arrow icon position
+ *
+ * .tabStripButtonDisabled - styles for disabled tab strip buttons
+ *
+ * Tab Button:
+ * .dijitTabContainerTop-tabs .dijitTabInnerDiv/.dijitTabContent - styles for top tab button container
+ * .dijitTabContainerBottom-tabs .dijitTabInnerDiv/.dijitTabContent - styles for bottom tab button container
+ * .dijitTabContainerLeft-tabs .dijitTabInnerDiv/.dijitTabContent - styles for left tab button container
+ * .dijitTabContainerRight-tabs .dijitTabInnerDiv/.dijitTabContent - styles for right tab button container
+ *
+ * .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv/.dijitTabContent
+ * - styles for selected status of top tab button
+ * same to Bottom, Left, Right Tabs
+ *
+ * .dijitTabHover .dijitTabInnerDiv - styles when mouse hover on tab buttons
+ * .dijitTabActive .dijitTabInnerDiv - styles when mouse down on tab buttons
+ * .dijitTabChecked .dijitTabInnerDiv - styles when on buttons of selected tab
+ *
+ * .dijitTabCloseButton - the close action buttons lie at the right top of each tab button on closable tabs
+ * .dijitTabCloseButtonHover - styles when mouse hover on close action button
+ * .dijitTabCloseButtonActive - styles when mouse down on close action button
+ *
+ * Tab Button: (checked status)
+ *
+ * Tab Content Container:
+ * .dijitTabContainerTop-dijitContentPane
+ * .dijitTabContainerBottom-dijitContentPane
+ * .dijitTabContainerLeft-dijitContentPane
+ * .dijitTabContainerRight-dijitContentPane - for background and padding
+ *
+ * Nested Tabs:
+ * .dijitTabContainerNested - Container for nested tabs
+ * .dijitTabContainerTabListNested - tab list container for nested tabs
+ */
+
+@import "../variables";
+
+/*** some common features ***/
+.claro .dijitTabPaneWrapper {
+ background:@pane-background-color;
+}
+.claro .dijitTabPaneWrapper,
+.claro .dijitTabContainerTop-tabs,
+.claro .dijitTabContainerBottom-tabs,
+.claro .dijitTabContainerLeft-tabs,
+.claro .dijitTabContainerRight-tabs {
+ /* todo: add common class name for this div */
+ border-color: @border-color;
+}
+.claro .dijitTabCloseButton {
+ background: url("images/tabClose.png") no-repeat;
+ width: 14px;
+ height: 14px;
+ margin-left: 5px;
+ margin-right:-5px;
+}
+.claro .dijitTabCloseButtonHover {
+ background-position:-14px;
+}
+.claro .dijitTabCloseButtonActive {
+ background-position:-28px;
+}
+.claro .dijitTabSpacer {
+ /* set the spacer invisible. note that height:0 doesn't work on IE/quirks, it's still 10px. */
+ display: none;
+}
+.claro .dijitTabInnerDiv {
+ background-color:@unselected-background-color;
+ .transition-property(background-color, border);
+ .transition-duration(.35s);
+ color:@unselected-text-color;
+}
+.claro .dijitTabHover .dijitTabInnerDiv {
+ background-color:@hovered-background-color;
+ .transition-duration(.25s);
+ color:@hovered-text-color;
+}
+.claro .dijitTabActive .dijitTabInnerDiv {
+ background-color:@pressed-background-color;
+ color:@selected-text-color;
+ .transition-duration(.1s);
+}
+.claro .dijitTabChecked .dijitTabInnerDiv {
+ background-color:@selected-background-color;
+ color:@selected-text-color;
+}
+
+.claro .dijitTabContent {
+ border: 1px solid @border-color;
+}
+.claro .dijitTabHover .dijitTabContent {
+ border-color: @hovered-border-color;
+}
+.claro .dijitTabActive .dijitTabContent {
+ border-color: @pressed-border-color;
+}
+.claro .dijitTabChecked .dijitTabContent {
+ color:@selected-text-color; // todo: redundant with .claro .dijitTabChecked .dijitTabInnerDiv above?
+ border-color: @border-color; // don't use @selected-border-color because need to match border of TabContainer
+}
+
+.claro .tabStripButton .dijitTabInnerDiv {
+ background-color: transparent;
+}
+.claro .tabStripButton .dijitTabContent {
+ border: none;
+}
+/*** end common ***/
+
+
+/*************** top tab ***************/
+.claro .dijitTabContainerTop-tabs .dijitTab {
+ top: 1px; /* used for overlap */
+ margin-right: 1px;
+ padding-top: 3px;
+}
+.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTab {
+ top: 3px;
+}
+/* for top tab padding. change height when status changes */
+.claro .dijitTabContainerTop-tabs .dijitTabContent {
+ padding:3px 6px;
+ border-bottom-width: 0;
+ background-image:url("images/tabTop.png");
+ background-position:0 0;
+ background-repeat:repeat-x;
+ min-width: 60px;
+ text-align: center;
+}
+.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
+ padding-bottom: 4px;
+ padding-top: 6px;
+}
+
+/* normal status */
+.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv {
+ background-image:url("images/tabTop.png");
+ background-position:0 -248px;
+ background-position:bottom;
+ background-repeat:repeat-x;
+ .box-shadow(0 -1px 1px rgba(0, 0, 0, 0.04));
+}
+
+/* checked status */
+.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv {
+ background-image:none;
+ .box-shadow(0 -1px 2px rgba(0, 0, 0, 0.05));
+}
+.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
+ background-position:0 -102px;
+ background-repeat:repeat-x;
+}
+/** end top tab **/
+
+
+/*************** bottom tab ***************/
+.claro .dijitTabContainerBottom-tabs .dijitTab {
+ top: -1px; /* used for overlap */
+ margin-right: 1px;
+}
+/* calculate the position and size */
+.claro .dijitTabContainerBottom-tabs .dijitTabContent {
+ padding:3px 6px;
+ border-top-width: 0;
+ background-image: url("images/tabBottom.png");
+ background-position:0 -249px;
+ background-repeat: repeat-x;
+ background-position:bottom;
+ min-width: 60px;
+ text-align: center;
+}
+.claro .dijitTabContainerBottom-tabs .dijitTab {
+ padding-bottom: 3px;
+}
+/* normal status */
+.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
+ background-image: url("images/tabBottom.png");
+ background-position: top;
+ background-repeat: repeat-x;
+ .box-shadow(0 1px 1px rgba(0, 0, 0, 0.04));
+
+}
+
+/* checked status */
+.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabContent {
+ padding-bottom: 7px;
+ padding-top: 4px;
+ background-position:0 -119px;
+}
+.claro .dijitTabContainerBottom-tabs .dijitTabChecked {
+ padding-bottom: 0;
+}
+.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
+ background-image:none;
+ .box-shadow(0 1px 2px rgba(0, 0, 0, 0.05));
+}
+/** end bottom tab **/
+
+/*************** left tab ***************/
+.claro .dijitTabContainerLeft-tabs .dijitTab {
+ border-right-width: 0;
+ left: 1px; /* used for overlap */
+ margin-bottom: 1px;
+}
+/* normal status */
+.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
+ background-image: url("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-repeat: repeat-y;
+ background-position:0 0;
+}
+/* checked status */
+.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabContent {
+ padding-right: 9px;
+ border-right: none;
+ background-image: none;
+}
+.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv {
+ background-position:0 -179px;
+ background-repeat:repeat-y;
+ .box-shadow(-1px 0 2px rgba(0, 0, 0, .05));
+}
+/** end left tab **/
+
+/*************** right tab ***************/
+.claro .dijitTabContainerRight-tabs .dijitTab {
+ border-left-width: 0;
+ left: -1px; /* used for overlap */
+ margin-bottom: 1px;
+}
+/* normal status */
+.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv {
+ background-image: url("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-position:right top;
+ background-repeat: repeat-y;
+}
+/* checked status */
+.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabContent {
+ padding-left: 5px;
+ border-left: none;
+ background-image: none;
+}
+.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv {
+ background-position:-348px -179px;
+ .box-shadow(1px 0 2px rgba(0, 0, 0, 0.07));
+}
+/** end right tab **/
+
+/** round corner **/
+.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv,
+.claro .dijitTabContainerTop-tabs .dijitTabContent {
+ .border-radius(2px 2px 0 0);
+}
+.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv,
+.claro .dijitTabContainerBottom-tabs .dijitTabContent{
+ .border-radius(0 0 2px 2px);
+}
+.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
+.claro .dijitTabContainerLeft-tabs .dijitTabContent{
+ .border-radius(2px 0 0 2px);
+}
+
+.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv,
+.claro .dijitTabContainerRight-tabs .dijitTabContent{
+ .border-radius(0 2px 2px 0);
+}
+
+/************ left/right scroll buttons + menu button ************/
+.claro .tabStripButton {
+ background-color:@button-background-color;
+ border: 1px solid @border-color;
+}
+.claro .dijitTabListContainer-top .tabStripButton {
+ padding: 4px 3px;
+ margin-top:7px;
+ background-image: url("images/tabTop.png");
+ background-position:0 0;
+}
+.claro .dijitTabListContainer-bottom .tabStripButton {
+ padding:5px 3px;
+ margin-bottom:4px;
+ background-image: url("images/tabTop.png");
+ background-position:0 -248px;
+ background-position:bottom;
+}
+.claro .tabStripButtonHover {
+ background-color:@hovered-background-color;
+}
+.claro .tabStripButtonActive {
+ background-color:@pressed-background-color;
+}
+.claro .dijitTabStripIcon {
+ height:15px;
+ width:15px;
+ margin: 0 auto;
+ background:url("../form/images/buttonArrows.png") no-repeat -75px 50%;
+ background-color: transparent;
+}
+.claro .dijitTabStripSlideRightIcon{
+ background-position: -24px 50%;
+}
+.claro .dijitTabStripMenuIcon {
+ background-position: -51px 50%;
+}
+
+/*disabled styles for tab strip buttons*/
+.claro .dijitTabListContainer-top .tabStripButtonDisabled,
+.claro .dijitTabListContainer-bottom .tabStripButtonDisabled {
+ background-color:@tab-disabled-background-color;
+ border:1px solid @border-color; /* to match border of TabContainer itself */
+}
+.claro .tabStripButtonDisabled .dijitTabStripSlideLeftIcon {
+ background-position:-175px 50%;
+}
+.claro .tabStripButtonDisabled .dijitTabStripSlideRightIcon {
+ background-position: -124px 50%;
+}
+.claro .tabStripButtonDisabled .dijitTabStripMenuIcon {
+ background-position: -151px 50%;
+}
+/* Nested Tabs */
+.claro .dijitTabContainerNested .dijitTabListWrapper {
+ height: auto;
+}
+.claro .dijitTabContainerNested .dijitTabContainerTop-tabs {
+ border-bottom:solid 1px @border-color;
+ padding:1px 2px 4px;
+ margin-top:-2px;
+}
+.claro .dijitTabContainerTabListNested .dijitTabContent {
+ background:rgba(255, 255, 255, 0) none repeat scroll 0 0;
+ border: none;
+ padding: 4px;
+ border-color: rgba(118,157,192,0);
+ .transition-property(background-color, border-color);
+ .transition-duration(.3s);
+ .border-radius(2px);
+}
+.claro .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv {
+ /* 4 element selector to override box-shadow setting from above rule:
+ * .claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv { ... }
+ */
+ background: none;
+ border: none;
+ top: 0;/* to override top: 1px/-1px for normal tabs */
+ .box-shadow(none);
+}
+.claro .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent {
+ background-color: @nestedtab-hovered-background-color;
+ border:solid 1px @nestedtab-hovered-border-color;
+ padding: 3px;
+ .transition-duration(.2s);
+}
+.claro .dijitTabContainerTabListNested .dijitTabHover .tabLabel {
+ text-decoration: none;
+}
+.claro .dijitTabContainerTabListNested .dijitTabActive .dijitTabContent {
+ border:solid 1px @nestedtab-selected-border-color;
+ padding: 3px;
+ background: @nestedtab-selected-background-color url("images/tabNested.png") repeat-x;
+ .transition-duration(.1s);
+}
+.claro .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent {
+ padding: 3px;
+ border:solid 1px @selected-border-color;
+ background-position: 0 105px;
+ background-color:@selected-background-color;
+}
+.claro .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
+ text-decoration: none;
+ background-image:none;
+}
+.claro .dijitTabPaneWrapperNested {
+ border: none;/* prevent double border */
+}
+
+
+.dj_ie6 .claro .dijitTabContent,
+.dj_ie6 .claro .dijitTabInnerDiv,
+.dj_ie6 .dijitTabListContainer-top .tabStripButton,
+.dj_ie6 .dijitTabListContainer-bottom .tabStripButton{
+ background-image: none;
+}
diff --git a/lib/dijit/themes/claro/layout/TabContainer_rtl.css b/lib/dijit/themes/claro/layout/TabContainer_rtl.css
index 156cea977..89fdff097 100644
--- a/lib/dijit/themes/claro/layout/TabContainer_rtl.css
+++ b/lib/dijit/themes/claro/layout/TabContainer_rtl.css
@@ -1,67 +1,67 @@
-.claro .dijitTabContainerTop-tabs .dijitTabRtl,
-.claro .dijitTabContainerBottom-tabs .dijitTabRtl {
- margin-right: 0;
- margin-left: 1px;
+.claro .dijitTabContainerTop-tabs .dijitTabRtl, .claro .dijitTabContainerBottom-tabs .dijitTabRtl {
+ margin-right: 0;
+ margin-left: 1px;
}
.claro .dijitTabRtl {
- -moz-box-orient:horizontal;
- text-align: right;
+ -moz-box-orient: horizontal;
+ text-align: right;
}
.dj_ie7 .claro .dijitTabRtl .dijitTabContent {
- display: block;
- left: 0;
+ display: block;
+ left: 0;
}
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl,
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabCheckedRtl {
- top: 1px;
+.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl, .dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabCheckedRtl {
+ top: 1px;
}
.dj_ie7 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie8 .claro .tabStripButtonRtl .dijitButtonContents,
+.dj_ie8 .claro .tabStripButtonRtl .dijitButtonContents,
.dj_ie6 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
.dj_ie6 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
.dj_ie7 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
.dj_iequirks .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
.dj_iequirks .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv {
- float:left;
+ float: left;
}
.dj_ie6 .claro .dijitTabRtl .tabLabel,
.dj_ie6 .claro .dijitTabContainerRight-tabs .dijitTabRtl,
.dj_ie6 .claro .dijitTabContainerLeft-tabs .dijitTabRtl,
.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtl .dijitTabInnerDiv,
.dj_ie7 .claro .dijitTabContainerLeft-tabs .dijitTabRtl .dijitTabInnerDiv {
-
- zoom:1;
+ /*Make the .tablabel have width in ie6 with haslayout property, fix Close icon position bug*/
+
+ zoom: 1;
}
-.dj_ie6 .claro .dijitTabRtl .dijitTabCloseButton,
-.dj_ie7 .claro .dijitTabRtl .dijitTabCloseButton,
-.dj_iequirks .claro .dijitTabRtl .dijitTabCloseButton {
- margin-right:5px;
+.dj_ie6 .claro .dijitTabRtl .dijitTabCloseButton, .dj_ie7 .claro .dijitTabRtl .dijitTabCloseButton, .dj_iequirks .claro .dijitTabRtl .dijitTabCloseButton {
+ margin-right: 5px;
}
-.dj_ie6 .claro .dijitTabContainerRightRtl .dijitTabContainerRight-tabs,
-.dj_ie6 .claro .dijitTabContainerLeftRtl .dijitTabContainerLeft-tabs {
- width:1%;
+.dj_ie6 .claro .dijitTabContainerRightRtl .dijitTabContainerRight-tabs, .dj_ie6 .claro .dijitTabContainerLeftRtl .dijitTabContainerLeft-tabs {
+ width: 1%;
}
-.dj_ie6 .dijitTabContainerTopStrip,
-.dj_ie6 .dijitTabContainerBottomStrip {
- position:absolute;
+.dj_ie6 .dijitTabContainerTopStrip, .dj_ie6 .dijitTabContainerBottomStrip {
+ position: absolute;
}
.dj_iequirks .claro .dijitTabContainerTopRtl .dijitTabContainerTopStrip {
- padding-top: 10px;
+ padding-top: 10px;
}
.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtlChecked .dijitTabInnerDiv {
- background-position:-341px -179px;
+ background-position: -341px -179px;
}
-.dj_ie6 .dijitTabContainerTopRtl .dijitTabStripIcon,
-.dj_ie6 .dijitTabContainerBottomRtl .dijitTabStripIcon {
- position: relative;
+.dj_ie6 .dijitTabContainerTopRtl .dijitTabStripIcon, .dj_ie6 .dijitTabContainerBottomRtl .dijitTabStripIcon {
+ position: relative;
}
-.dj_ie6-rtl .claro .dijitTabContainerTop-tabs {
-
- padding-left: 3px;
+.dj_ie6-rtl .claro .dijitTabContainerTop-tabs {
+ /* this strange rule prevents IE6 bug in themeTester.html?dir=rtl upon closing
+ * "Closable" tab, where the other tabs disappear
+ */
+
+ padding-left: 3px;
}
.dj_iequirks-rtl .claro .dijitTabListWrapper {
-
- border-left: 1px solid #fff;
- border-right: 1px solid #fff;
+ /* this strange rule prevents IE6 bug in themeTesterQuirk.html?dir=rtl upon closing
+ * "Closable" tab, where the other tabs disappear
+ */
+
+ border-left: 1px solid #ffffff;
+ border-right: 1px solid #ffffff;
}
diff --git a/lib/dijit/themes/claro/layout/TabContainer_rtl.less b/lib/dijit/themes/claro/layout/TabContainer_rtl.less
new file mode 100644
index 000000000..eaada0d0a
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/TabContainer_rtl.less
@@ -0,0 +1,81 @@
+@import "../variables";
+
+.claro .dijitTabContainerTop-tabs .dijitTabRtl,
+.claro .dijitTabContainerBottom-tabs .dijitTabRtl {
+ margin-right: 0;
+ margin-left: 1px;
+}
+.claro .dijitTabRtl {
+ -moz-box-orient:horizontal;
+ text-align: right;
+}
+.dj_ie7 .claro .dijitTabRtl .dijitTabContent {
+ display: block;
+ left: 0;
+}
+.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl,
+.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabCheckedRtl {
+ top: 1px;
+}
+
+// Note that .tabStripButtonRtl .dijitButtonContents needed for IE8 quirks but breaks IE6 quirks
+.dj_ie7 .claro .tabStripButtonRtl .dijitButtonContents,
+.dj_ie8 .claro .tabStripButtonRtl .dijitButtonContents,
+.dj_ie6 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
+.dj_ie6 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
+.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
+.dj_ie7 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
+.dj_iequirks .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
+.dj_iequirks .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv {
+ float:left;
+}
+.dj_ie6 .claro .dijitTabRtl .tabLabel,
+.dj_ie6 .claro .dijitTabContainerRight-tabs .dijitTabRtl,
+.dj_ie6 .claro .dijitTabContainerLeft-tabs .dijitTabRtl,
+.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtl .dijitTabInnerDiv,
+.dj_ie7 .claro .dijitTabContainerLeft-tabs .dijitTabRtl .dijitTabInnerDiv {
+ /*Make the .tablabel have width in ie6 with haslayout property, fix Close icon position bug*/
+ zoom:1;
+}
+.dj_ie6 .claro .dijitTabRtl .dijitTabCloseButton,
+.dj_ie7 .claro .dijitTabRtl .dijitTabCloseButton,
+.dj_iequirks .claro .dijitTabRtl .dijitTabCloseButton {
+ margin-right:5px;
+}
+
+.dj_ie6 .claro .dijitTabContainerRightRtl .dijitTabContainerRight-tabs,
+.dj_ie6 .claro .dijitTabContainerLeftRtl .dijitTabContainerLeft-tabs {
+ width:1%;
+}
+
+.dj_ie6 .dijitTabContainerTopStrip,
+.dj_ie6 .dijitTabContainerBottomStrip {
+ position:absolute;
+}
+.dj_iequirks .claro .dijitTabContainerTopRtl .dijitTabContainerTopStrip {
+ padding-top: 10px;
+}
+.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtlChecked .dijitTabInnerDiv {
+ background-position:-341px -179px;
+}
+
+.dj_ie6 .dijitTabContainerTopRtl .dijitTabStripIcon,
+.dj_ie6 .dijitTabContainerBottomRtl .dijitTabStripIcon {
+ position: relative;
+}
+
+
+.dj_ie6-rtl .claro .dijitTabContainerTop-tabs {
+ /* this strange rule prevents IE6 bug in themeTester.html?dir=rtl upon closing
+ * "Closable" tab, where the other tabs disappear
+ */
+ padding-left: 3px;
+}
+
+.dj_iequirks-rtl .claro .dijitTabListWrapper {
+ /* this strange rule prevents IE6 bug in themeTesterQuirk.html?dir=rtl upon closing
+ * "Closable" tab, where the other tabs disappear
+ */
+ border-left: 1px solid @pane-background-color;
+ border-right: 1px solid @pane-background-color;
+}
diff --git a/lib/dijit/themes/claro/layout/images/tabBottom.png b/lib/dijit/themes/claro/layout/images/tabBottom.png
index bf232406f..dbcfc851b 100644
--- a/lib/dijit/themes/claro/layout/images/tabBottom.png
+++ b/lib/dijit/themes/claro/layout/images/tabBottom.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabTop.png b/lib/dijit/themes/claro/layout/images/tabTop.png
index db7626ea8..2822487ed 100644
--- a/lib/dijit/themes/claro/layout/images/tabTop.png
+++ b/lib/dijit/themes/claro/layout/images/tabTop.png
Binary files differ
diff --git a/lib/dijit/themes/claro/variables.less b/lib/dijit/themes/claro/variables.less
new file mode 100644
index 000000000..8d09c2519
--- /dev/null
+++ b/lib/dijit/themes/claro/variables.less
@@ -0,0 +1,189 @@
+// 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
+
+@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
+
+@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
+
+@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.
+
+@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.
+
+@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.
+
+
+
+// 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)
+
+// 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
+@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.
+
+// CheckBox, RadioButton
+@focus-outline-color: #4a4a4a; // Color for artificial focus outline around labels of checkboxes
+
+// TabContainer
+@nestedtab-hovered-background-color: @textbox-hovered-background-color;
+@nestedtab-hovered-border-color: #cfe5fa;
+@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)
+
+// 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
+
+// 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
+
+// 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
+
+// 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-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-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.
+
+// 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-value-hovered-text-color: @hovered-text-color;
+@timepicker-arrow-hovered-background-color: #abd6ff;
+
+// ColorPalette
+@colorpalette-background-color: #fff;
+@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;
+
+// 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
+
+// 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-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-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
+
+// Document level
+@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.
+
+// Mixins
+
+.border-radius (@radius) {
+ -moz-border-radius: @radius;
+ border-radius: @radius;
+}
+
+.box-shadow (@value) {
+ -webkit-box-shadow: @value;
+ -moz-box-shadow: @value;
+ box-shadow: @value;
+}
+
+.transition-property (@value) {
+ -webkit-transition-property: @value;
+ -moz-transition-property: @value;
+ transition-property: @value;
+}
+
+.transition-property (@value1, @value2) {
+ -webkit-transition-property: @value1, @value2;
+ -moz-transition-property: @value1, @value2;
+ transition-property: @value1, @value2;
+}
+
+.transition-duration (@value) {
+ -webkit-transition-duration: @value;
+ -moz-transition-duration: @value;
+ transition-duration: @value;
+}
+
+.transition-duration (@value1, @value2) {
+ -webkit-transition-duration: @value1, @value2;
+ -moz-transition-duration: @value1, @value2;
+ transition-duration: @value1, @value2;
+}
+
+.transition-timing-function (@value) {
+ -webkit-transition-timing-function: @value;
+ -moz-transition-timing-function: @value;
+ transition-timing-function: @value;
+}
diff --git a/lib/dijit/themes/dijit.css b/lib/dijit/themes/dijit.css
index 0d8302344..b6d57dca1 100644
--- a/lib/dijit/themes/dijit.css
+++ b/lib/dijit/themes/dijit.css
@@ -1,6 +1,19 @@
+/*
+ Essential styles that themes can inherit.
+ In other words, works but doesn't look great.
+*/
+
+
+
+/****
+ GENERIC PIECES
+ ****/
.dijitReset {
-
+ /* Use this style to null out padding, margin, border in your template elements
+ so that page specific styles don't break them.
+ - Use in all TABLE, TR and TD tags.
+ */
margin:0;
border:0;
padding:0;
@@ -9,34 +22,44 @@
color: inherit;
}
.dijit_a11y .dijitReset {
- -moz-appearance: none;
+ -moz-appearance: none; /* remove predefined high-contrast styling in Firefox */
}
+
.dijitInline {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
+ /* To inline block elements.
+ Similar to InlineBox below, but this has fewer side-effects in Moz.
+ Also, apparently works on a DIV as well as a FIELDSET.
+ */
+ 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 */
border:0;
padding:0;
vertical-align:middle;
- #vertical-align: auto;
+ #vertical-align: auto; /* makes TextBox,Button line up w/native counterparts on IE6 */
}
+
.dijitHidden {
-
+ /* To hide unselected panes in StackContainer etc. */
display: none !important;
}
+
.dijitVisible {
-
- display: block !important;
- position: relative;
+ /* To show selected pane in StackContainer etc. */
+ display: block !important; /* override user's display:none setting via style setting or indirectly via class */
+ position: relative; /* to support setting width/height, see #2033 */
}
+
.dijitInputContainer {
-
+ /* for positioning of placeHolder */
#zoom: 1;
overflow: hidden;
- float: none !important;
- position:relative;
+ float: none !important; /* needed by FF to squeeze the INPUT in */
+ position: relative;
+ vertical-align: middle;
+ #display: inline;
}
+
.dj_ie INPUT.dijitTextBox,
.dj_ie .dijitTextBox INPUT {
font-size: 100%;
@@ -48,7 +71,7 @@
text-align: center;
}
.dijitTextBox INPUT.dijitInputField {
-
+ /* override unreasonable user styling of buttons and icons */
padding-left: 0 !important;
padding-right: 0 !important;
}
@@ -56,25 +79,31 @@
display: none;
}
.dijitInlineTable {
-
+ /* To inline tables with a given width set (otherwise, use dijitInline above) */
display:inline-table;
- display:inline-block;
- #zoom: 1;
- #display:inline;
+ 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;
line-height:1px;
}
+
.dijitOffScreen {
position: absolute;
- visibility: hidden;
left: 50%;
top: -10000px;
}
+
+/*
+ * Popup items have a wrapper div (dijitPopup)
+ * with the real popup inside, and maybe an iframe too
+ */
.dijitPopup {
position: absolute;
background-color: transparent;
@@ -82,14 +111,9 @@
border: 0;
padding: 0;
}
-.dijit_a11y .dijitPopup,
-.dijit_ally .dijitPopup DIV,
-.dijit_a11y .dijitPopup TABLE,
-.dijit_a11y .dijitTooltipContainer {
- background-color: white !important;
-}
+
.dijitPositionOnly {
-
+ /* Null out all position-related properties */
padding: 0 !important;
border: 0 !important;
background-color: transparent !important;
@@ -97,15 +121,17 @@
height: auto !important;
width: auto !important;
}
+
.dijitNonPositionOnly {
-
+ /* Null position-related properties */
float: none !important;
position: static !important;
margin: 0 0 0 0 !important;
vertical-align: middle !important;
}
+
.dijitBackgroundIframe {
-
+ /* iframe used to prevent problems with PDF or other applets overlaying menus etc */
position: absolute;
left: 0;
top: 0;
@@ -116,52 +142,65 @@
padding: 0;
margin: 0;
}
+
.dijitDisplayNone {
-
+ /* hide something. Use this as a class rather than element.style so another class can override */
display:none !important;
}
+
.dijitContainer {
-
- overflow: hidden;
-}
-.dijit_a11y * {
- background-image:none !important;
+ /* for all layout containers */
+ overflow: hidden; /* need on IE so something can be reduced in size, and so scrollbars aren't temporarily displayed when resizing */
}
+
+/****
+ A11Y
+ ****/
.dijit_a11y .dijitIcon,
-.dijit_a11y DIV.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 .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 */
display: none;
}
.dijitSpinner DIV.dijitArrowButtonInner {
- display: block;
+ display: block; /* override previous rule */
}
+
.dijit_a11y .dijitA11ySideArrow {
- display: inline !important;
+ display: inline !important; /* display text instead */
cursor: pointer;
}
+
+/*
+ * Since we can't use shading in a11y mode, and since the underline indicates today's date,
+ * use a border to show the selected date.
+ * Avoid screen jitter when switching selected date by compensating for the selected node's
+ * border w/padding on other nodes.
+ */
.dijit_a11y .dijitCalendarDateLabel {
padding: 1px;
}
.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
border-style: dotted !important;
border-width: 1px;
- padding: 0px;
+ padding: 0;
}
.dijit_a11y .dijitCalendarDateTemplate {
- padding-bottom: 0.1em !important;
-}
-.dijit_a11y .dijit * {
- background:white !important;
- color:black !important;
+ padding-bottom: 0.1em !important; /* otherwise bottom border doesn't appear on IE */
}
.dijit_a11y .dijitButtonNode {
- border-color: black!important;
- border-style: outset!important;
- border-width: medium!important;
+ border: black outset medium !important;
+
+ /* In claro, hovering a toolbar button reduces padding and adds a border.
+ * Not needed in a11y mode since Toolbar buttons always have a border.
+ */
+ padding: 0 !important;
}
+
.dijit_a11y .dijitTextBoxReadOnly .dijitInputField,
.dijit_a11y .dijitTextBoxReadOnly .dijitButtonNode {
border-style: outset!important;
@@ -169,83 +208,94 @@
border-color: #999 !important;
color:#999 !important;
}
+
+/* button inner contents - labels, icons etc. */
.dijitButtonNode * {
vertical-align: middle;
}
.dijitButtonNode .dijitArrowButtonInner {
-
+ /* the arrow icon node */
background: no-repeat center;
width: 12px;
height: 12px;
- direction: ltr;
+ direction: ltr; /* needed by IE/RTL */
}
+
+/****
+ 3-element borders: ( dijitLeft + dijitStretch + dijitRight )
+ These were added for rounded corners on dijit.form.*Button but never actually used.
+ ****/
+
.dijitLeft {
-
+ /* Left part of a 3-element border */
background-position:left top;
background-repeat:no-repeat;
}
+
.dijitStretch {
-
- white-space:nowrap;
+ /* Middle (stretchy) part of a 3-element border */
+ white-space:nowrap; /* MOW: move somewhere else */
background-repeat:repeat-x;
}
+
.dijitRight {
-
- #display:inline;
+ /* Right part of a 3-element border */
+ #display:inline; /* IE7 sizes to outer size w/o this */
background-position:right top;
background-repeat:no-repeat;
}
+
+/* Buttons */
+
.dijitToggleButton,
.dijitButton,
.dijitDropDownButton,
.dijitComboButton {
-
+ /* outside of button */
margin: 0.2em;
+ vertical-align: middle;
}
+
.dijitButtonContents {
- display: block;
+ display: block; /* to make focus border rectangular */
}
td.dijitButtonContents {
- display: table-cell;
+ display: table-cell; /* but don't affect Select, ComboButton */
}
+
.dijitButtonNode IMG {
-
+ /* make text and images line up cleanly */
vertical-align:middle;
-
-}
-TABLE.dijitComboButton {
-
- border-collapse: collapse;
- border:0;
- padding:0;
- margin:0;
+ /*margin-bottom:.2em;*/
}
+
.dijitToolbar .dijitComboButton {
-
+ /* because Toolbar only draws a border around the hovered thing */
border-collapse: separate;
}
+
.dijitToolbar .dijitToggleButton,
.dijitToolbar .dijitButton,
.dijitToolbar .dijitDropDownButton,
.dijitToolbar .dijitComboButton {
margin: 0;
}
+
.dijitToolbar .dijitButtonContents {
-
+ /* just because it used to be this way */
padding: 1px 2px;
}
-.dj_ie .dijitComboButton {
-
- margin-bottom: -3px;
-}
+
+
.dj_webkit .dijitToolbar .dijitDropDownButton {
padding-left: 0.3em;
}
.dj_gecko .dijitToolbar .dijitButtonNode::-moz-focus-inner {
padding:0;
}
+
.dijitButtonNode {
-
+ /* Node that is acting as a button -- may or may not be a BUTTON element */
border:1px solid gray;
margin:0;
line-height:normal;
@@ -255,76 +305,95 @@ TABLE.dijitComboButton {
white-space: nowrap;
}
.dj_webkit .dijitSpinner .dijitSpinnerButtonContainer {
-
+ /* apparent WebKit bug where messing with the font coupled with line-height:normal X 2 (dijitReset & dijitButtonNode)
+ can be different than just a single line-height:normal, visible in InlineEditBox/Spinner */
line-height:inherit;
}
.dijitTextBox .dijitButtonNode {
border-width: 0;
}
+
.dijitButtonNode,
.dijitButtonNode * {
cursor: pointer;
}
+
.dj_ie .dijitButtonNode {
-
+ /* ensure hasLayout */
zoom: 1;
}
+
.dj_ie .dijitButtonNode button {
-
+ /*
+ disgusting hack to get rid of spurious padding around button elements
+ on IE. MSIE is truly the web's boat anchor.
+ */
overflow: visible;
}
+
DIV.dijitArrowButton {
float: right;
}
+
+/******
+ TextBox related.
+ Everything that has an <input>
+*******/
+
.dijitTextBox {
border: solid black 1px;
- #overflow: hidden;
- width: 15em;
+ #overflow: hidden; /* #6027, #6067 */
+ width: 15em; /* need to set default size on outer node since inner nodes say <input style="width:100%"> and <td width=100%>. user can override */
vertical-align: middle;
- #vertical-align: auto;
}
+
.dijitTextBoxReadOnly,
.dijitTextBoxDisabled {
color: gray;
}
.dj_webkit .dijitTextBoxDisabled INPUT {
- color: #eee;
+ color: #eee; /* because WebKit lightens disabled input/textarea no matter what color you specify */
}
.dj_webkit TEXTAREA.dijitTextAreaDisabled {
- color: #333;
+ color: #333; /* because WebKit lightens disabled input/textarea no matter what color you specify */
}
-.dj_gecko .dijitTextBoxReadOnly 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;
+ -moz-user-input: none; /* prevent focus of disabled textbox buttons */
}
+
.dijitPlaceHolder {
-
+ /* hint text that appears in a textbox until user starts typing */
color: #AAAAAA;
font-style: italic;
position: absolute;
top: 0;
left: 0;
- #filter: "";
+ #filter: ""; /* make this showup in IE6 after the rendering of the widget */
}
+
.dijitTimeTextBox {
width: 8em;
}
+
+/* rules for webkit to deal with fuzzy blue focus border */
.dijitTextBox INPUT:focus {
- outline: none;
+ outline: none; /* blue fuzzy line looks wrong on combobox or something w/validation icon showing */
}
.dijitTextBoxFocused {
outline: auto 5px -webkit-focus-ring-color;
}
+
.dijitTextBox INPUT {
- float: left;
+ float: left; /* needed by IE to remove secret margin */
}
.dijitInputInner {
-
+ /* for when an <input> is embedded inside an inline-block <div> with a size and border */
border:0 !important;
vertical-align:middle !important;
background-color:transparent !important;
width:100% !important;
-
+ /* IE dislikes horizontal tweaking combined with width:100% so punish everyone for consistency */
padding-left: 0 !important;
padding-right: 0 !important;
margin-left: 0 !important;
@@ -335,7 +404,9 @@ DIV.dijitArrowButton {
}
.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
+ */
text-indent: -1em !important;
direction: ltr !important;
text-align: left !important;
@@ -346,12 +417,12 @@ DIV.dijitArrowButton {
}
.dj_ie .dijitTextBox INPUT,
.dj_ie INPUT.dijitTextBox {
- overflow-y: visible;
- line-height: normal;
+ overflow-y: visible; /* INPUTs need help expanding when padding is added or line-height is adjusted */
+ line-height: normal; /* strict mode */
}
.dj_ie7 .dijitTextBox INPUT.dijitValidationInner,
.dj_ie7 .dijitTextBox INPUT.dijitArrowButtonInner {
- line-height: 86%;
+ 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,
@@ -360,11 +431,11 @@ DIV.dijitArrowButton {
.dj_iequirks .dijitTextBox INPUT.dijitSpinnerButtonInner,
.dj_iequirks .dijitTextBox INPUT.dijitInputInner,
.dj_iequirks INPUT.dijitTextBox {
- line-height: 100%;
+ line-height: 100%; /* IE7 problem where the icon is vertically way too low w/o this */
}
.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;
#text-align: left !important;
@@ -373,29 +444,38 @@ DIV.dijitArrowButton {
display: inline;
cursor: default;
}
+
+/* ComboBox & Spinner */
+
.dijitSpinner .dijitSpinnerButtonContainer,
.dijitComboBox .dijitArrowButtonContainer {
-
- border-width: 0 0 0 1px !important;
+ /* dividing line between input area and up/down button(s) for ComboBox and Spinner */
+ border-width: 0 0 0 1px !important; /* !important needed due to wayward ".theme .dijitButtonNode" rules */
+}
+.dijitToolbar .dijitComboBox .dijitArrowButtonContainer {
+ /* overrides above rule plus mirror-image rule in dijit_rtl.css to have no divider when ComboBox in Toolbar */
+ border-width: 0 !important;
+}
+
+.dijitComboBoxMenu {
+ /* Drop down menu is implemented as <ul> <li/> <li/> ... but we don't want circles before each item */
+ list-style-type: none;
}
.dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
-
+ /* dividing line between input area and up/down button(s) for ComboBox and Spinner */
border-width: 0;
}
.dj_ie .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
- clear: both;
-}
-.dijit_a11y .dijitTextBox .dijitValidationContainer,
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBox .dijitArrowButtonContainer {
-
- border: solid black !important;
- border-width: 0 0 0 1px !important;
+ clear: both; /* IE workaround */
}
+
.dj_ie .dijitToolbar .dijitComboBox {
-
+ /* make combobox buttons align properly with other buttons in a toolbar */
vertical-align: middle;
}
+
+/* Spinner */
+
.dijitTextBox .dijitSpinnerButtonContainer {
width: 1em;
position: relative !important;
@@ -403,7 +483,7 @@ DIV.dijitArrowButton {
}
.dijitSpinner .dijitSpinnerButtonInner {
width:1em;
- visibility:hidden !important;
+ visibility:hidden !important; /* just a sizing element */
overflow-x:hidden;
}
.dijitComboBox .dijitButtonNode,
@@ -419,7 +499,7 @@ DIV.dijitArrowButton {
width: 1em !important;
}
.dijit_a11y .dijitSpinner .dijitArrowButtonInner {
- margin: 0 auto !important;
+ margin: 0 auto !important; /* should auto-center */
}
.dj_ie .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
padding-left: 0.3em !important;
@@ -429,8 +509,8 @@ DIV.dijitArrowButton {
width: 1.4em !important;
}
.dj_ie7 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.0em !important;
- padding-right: 0.0em !important;
+ padding-left: 0 !important; /* manually center INPUT: character is .5em and total width = 1em */
+ padding-right: 0 !important;
width: 1em !important;
}
.dj_ie6 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
@@ -444,7 +524,9 @@ DIV.dijitArrowButton {
width: 2em !important;
}
.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
-
+ /* note: .dijitInputLayoutContainer makes this rule override .dijitArrowButton settings
+ * for dijit.form.Button
+ */
padding: 0;
position: absolute !important;
right: 0;
@@ -466,7 +548,7 @@ DIV.dijitArrowButton {
border-top-width: 1px !important;
}
.dijitSpinner .dijitSpinnerButtonContainer .dijitUpArrowButton {
- #bottom: 50%;
+ #bottom: 50%; /* otherwise (on some machines) top arrow icon too close to splitter border (IE6/7) */
top: 0;
}
.dijitSpinner .dijitArrowButtonInner {
@@ -493,16 +575,17 @@ DIV.dijitArrowButton {
width: 100%;
}
.dj_ie .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- zoom: 50%;
+ zoom: 50%; /* emulate transform: scale(0.5) */
}
.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButtonInner {
overflow: hidden;
}
+
.dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
width: 100%;
}
.dj_iequirks .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 1em;
+ width: 1em; /* matches .dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer rule - 100% is the whole screen width in quirks */
}
.dijitSpinner .dijitArrowButtonInner .dijitInputField {
visibility: hidden;
@@ -515,9 +598,16 @@ DIV.dijitArrowButton {
width: 1em;
}
.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 1px 0px 0px 0px;
+ border-width: 1px 0 0 0;
border-style: solid !important;
}
+
+/****
+ dijit.form.CheckBox
+ &
+ dijit.form.RadioButton
+ ****/
+
.dijitCheckBox,
.dijitRadio,
.dijitCheckBoxInput {
@@ -529,22 +619,26 @@ DIV.dijitArrowButton {
background-repeat:no-repeat;
overflow: hidden;
}
+
.dijitCheckBox INPUT,
.dijitRadio INPUT {
margin: 0;
padding: 0;
display: block;
}
+
.dijitCheckBoxInput {
-
+ /* place the actual input on top, but all-but-invisible */
opacity: 0.01;
}
+
.dj_ie .dijitCheckBoxInput {
filter: alpha(opacity=0);
}
+
.dijit_a11y .dijitCheckBox,
.dijit_a11y .dijitRadio {
-
+ /* in a11y mode we display the native checkbox (not the icon), so don't restrict the size */
width: auto !important;
height: auto !important;
}
@@ -554,14 +648,21 @@ DIV.dijitArrowButton {
width: auto;
height: auto;
}
+
+
+/****
+ dijit.ProgressBar
+ ****/
+
.dijitProgressBarEmpty {
-
+ /* outer container and background of the bar that's not finished yet*/
position:relative;overflow:hidden;
- border:1px solid black;
- z-index:0;
+ border:1px solid black; /* a11y: border necessary for high-contrast mode */
+ z-index:0; /* establish a stacking context for this progress bar */
}
+
.dijitProgressBarFull {
-
+ /* outer container for background of bar that is finished */
position:absolute;
overflow:hidden;
z-index:-1;
@@ -571,8 +672,9 @@ DIV.dijitArrowButton {
.dj_ie6 .dijitProgressBarFull {
height:1.6em;
}
+
.dijitProgressBarTile {
-
+ /* inner container for finished portion */
position:absolute;
overflow:hidden;
top:0;
@@ -586,27 +688,29 @@ DIV.dijitArrowButton {
background-color:#aaa;
background-attachment: fixed;
}
+
.dijit_a11y .dijitProgressBarTile {
-
+ /* a11y: The border provides visibility in high-contrast mode */
border-width:2px;
border-style:solid;
background-color:transparent !important;
}
+
.dj_ie6 .dijitProgressBarTile {
-
+ /* width:auto works in IE6 with position:static but not position:absolute */
position:static;
-
+ /* height:auto or 100% does not work in IE6 */
height:1.6em;
}
-.dijitProgressBarIndeterminate .dijitProgressBarLabel {
- visibility:hidden;
-}
+
.dijitProgressBarIndeterminate .dijitProgressBarTile {
-
+ /* animated gif for 'indeterminate' mode */
}
+
.dijitProgressBarIndeterminateHighContrastImage {
display:none;
}
+
.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
display:block;
position:absolute;
@@ -617,6 +721,7 @@ DIV.dijitArrowButton {
width:100%;
height:auto;
}
+
.dijitProgressBarLabel {
display:block;
position:static;
@@ -624,38 +729,52 @@ DIV.dijitArrowButton {
text-align:center;
background-color:transparent !important;
}
+
+/****
+ dijit.Tooltip
+ ****/
+
.dijitTooltip {
position: absolute;
z-index: 2000;
display: block;
-
- left: 50%;
+ /* make visible but off screen */
+ left: 0;
top: -10000px;
overflow: visible;
}
+
.dijitTooltipContainer {
border: solid black 2px;
background: #b8b5b5;
color: black;
font-size: small;
}
+
.dijitTooltipFocusNode {
padding: 2px 2px 2px 2px;
}
+
.dijitTooltipConnector {
position: absolute;
}
.dijit_a11y .dijitTooltipConnector {
- display: none;
+ display: none; /* won't show b/c it's background-image; hide to avoid border gap */
}
+
.dijitTooltipData {
display:none;
}
+
+/* Layout widgets. This is essential CSS to make layout work (it isn't "styling" CSS)
+ make sure that the position:absolute in dijitAlign* overrides other classes */
+
.dijitLayoutContainer {
position: relative;
display: block;
overflow: hidden;
}
+
body .dijitAlignTop,
body .dijitAlignBottom,
body .dijitAlignLeft,
@@ -663,40 +782,61 @@ body .dijitAlignRight {
position: absolute;
overflow: hidden;
}
+
body .dijitAlignClient { position: absolute; }
+
+/*
+ * BorderContaienr
+ *
+ * .dijitBorderContainer is a stylized layout where panes have border and margin.
+ * .dijitBorderContainerNoGutter is a raw layout.
+ */
.dijitBorderContainer, .dijitBorderContainerNoGutter {
position:relative;
overflow: hidden;
}
+
.dijitBorderContainerPane,
.dijitBorderContainerNoGutterPane {
- position: absolute !important;
- z-index: 2;
+ position: absolute !important; /* !important to override position:relative in dijitTabContainer etc. */
+ z-index: 2; /* above the splitters so that off-by-one browser errors don't cover up border of pane */
}
+
.dijitBorderContainer > .dijitTextArea {
-
+ /* On Safari, for SimpleTextArea inside a BorderContainer,
+ don't want to display the grip to resize */
resize: none;
}
+
.dijitGutter {
-
+ /* gutter is just a place holder for empty space between panes in BorderContainer */
position: absolute;
- font-size: 1px;
+ font-size: 1px; /* needed by IE6 even though div is empty, otherwise goes to 15px */
}
+
+/* SplitContainer
+
+ 'V' == container that splits vertically (up/down)
+ 'H' = horizontal (left/right)
+*/
+
.dijitSplitter {
position: absolute;
overflow: hidden;
- z-index: 10;
+ z-index: 10; /* above the panes so that splitter focus is visible on FF, see #7583*/
background-color: #fff;
border-color: gray;
border-style: solid;
border-width: 0;
}
.dj_ie .dijitSplitter {
- z-index: 1;
+ z-index: 1; /* behind the panes so that pane borders aren't obscured see test_Gui.html/[14392] */
}
+
.dijitSplitterActive {
z-index: 11 !important;
}
+
.dijitSplitterCover {
position:absolute;
z-index:-1;
@@ -705,13 +845,17 @@ body .dijitAlignClient { position: absolute; }
width:100%;
height:100%;
}
+
.dijitSplitterCoverActive {
z-index:3 !important;
}
+
+/* #6945: stop mouse events */
.dj_ie .dijitSplitterCover {
background: white;
filter: alpha(opacity=0);
}
+
.dijitSplitterH {
height: 7px;
border-top:1px;
@@ -733,9 +877,11 @@ body .dijitAlignClient { position: absolute; }
outline-style:dotted;
outline-width: 2px;
}
+
.dijitSplitPane {
position: absolute;
}
+
.dijitSplitContainerSizerH,
.dijitSplitContainerSizerV {
position:absolute;
@@ -747,15 +893,18 @@ body .dijitAlignClient { position: absolute; }
border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
margin: 0;
}
+
.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
overflow:hidden;
position:absolute;
top:49%;
}
+
.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
position:absolute;
left:49%;
}
+
.dijitSplitterShadow,
.dijitSplitContainerVirtualSizerH,
.dijitSplitContainerVirtualSizerV {
@@ -766,12 +915,14 @@ body .dijitAlignClient { position: absolute; }
filter: Alpha(Opacity=50);
margin: 0;
}
+
.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
cursor: w-resize;
}
.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
cursor: n-resize;
}
+
.dijit_a11y .dijitSplitterH {
border-top:1px solid #d3d3d3 !important;
border-bottom:1px solid #d3d3d3 !important;
@@ -780,14 +931,24 @@ body .dijitAlignClient { position: absolute; }
border-left:1px solid #d3d3d3 !important;
border-right:1px solid #d3d3d3 !important;
}
+
+/* ContentPane */
+
.dijitContentPane {
display: block;
- overflow: auto;
+ overflow: auto; /* if we don't have this (or overflow:hidden), then Widget.resizeTo() doesn't make sense for ContentPane */
}
+
.dijitContentPaneSingleChild {
-
+ /*
+ * if the ContentPane holds a single layout widget child which is being sized to match the content pane,
+ * then the ContentPane should never get a scrollbar (but it does due to browser bugs, see #9449
+ */
overflow: hidden;
}
+
+/* TitlePane */
+
.dijitTitlePane {
display: block;
overflow: hidden;
@@ -795,45 +956,48 @@ body .dijitAlignClient { position: absolute; }
.dijitTitlePaneTitle {
cursor: pointer;
}
-.dijitFixedOpen {
-
+.dijitFixedOpen, .dijitFixedClosed {
+ /* TitlePane that cannot be toggled */
cursor: default;
}
.dijitTitlePaneTitle * {
vertical-align: middle;
}
.dijitTitlePane .dijitArrowNodeInner {
-
+ /* normally, hide arrow text in favor of icon */
display: none;
}
.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
-
+ /* ... except in a11y mode, then show text arrow */
display:inline !important;
- font-family: monospace;
+ font-family: monospace; /* because - and + are different widths */
}
.dijit_a11y .dijitTitlePane .dijitArrowNode {
-
+ /* ... and hide icon */
display:none;
}
+
.dj_ie6 .dijitTitlePaneContentOuter,
.dj_ie6 .dijitTitlePane .dijitTitlePaneTitle {
-
+ /* force hasLayout to ensure borders etc, show up */
zoom: 1;
}
+
+/* Color Palette
+ * Sizes designed so that table cell positions match icons in underlying image,
+ * which appear at 20x20 intervals.
+ */
+
.dijitColorPalette {
border: 1px solid #999;
background: #fff;
position: relative;
}
-img.dijitColorPaletteUnder {
-
- border-style: none;
- position: absolute;
- left: 0;
- top: 0;
-}
+
.dijitColorPalette .dijitPaletteTable {
-
+ /* Table that holds the palette cells, and overlays image file with color swatches.
+ * padding/margin to align table with image.
+ */
padding: 2px 3px 3px 3px;
position: relative;
overflow: hidden;
@@ -843,52 +1007,59 @@ img.dijitColorPaletteUnder {
.dj_ie6 .dijitColorPalette .dijitPaletteTable,
.dj_ie7 .dijitColorPalette .dijitPaletteTable,
.dj_iequirks .dijitColorPalette .dijitPaletteTable {
-
+ /* using padding above so that focus border isn't cutoff on moz/webkit,
+ * but using margin on IE because padding doesn't seem to work
+ */
padding: 0;
margin: 2px 3px 3px 3px;
}
+
.dijitColorPalette .dijitPaletteCell {
-
- height: 20px;
- width: 20px;
+ /* <td> in the <table> */
font-size: 1px;
vertical-align: middle;
text-align: center;
+ background: none;
}
.dijitColorPalette .dijitPaletteImg {
-
- width: 16px;
- height: 14px;
+ /* Called dijitPaletteImg for back-compat, this actually wraps the color swatch with a border and padding */
+ padding: 1px; /* white area between gray border and color swatch */
border: 1px solid #999;
+ margin: 2px 1px;
cursor: default;
- vertical-align: middle;
+ font-size: 1px; /* prevent <span> from getting bigger just to hold a character */
}
-.dj_iequirks .dijitColorPalette .dijitPaletteImg {
- margin: 1px;
+.dj_gecko .dijitColorPalette .dijitPaletteImg {
+ padding-bottom: 0; /* workaround rendering glitch on FF, it adds an extra pixel at the bottom */
+}
+.dijitColorPalette .dijitColorPaletteSwatch {
+ /* the actual part where the color is */
+ width: 14px;
+ height: 12px;
}
.dijitPaletteTable td {
- padding: 0px;
+ padding: 0;
}
.dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
-
+ /* hovered color swatch */
border: 1px solid #000;
}
+
.dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
.dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
border: 2px solid #000;
+ margin: 1px 0; /* reduce margin to compensate for increased border */
}
+
+
.dijit_a11y .dijitColorPalette .dijitPaletteTable,
.dijit_a11y .dijitColorPalette .dijitPaletteTable * {
-
+ /* table cells are to catch events, but the swatches are in the PaletteImg behind the table */
background-color: transparent !important;
}
-.dj_gecko .dijit_a11y .dijitColorPalette .dijitPaletteCellFocused .dijitPaletteImg {
- border: 3px dotted #000;
- margin: -1px;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
- border: 2px solid #000 !important;
-}
+
+/* AccordionContainer */
+
.dijitAccordionContainer {
border:1px solid #b7b7b7;
border-top:0 !important;
@@ -899,39 +1070,51 @@ img.dijitColorPaletteUnder {
.dijitAccordionTitleSelected {
cursor: default;
}
+
+/* images off, high-contrast mode styles */
.dijitAccordionTitle .arrowTextUp,
.dijitAccordionTitle .arrowTextDown {
display: none;
font-size: 0.65em;
font-weight: normal !important;
}
+
.dijit_a11y .dijitAccordionTitle .arrowTextUp,
.dijit_a11y .dijitAccordionTitleSelected .arrowTextDown {
display: inline;
}
+
.dijit_a11y .dijitAccordionTitleSelected .arrowTextUp {
display: none;
}
-.dj_ie6 .dijitAccordionTitle,
-.dj_iequirks .dijitAccordionTitle {
-
- zoom: 1;
+
+.dijitAccordionChildWrapper {
+ /* this is the node whose height is adjusted */
+ overflow: hidden;
}
+
+/* Calendar */
+
.dijitCalendarContainer {
- width: auto;
+ width: auto; /* in case user has specified a width for the TABLE nodes, see #10553 */
}
.dijitCalendarContainer th, .dijitCalendarContainer td {
padding: 0;
+ vertical-align: middle;
}
+
.dijitCalendarNextYear {
margin:0 0 0 0.55em;
}
+
.dijitCalendarPreviousYear {
margin:0 0.55em 0 0;
}
+
.dijitCalendarIncrementControl {
vertical-align: middle;
}
+
.dijitCalendarIncrementControl,
.dijitCalendarDateTemplate,
.dijitCalendarMonthLabel,
@@ -939,18 +1122,29 @@ img.dijitColorPaletteUnder {
.dijitCalendarNextYear {
cursor: pointer;
}
+
.dijitCalendarDisabledDate {
color: gray;
text-decoration: line-through;
cursor: default;
}
+
.dijitSpacer {
-
+ /* don't display it, but make it affect the width */
position: relative;
height: 1px;
overflow: hidden;
visibility: hidden;
}
+
+/* Styling for month drop down list */
+
+.dijitCalendarMonthMenu .dijitCalendarMonthLabel {
+ text-align:center;
+}
+
+/* Menu */
+
.dijitMenu {
border:1px solid black;
background-color:white;
@@ -960,26 +1154,38 @@ img.dijitColorPaletteUnder {
border-width:0;
background-color:white;
}
+
+/* workaround for webkit bug #8427, remove this when it is fixed upstream */
.dj_webkit .dijitMenuTable td[colspan="2"]{
border-right:hidden;
}
+
.dijitMenuItem {
text-align: left;
white-space: nowrap;
padding:.1em .2em;
cursor:pointer;
}
+
.dijitMenuPassive .dijitMenuItemHover,
.dijitMenuItemSelected {
-
+ /*
+ * dijitMenuItemHover refers to actual mouse over
+ * dijitMenuItemSelected is used after a menu has been "activated" by
+ * clicking it, tabbing into it, or being opened from a parent menu,
+ * and denotes that the menu item has focus or that focus is on a child
+ * menu
+ */
background-color:black;
color:white;
}
+
.dijitMenuItemIcon, .dijitMenuExpand {
background-repeat: no-repeat;
}
+
.dijitMenuItemDisabled * {
-
+ /* for a disabled menu item, just set it to mostly transparent */
opacity:0.5;
cursor:default;
}
@@ -990,10 +1196,12 @@ img.dijitColorPaletteUnder {
color:gray !important;
filter: alpha(opacity=35);
}
+
.dijitMenuItemLabel {
position: relative;
vertical-align: middle;
}
+
.dijit_a11y .dijitMenuItemSelected {
border: 1px dotted black !important;
}
@@ -1008,28 +1216,35 @@ img.dijitColorPaletteUnder {
.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
position:static;
}
+
.dijitMenuExpandA11y {
display: none;
}
.dijit_a11y .dijitMenuExpandA11y {
display: inline;
}
+
.dijitMenuSeparator td {
border: 0;
padding: 0;
}
+
+/* separator can be two pixels -- set border of either one to 0 to have only one */
.dijitMenuSeparatorTop {
height: 50%;
margin: 0;
margin-top:3px;
font-size: 1px;
}
+
.dijitMenuSeparatorBottom {
height: 50%;
margin: 0;
margin-bottom:3px;
font-size: 1px;
}
+
+/* the checked menu item */
.dijitCheckedMenuItemIconChar {
vertical-align: middle;
visibility:hidden;
@@ -1044,21 +1259,29 @@ img.dijitColorPaletteUnder {
display: none;
}
.dj_ie .dijit_a11y .dijitMenuBar .dijitMenuItem {
-
- margin: 0px;
+ /* so bottom border of MenuBar appears on IE7 in high-contrast mode */
+ margin: 0;
}
+
+/* StackContainer */
+
.dijitStackController .dijitToggleButtonChecked * {
- cursor: default;
+ cursor: default; /* because pressing it has no effect */
}
+
+/* TabContainer */
+
.dijitTabContainerNoLayout {
- width: 100%;
+ width: 100%; /* otherwise ScrollingTabController goes to 50K pixels wide */
}
+
.dijitTabContainerBottom-tabs,
.dijitTabContainerTop-tabs,
.dijitTabContainerLeft-tabs,
.dijitTabContainerRight-tabs {
- overflow: visible !important;
+ overflow: visible !important; /* so tabs can cover up border adjacent to container */
}
+
.dijitTabContainerBottom-container,
.dijitTabContainerTop-container,
.dijitTabContainerLeft-container,
@@ -1075,39 +1298,46 @@ img.dijitColorPaletteUnder {
.dijitTabListWrapper {
overflow: hidden;
}
+
.dijit_a11y .tabStripButton img {
-
+ /* hide the icons (or rather the empty space where they normally appear) because text will appear instead */
display: none;
}
+
.dijitTabContainerTop-tabs {
border-bottom: 1px solid black;
}
.dijitTabContainerTop-container {
- border-top: 0px;
+ border-top: 0;
}
+
.dijitTabContainerLeft-tabs {
border-right: 1px solid black;
float: left;
}
.dijitTabContainerLeft-container {
- border-left: 0px;
+ border-left: 0;
}
+
.dijitTabContainerBottom-tabs {
border-top: 1px solid black;
}
.dijitTabContainerBottom-container {
- border-bottom: 0px;
+ border-bottom: 0;
}
+
.dijitTabContainerRight-tabs {
border-left: 1px solid black;
float: left;
}
.dijitTabContainerRight-container {
- border-right: 0px;
+ border-right: 0;
}
+
DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
cursor: auto;
}
+
.dijitTab {
position:relative;
cursor:pointer;
@@ -1115,107 +1345,147 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
z-index:3;
}
.dijitTab * {
-
+ /* make tab icons and close icon line up w/text */
vertical-align: middle;
}
.dijitTabChecked {
- cursor: default;
+ cursor: default; /* because clicking will have no effect */
}
+
.dijitTabContainerTop-tabs .dijitTab {
- top: 1px;
+ top: 1px; /* to overlap border on .dijitTabContainerTop-tabs */
}
.dijitTabContainerBottom-tabs .dijitTab {
- top: -1px;
+ top: -1px; /* to overlap border on .dijitTabContainerBottom-tabs */
}
.dijitTabContainerLeft-tabs .dijitTab {
- left: 1px;
+ left: 1px; /* to overlap border on .dijitTabContainerLeft-tabs */
}
.dijitTabContainerRight-tabs .dijitTab {
- left: -1px;
+ left: -1px; /* to overlap border on .dijitTabContainerRight-tabs */
}
+
+
.dijitTabContainerTop-tabs .dijitTab,
.dijitTabContainerBottom-tabs .dijitTab {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
+ /* Inline-block */
+ 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 */
}
+
.dijitTabInnerDiv {
position:relative;
}
+
+
.tabStripButton {
z-index: 12;
}
+
.dijitTabButtonDisabled .tabStripButton {
display: none;
}
+
+
.dijitTabCloseButton {
margin-left: 1em;
}
+
.dijitTabCloseText {
display:none;
}
+
+.dijitTab .tabLabel {
+ /* make sure tabs w/close button and w/out close button are same height, even w/small (<15px) font.
+ * assumes <=15px height for close button icon.
+ */
+ min-height: 15px;
+ display: inline-block;
+}
+.dijitNoIcon {
+ /* applied to <img>/<span> node when there is no icon specified */
+ display: none;
+}
+.dj_ie6 .dijitTab .dijitNoIcon {
+ /* because min-height (on .tabLabel, above) doesn't work on IE6 */
+ display: inline;
+ height: 15px;
+ width: 1px;
+}
+
+/* images off, high-contrast mode styles */
+
.dijit_a11y .dijitTabCloseButton {
background-image: none !important;
width: auto !important;
height: auto !important;
- border: thin dotted;
-}
-.dijit_a11y .dijitTabCloseButtonHover {
- border:thin solid;
}
+
.dijit_a11y .dijitTabCloseText {
display: inline;
}
-.dijit_a11y .dijitTabChecked {
-
- border-style:dashed !important;
-}
-.dijit_a11y .dijitTabInnerDiv {
- border-left:none !important;
- }
+
.dijitTabPane,
.dijitStackContainer-child,
.dijitAccordionContainer-child {
-
+ /* children of TabContainer, StackContainer, and AccordionContainer shouldn't have borders
+ * b/c a border is already there from the TabContainer/StackContainer/AccordionContainer itself.
+ */
border: none !important;
}
+
+/* InlineEditBox */
.dijitInlineEditBoxDisplayMode {
- border: 1px solid transparent;
+ border: 1px solid transparent; /* so keyline (border) on hover can appear without screen jump */
cursor: text;
}
+
.dijit_a11y .dijitInlineEditBoxDisplayMode,
.dj_ie6 .dijitInlineEditBoxDisplayMode {
-
+ /* except that IE6 doesn't support transparent borders, nor does high contrast mode */
border: none;
}
+
.dijitInlineEditBoxDisplayModeHover,
.dijit_a11y .dijitInlineEditBoxDisplayModeHover,
.dj_ie6 .dijitInlineEditBoxDisplayModeHover {
-
+ /* An InlineEditBox in view mode (click this to edit the text) */
background-color: #e2ebf2;
border: solid 1px black;
}
+
.dijitInlineEditBoxDisplayModeDisabled {
cursor: default;
}
+
+/* Tree */
+.dijitTree {
+ overflow: auto; /* for scrollbars when Tree has a height setting, and to prevent wrapping around float elements, see #11491 */
+}
+
.dijitTreeIndent {
-
+ /* amount to indent each tree node (relative to parent node) */
width: 19px;
}
+
.dijitTreeRow, .dijitTreeContent {
white-space: nowrap;
}
+
.dijitTreeRow img {
-
+ /* make the expando and folder icons line up with the label */
vertical-align: middle;
}
+
.dijitTreeContent {
cursor: default;
}
+
.dijitExpandoText {
display: none;
}
+
.dijit_a11y .dijitExpandoText {
display: inline;
padding-left: 10px;
@@ -1225,14 +1495,19 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
border-width: thin;
cursor: pointer;
}
+
.dijitTreeLabel {
- margin: 0px 4px;
+ margin: 0 4px;
}
+
+/* Dialog */
+
.dijitDialog {
position: absolute;
z-index: 999;
- overflow: hidden;
+ overflow: hidden; /* override overflow: auto; from ContentPane to make dragging smoother */
}
+
.dijitDialogTitleBar {
cursor: move;
}
@@ -1250,38 +1525,49 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
display: none;
background: transparent !important;
}
+
.dijitDialogUnderlay {
background: #eee;
opacity: 0.5;
}
+
.dj_ie .dijitDialogUnderlay {
filter: alpha(opacity=50);
}
+
+/* images off, high-contrast mode styles */
.dijit_a11y .dijitSpinnerButtonContainer,
.dijit_a11y .dijitDialog {
opacity: 1 !important;
background-color: white !important;
}
+
.dijitDialog .closeText {
display:none;
-
+ /* for the onhover border in high contrast on IE: */
position:absolute;
}
+
.dijit_a11y .dijitDialog .closeText {
display:inline;
}
+
+/* Slider */
+
.dijitSliderMoveable {
z-index:99;
position:absolute !important;
display:block;
vertical-align:middle;
}
+
.dijitSliderMoveableH {
right:0;
}
.dijitSliderMoveableV {
right:50%;
}
+
.dijit_a11y DIV.dijitSliderImageHandle,
.dijitSliderImageHandle {
margin:0;
@@ -1296,177 +1582,217 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
font-size: 0;
}
.dj_ie7 .dijitSliderImageHandle {
- overflow: hidden;
+ overflow: hidden; /* IE7 workaround to make slider handle VISIBLE in non-a11y mode */
}
.dj_ie7 .dijit_a11y .dijitSliderImageHandle {
- overflow: visible;
+ overflow: visible; /* IE7 workaround to make slider handle VISIBLE in a11y mode */
}
.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
border:4px solid #000;
height:8px;
width:8px;
}
+
.dijitSliderImageHandleV {
top:-8px;
right: -50%;
}
+
.dijitSliderImageHandleH {
left:50%;
top:-5px;
vertical-align:top;
}
+
.dijitSliderBar {
border-style:solid;
border-color:black;
cursor: pointer;
}
+
.dijitSliderBarContainerV {
position:relative;
height:100%;
z-index:1;
}
+
.dijitSliderBarContainerH {
position:relative;
z-index:1;
}
+
.dijitSliderBarH {
height:4px;
border-width:1px 0;
}
+
.dijitSliderBarV {
width:4px;
border-width:0 1px;
}
+
.dijitSliderProgressBar {
background-color:red;
z-index:1;
}
+
.dijitSliderProgressBarV {
position:static !important;
- height:0%;
+ height:0;
vertical-align:top;
text-align:left;
}
+
.dijitSliderProgressBarH {
position:absolute !important;
- width:0%;
+ width:0;
vertical-align:middle;
overflow:visible;
}
+
.dijitSliderRemainingBar {
overflow:hidden;
background-color:transparent;
z-index:1;
}
+
.dijitSliderRemainingBarV {
height:100%;
text-align:left;
}
+
.dijitSliderRemainingBarH {
width:100% !important;
}
+
+/* the slider bumper is the space consumed by the slider handle when it hangs over an edge */
.dijitSliderBumper {
overflow:hidden;
z-index:1;
}
+
.dijitSliderBumperV {
width:4px;
height:8px;
border-width:0 1px;
}
+
.dijitSliderBumperH {
width:8px;
height:4px;
border-width:1px 0;
}
+
.dijitSliderBottomBumper,
.dijitSliderLeftBumper {
background-color:red;
}
+
.dijitSliderTopBumper,
.dijitSliderRightBumper {
background-color:transparent;
}
+
.dijitSliderDecoration {
text-align:center;
}
-.dijitSliderV TD {
- position: relative;
+
+.dijitSliderDecorationC,
+.dijitSliderDecorationV {
+ position: relative; /* needed for IE+quirks+RTL+vertical (rendering bug) but add everywhere for custom styling consistency but this messes up IE horizontal sliders */
}
+
.dijitSliderDecorationH {
width: 100%;
}
+
.dijitSliderDecorationV {
height: 100%;
}
+
.dijitSliderButton {
font-family:monospace;
margin:0;
padding:0;
display:block;
}
+
.dijit_a11y .dijitSliderButtonInner {
visibility:visible !important;
}
+
.dijitSliderButtonContainer {
text-align:center;
- height:0;
+ height:0; /* ??? */
}
.dijitSliderButtonContainer * {
cursor: pointer;
}
+
.dijitSlider .dijitButtonNode {
padding:0;
display:block;
}
+
.dijitRuleContainer {
position:relative;
overflow:visible;
}
+
.dijitRuleContainerV {
height:100%;
line-height:0;
float:left;
text-align:left;
}
+
.dj_opera .dijitRuleContainerV {
line-height:2%;
}
+
.dj_ie .dijitRuleContainerV {
line-height:normal;
}
+
.dj_gecko .dijitRuleContainerV {
- margin:0 0 1px 0;
+ margin:0 0 1px 0; /* mozilla bug workaround for float:left,height:100% block elements */
}
+
.dijitRuleMark {
position:absolute;
border:1px solid black;
line-height:0;
height:100%;
}
+
.dijitRuleMarkH {
width:0;
border-top-width:0 !important;
border-bottom-width:0 !important;
border-left-width:0 !important;
}
+
.dijitRuleLabelContainer {
position:absolute;
}
+
.dijitRuleLabelContainerH {
text-align:center;
display:inline-block;
}
+
.dijitRuleLabelH {
position:relative;
left:-50%;
}
+
.dijitRuleLabelV {
-
+ /* so that long labels don't overflow to multiple rows, or overwrite slider itself */
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
+
.dijitRuleMarkV {
height:0;
border-right-width:0 !important;
@@ -1475,9 +1801,11 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
width:100%;
left:0;
}
+
.dj_ie .dijitRuleLabelContainerV {
margin-top:-.55em;
}
+
.dijit_a11y .dijitSliderReadOnly,
.dijit_a11y .dijitSliderDisabled {
opacity:0.6;
@@ -1486,70 +1814,100 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
filter: alpha(opacity=40);
}
+
+/* + and - Slider buttons: override theme settings to display icons */
.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
- font-family: monospace;
+ font-family: monospace; /* otherwise hyphen is larger and more vertically centered */
font-size: 1em;
line-height: 1em;
height: auto;
width: auto;
- margin: 0px 4px;
+ margin: 0 4px;
}
+
+/* Icon-only buttons (often in toolbars) still display the text in high-contrast mode */
.dijit_a11y .dijitButtonContents .dijitButtonText,
.dijit_a11y .dijitTab .tabLabel {
display: inline !important;
}
+
+/* TextArea, SimpleTextArea */
.dijitTextArea {
width:100%;
- overflow-y: auto;
+ overflow-y: auto; /* w/out this IE's SimpleTextArea goes to overflow: scroll */
}
.dijitTextArea[cols] {
- width:auto;
+ width:auto; /* SimpleTextArea cols */
}
.dj_ie .dijitTextAreaCols {
width:auto;
}
+
+.dijitExpandingTextArea {
+ /* for auto exanding textarea (called Textarea currently, rename for 2.0) don't want to display the grip to resize */
+ resize: none;
+}
+
+
+/* Toolbar
+ * Note that other toolbar rules (for objects in toolbars) are scattered throughout this file.
+ */
+
.dijitToolbarSeparator {
height: 18px;
width: 5px;
padding: 0 1px;
margin: 0;
}
+
+/* Editor */
.dijitIEFixedToolbar {
position:absolute;
-
+ /* top:0; */
top: expression(eval((document.documentElement||document.body).scrollTop));
}
+
.dijitEditor {
- display: block;
+ display: block; /* prevents glitch on FF with InlineEditBox, see #8404 */
}
+
.dijitEditorDisabled,
.dijitEditorReadOnly {
color: gray;
}
+
+/* TimePicker */
+
.dijitTimePickerItemInner {
text-align:center;
border:0;
padding:2px 8px 2px 8px;
}
+
.dijitTimePickerTick,
.dijitTimePickerMarker {
border-bottom:1px solid gray;
}
+
.dijitTimePicker .dijitDownArrowButton {
border-top: none !important;
}
+
.dijitTimePickerTick {
color:#CCC;
}
+
.dijitTimePickerMarker {
color:black;
background-color:#CCC;
}
+
.dijitTimePickerItemSelected {
font-weight:bold;
color:#333;
background-color:#b7cdee;
}
+
.dijitTimePickerItemHover {
background-color:gray;
color:white;
@@ -1561,8 +1919,10 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
.dijit_a11y .dijitTimePickerItemHover .dijitTimePickerItemInner {
border: dashed 4px black;
}
+
+
.dijitToggleButtonIconChar {
-
+ /* character (instead of icon) to show that ToggleButton is checked */
display:none !important;
}
.dijit_a11y .dijitToggleButton .dijitToggleButtonIconChar {
@@ -1570,22 +1930,26 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
visibility:hidden;
}
.dj_ie6 .dijitToggleButtonIconChar, .dj_ie6 .tabStripButton .dijitButtonText {
- font-family: "Arial Unicode MS";
+ font-family: "Arial Unicode MS"; /* otherwise the a11y character (checkmark, arrow, etc.) appears as a box */
}
.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
- display: inline !important;
+ display: inline !important; /* In high contrast mode, display the check symbol */
visibility:visible !important;
}
+
.dijitArrowButtonChar {
display:none !important;
}
.dijit_a11y .dijitArrowButtonChar {
display:inline !important;
}
+
.dijit_a11y .dijitDropDownButton .dijitArrowButtonInner,
.dijit_a11y .dijitComboButton .dijitArrowButtonInner {
display:none !important;
}
+
+/* Select */
.dijitSelect {
margin: 0.2em;
border-collapse: collapse;
@@ -1593,7 +1957,7 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
.dj_ie .dijitSelect,
.dj_ie7 .dijitSelect,
.dj_iequirks .dijitSelect {
- vertical-align: middle;
+ vertical-align: middle; /* Set this back for what we hack in dijit inline */
}
.dj_ie8 .dijitSelect .dijitButtonText {
vertical-align: top;
@@ -1611,7 +1975,7 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
color:#999 !important;
}
.dijitSelect .dijitButtonContents {
- padding: 0px;
+ padding: 0;
background: transparent none;
white-space: nowrap;
text-align: left;
@@ -1619,36 +1983,50 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
.dijitSelectFixedWidth .dijitButtonContents {
width: 100%;
}
+
.dijitSelectMenu .dijitMenuItemIcon {
-
+ /* avoid blank area in left side of menu (since we have no icons) */
display:none;
}
.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
-
+ /* Set back to static due to bug in ie6/ie7 - See Bug #9651 */
position: static;
}
+
+/* Fix the baseline of our label (for multi-size font elements) */
.dijitSelectLabel *
{
vertical-align: baseline;
}
+
+/* Styling for the currently-selected option (rich text can mess this up) */
.dijitSelectSelectedOption * {
font-weight: bold;
}
+
+/* Fix the styling of the dropdown menu to be more combobox-like */
.dijitSelectMenu {
border-width: 1px;
}
+
+/* Style the different areas of the button to look like a "real" dropdown */
+/* Remove margins on the sub-table */
.dijitSelectMenu .dijitMenuTable {
- margin: 0px;
+ margin: 0;
background-color: transparent;
}
+
+/* Used in cases, such as FullScreen plugin, when we need to force stuff to static positioning. */
.dijitForceStatic {
position: static !important;
}
+
+/**** Disabled cursor *****/
.dijitReadOnly *,
.dijitDisabled *,
.dijitReadOnly,
.dijitDisabled {
-
+ /* a region the user would be able to click on, but it's disabled */
cursor: default;
}
diff --git a/lib/dijit/themes/dijit_rtl.css b/lib/dijit/themes/dijit_rtl.css
index d1dc4fe15..8ef3a285d 100644
--- a/lib/dijit/themes/dijit_rtl.css
+++ b/lib/dijit/themes/dijit_rtl.css
@@ -2,87 +2,117 @@
left: auto;
right: 0;
}
+
+/* Menu */
+
.dijitMenuItemRtl {
text-align: right;
}
+
+/* Button */
+
.dj_iequirks .dijitComboButtonRtl BUTTON {
-
+ /* workaround bug where label invisible (themeTesterQuirk.html?dir=rtl) */
float:left;
}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
+
+/* TextBox, ComboBox, Spinner */
+
+.dijitTextBoxRtl .dijitValidationContainer,
.dijitTextBoxRtl .dijitSpinnerButtonContainer,
.dijitComboBoxRtl .dijitArrowButtonContainer {
-
+ /* combobox and spinner: line between the input area and the drop down button */
border-right-width: 1px !important;
- border-right-style: solid !important;
- border-left-width: 0px !important;
- border-left-style: none !important;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijit_a11y .dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBoxRtl .dijitArrowButtonContainer {
- border-right: 1px solid black !important;
- border-left: 0px none black !important;
+ border-left-width: 0 !important;
}
+
.dijitSpinnerRtl .dijitSpinnerButtonContainer .dijitArrowButton {
right: 0;
left: auto;
}
+
.dijitTextBoxRtl .dijitSpinnerButtonContainer,
.dijitTextBoxRtl .dijitValidationContainer,
.dijitTextBoxRtl .dijitArrowButtonContainer {
float: left;
}
+
+/* Calendar */
+
.dijitCalendarRtl .dijitCalendarNextYear {
margin:0 0.55em 0 0;
}
+
.dijitCalendarRtl .dijitCalendarPreviousYear {
margin:0 0 0 0.55em;
}
+
+
+/* Slider */
+
.dijitSliderRtl .dijitSliderImageHandleV {
left:auto;
}
+
.dijitSliderRtl .dijitSliderImageHandleH {
left:-50%;
}
+
.dijitSliderRtl .dijitSliderMoveableH {
right:auto;
left:0;
}
+
.dijitSliderRtl .dijitRuleContainerV {
float:right;
}
+
.dj_ie .dijitSliderRtl .dijitRuleContainerV {
text-align:right;
}
+
.dj_ie .dijitSliderRtl .dijitRuleLabelV {
text-align:left;
}
+
.dj_ie .dijitSliderRtl .dijitRuleLabelH {
zoom:1;
}
+
.dijitSliderRtl .dijitSliderProgressBarH {
-
+ /* workarounds for IE and FF */
float:right;
right:0;
left:auto;
}
+
+/* ContentPane*/
.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
background-position:right;
padding-right:25px;
}
+
+/* TabContainer */
+
.dijitTabRtl .dijitTabCloseButton {
- margin-left: 0px;
+ margin-left: 0;
margin-right: 1em;
}
+
+/* TimePicker */
.dj_ie .dijitTimePickerRtl .dijitTimePickerItem {
width:100%;
}
+
+
+/* ColorPalette */
.dijitColorPaletteRtl .dijitColorPaletteUnder {
-
+ /* needed in RTL mode when DropDownButton expands the ColorPalette beyond it's natural width */
left: auto;
right: 0;
}
+
+/* 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 a193f8ddf..2c9248b08 100644
--- a/lib/dijit/themes/nihilo/Calendar.css
+++ b/lib/dijit/themes/nihilo/Calendar.css
@@ -1,6 +1,7 @@
+/* Calendar*/
.nihilo .dijitCalendarIncrementControl {
-
+ /* next/prev month buttons */
width:15px;
height:15px;
background-image: url("images/spriteRoundedIconsSmall.png");
@@ -10,15 +11,18 @@
font-size:.1em;
background-image: url("images/spriteRoundedIconsSmall.gif");
}
+
.nihilo .dijitA11ySideArrow {
display: none;
}
+
.nihilo .dijitCalendarDecrease {
background-position: top left;
}
.nihilo .dijitCalendarIncrease {
background-position: -30px top;
}
+
.nihilo table.dijitCalendarContainer {
font-size: 100%;
border-spacing: 0;
@@ -26,8 +30,9 @@
border: 1px solid #ccc;
margin: 0;
}
+
.nihilo .dijitCalendarMonthContainer th {
-
+ /* month header cell */
background:#d3d3d3 url("images/titleBar.png") repeat-x top;
padding-top:.3em;
padding-bottom:.2em;
@@ -37,8 +42,9 @@
padding-top:.2em;
padding-bottom:.1em;
}
+
.nihilo .dijitCalendarDayLabelTemplate {
-
+ /* day of week labels */
background:#fefefe;
font-weight:normal;
padding-top:.15em;
@@ -47,15 +53,19 @@
color:#293a4b;
text-align:center;
}
+
.nihilo .dijitCalendarBodyContainer {
border-bottom: 1px solid #eeeeee;
}
+
.nihilo .dijitCalendarMonthLabel {
color:#293a4b;
font-weight: bold;
+ padding: 0 4px;
}
+
.nihilo .dijitCalendarDateTemplate {
-
+ /* style for each day cell */
font-size: 0.9em;
font-weight: bold;
text-align: center;
@@ -64,54 +74,86 @@
background-color: #fdfdfd;
border:#fdfdfd solid 1px !important;
}
+
.dj_ie .nihilo .dijitCalendarDateTemplate {
padding: 0.1em .33em 0.02em .33em;
}
+
.nihilo .dijitCalendarPreviousMonth,
.nihilo .dijitCalendarNextMonth {
-
+ /* days that are part of the previous or next month */
color:#999999;
background-color:#f5f5f5 !important;
border:#f5f5f5 solid 1px !important;
}
+
.nihilo .dijitCalendarCurrentMonth {
-
+ /* days that are part of this month */
}
+
.nihilo .dijitCalendarDisabledDate {
text-decoration:line-through !important;
}
+
.nihilo .dijitCalendarCurrentDate {
-
+ /* cell for today's date */
text-decoration:underline;
font-weight:bold;
}
+
.nihilo .dijitCalendarSelectedDate {
-
+ /* cell for the selected date */
background-color:#ffe284 !important;
color:black !important;
border:#f7c95c solid 1px !important;
}
+
+
.nihilo .dijitCalendarYearContainer {
-
+ /* footer of the table that contains the year display/selector */
background:white url("images/titleBar.png") repeat-x top;
}
+
.nihilo .dijitCalendarYearLabel {
-
+ /* container for all of 3 year labels */
margin:0;
padding:0.4em 0 0.25em 0;
text-align:center;
}
+
.nihilo .dijitCalendarSelectedYear {
-
+ /* label for selected year */
color:black;
padding:0.2em;
padding-bottom:0.1em;
background-color:#ffe284 !important;
border:#f7c95c solid 1px !important;
}
+
.nihilo .dijitCalendarNextYear,
.nihilo .dijitCalendarPreviousYear {
-
+ /* label for next/prev years */
color:black !important;
font-weight:normal;
}
+
+/* Styling for month DropDownButton */
+
+.nihilo .dijitCalendar .dijitDropDownButton {
+ margin: 0;
+}
+.nihilo .dijitCalendar .dijitButtonText {
+ padding: 0;
+}
+.nihilo .dijitCalendar .dijitDropDownButton .dijitButtonNode {
+ background-color: transparent;
+ background-image: none;
+ padding: 0;
+}
+
+/* Styling for month drop down list */
+
+.nihilo .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
+ background-color: #ffe284;
+ color: #243C5F;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/Calendar_rtl.css b/lib/dijit/themes/nihilo/Calendar_rtl.css
index 245d93fef..6fc06f4e3 100644
--- a/lib/dijit/themes/nihilo/Calendar_rtl.css
+++ b/lib/dijit/themes/nihilo/Calendar_rtl.css
@@ -1,7 +1,9 @@
+/* Calendar */
.dijitRtl .nihilo .dijitCalendarDecrease {
background-position: -30px top;
}
+
.dijitRtl .nihilo .dijitCalendarIncrease {
- background-position: 0px top;
+ background-position: 0 top;
}
diff --git a/lib/dijit/themes/nihilo/ColorPalette.css b/lib/dijit/themes/nihilo/ColorPalette.css
index 328bc84a4..8fbe9d7ef 100644
--- a/lib/dijit/themes/nihilo/ColorPalette.css
+++ b/lib/dijit/themes/nihilo/ColorPalette.css
@@ -1,5 +1,5 @@
.dijitColorPalette {
border:1px solid #d3d3d3;
background:#fff;
- -moz-border-radius: 0px !important;
-}
+ -moz-border-radius: 0 !important;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/Common.css b/lib/dijit/themes/nihilo/Common.css
index c894deadf..498699083 100644
--- a/lib/dijit/themes/nihilo/Common.css
+++ b/lib/dijit/themes/nihilo/Common.css
@@ -1,13 +1,17 @@
-
+/* DnD avatar-specific settings */
+/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
.nihilo .dojoDndItemBefore {
border-top: 2px solid #369;
}
+
.nihilo .dojoDndItemAfter {
border-bottom: 2px solid #369;
}
+
.nihilo .dojoDndItemOver {
cursor:pointer;
}
+
.nihilo table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
.nihilo .dojoDndAvatar td { border: none; }
.nihilo .dojoDndAvatar tr { border: none; }
diff --git a/lib/dijit/themes/nihilo/Dialog.css b/lib/dijit/themes/nihilo/Dialog.css
index 1c2ff2e3d..4affeb866 100644
--- a/lib/dijit/themes/nihilo/Dialog.css
+++ b/lib/dijit/themes/nihilo/Dialog.css
@@ -1,33 +1,39 @@
+/* Dialog */
.nihilo .dijitDialog {
background: #eee;
border: 1px solid #d3d3d3;
- -webkit-box-shadow: 0px 5px 10px #adadad;
- padding: 0px;
+ -webkit-box-shadow: 0 5px 10px #adadad;
+ padding: 0;
}
+
.nihilo .dijitDialog .dijitDialogTitle {
-
+ /* typography and styling of the dialog title */
font-size: 0.9em;
- color: #3243C5F;
+ color: #243C5F;
font-weight: bold;
- padding: 0px 4px;
+ padding: 0 4px;
}
+
.nihilo .dijitDialog .dijitDialogPaneContent {
background: #ffffff;
border-top: 1px solid #d3d3d3;
padding:10px;
+
}
+
.nihilo .dijitDialogTitleBar {
-
+ /* outer container for the titlebar of the dialog */
background: #fafafa url("images/titleBar.png") repeat-x top left;
padding: 5px 6px 3px 6px;
- outline:0;
+ outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
}
+
.nihilo .dijitDialogCloseIcon {
-
+ /* the default close icon for the dialog */
background-image: url("images/spriteRoundedIconsSmall.png");
background-repeat: no-repeat;
- background-position: -60px 0px;
+ background-position: -60px 0;
position: absolute;
vertical-align: middle;
right: 6px;
@@ -41,49 +47,69 @@
.nihilo .dijitDialogCloseIconHover {
background-position: -60px -15px;
}
+
+/* Tooltip and TooltipDialog */
+
.nihilo .dijitTooltip,
.nihilo .dijitTooltipDialog {
-
- background: transparent;
+ /* the outermost dom node, holding the connector and container */
+ background: transparent; /* make the area on the sides of the arrow transparent */
}
+
.dijitTooltipBelow {
-
+ /* leave room for arrow above content */
padding-top: 10px;
}
+
.dijitTooltipAbove {
-
+ /* leave room for arrow below content */
padding-bottom: 10px;
}
+
.nihilo .dijitTooltipContainer {
-
+ /*
+ The part with the text.
+
+ NOTE:
+ FF doesn't clip images used as CSS bgs if you specify a border
+ radius. If you use a solid color, it does. Webkit gets it right.
+ Sigh.
+ background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
+ */
background-color: #fff;
border:1px solid #d3d3d3;
padding:0.45em;
}
+
.nihilo .dijitTooltipConnector {
-
- border:0px;
+ /* the arrow piece */
+ border:0;
z-index: 2;
}
+
.nihilo .dijitTooltipABRight .dijitTooltipConnector {
-
+ /* above or below tooltip, but the arrow appears on the right,
+ and the right edges of target and tooltip are aligned rather than the left */
left: auto !important;
right: 6px;
}
+
.nihilo .dijitTooltipBelow .dijitTooltipConnector {
-
- top: 0px;
+ /* the arrow piece for tooltips below an element */
+ top: 0;
left: 6px;
background:url("images/tooltipConnectorUp.png") no-repeat top left;
width:17px;
height:11px;
}
+
.dj_ie .nihilo .dijitTooltipBelow .dijitTooltipConnector {
background-image: url("images/tooltipConnectorUp.gif");
}
+
.nihilo .dijitTooltipAbove .dijitTooltipConnector {
-
- bottom: 0px;
+ /* the arrow piece for tooltips above an element */
+ bottom: 0;
left: 6px;
background:url("images/tooltipConnectorDown.png") no-repeat top left;
width:17px;
@@ -95,16 +121,13 @@
.dj_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
bottom: -5px;
}
+
.nihilo .dijitTooltipLeft {
padding-right: 10px;
}
-.dj_ie6 .nihilo .dijitTooltipLeft {
- padding-left: 11px;
-}
.nihilo .dijitTooltipLeft .dijitTooltipConnector {
-
- right: 0px;
- bottom: 3px;
+ /* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+ right: 0;
background:url("images/tooltipConnectorRight.png") no-repeat top left;
width:11px;
height:17px;
@@ -112,13 +135,13 @@
.dj_ie .nihilo .dijitTooltipLeft .dijitTooltipConnector {
background-image: url("images/tooltipConnectorRight.gif");
}
+
.nihilo .dijitTooltipRight {
padding-left: 10px;
}
.nihilo .dijitTooltipRight .dijitTooltipConnector {
-
- left: 0px;
- bottom: 3px;
+ /* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+ left: 0;
background:url("images/tooltipConnectorLeft.png") no-repeat top left;
width:11px;
height:17px;
@@ -126,3 +149,4 @@
.dj_ie .nihilo .dijitTooltipRight .dijitTooltipConnector {
background-image: url("images/tooltipConnectorLeft.gif");
}
+
diff --git a/lib/dijit/themes/nihilo/Dialog_rtl.css b/lib/dijit/themes/nihilo/Dialog_rtl.css
index 105d5040c..5e0cffc3d 100644
--- a/lib/dijit/themes/nihilo/Dialog_rtl.css
+++ b/lib/dijit/themes/nihilo/Dialog_rtl.css
@@ -1,3 +1,4 @@
+/* Dialog */
.dijitRtl .nihilo .dijitDialogTitleBar .dijitDialogCloseIcon {
right: auto;
diff --git a/lib/dijit/themes/nihilo/Editor.css b/lib/dijit/themes/nihilo/Editor.css
index 77280d9af..108aae78c 100644
--- a/lib/dijit/themes/nihilo/Editor.css
+++ b/lib/dijit/themes/nihilo/Editor.css
@@ -1,13 +1,16 @@
.nihilo .dijitToolbar .dijitToolbarSeparator {
- background: url('../../icons/images/editorIconsEnabled.png');
+ background: url('../../icons/images/editorIconsEnabled.png'); /* separator in editor icons sprite image - enabled state */
}
+
+/**** ICONS *****/
+
.nihilo .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsEnabled.png');
+ background-image: url('../../icons/images/editorIconsEnabled.png'); /* editor icons sprite image - enabled state */
background-repeat: no-repeat;
width: 18px;
height: 18px;
text-align: center;
}
.nihilo .dijitDisabled .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsDisabled.png');
+ background-image: url('../../icons/images/editorIconsDisabled.png'); /* editor icons sprite image - disabled state */
}
diff --git a/lib/dijit/themes/nihilo/Editor_rtl.css b/lib/dijit/themes/nihilo/Editor_rtl.css
index 37849a5bd..ca1cc0c86 100644
--- a/lib/dijit/themes/nihilo/Editor_rtl.css
+++ b/lib/dijit/themes/nihilo/Editor_rtl.css
@@ -1,7 +1,9 @@
-
+/* Editor */
.dijitRtl .nihilo .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsEnabled_rtl.png');
+ background-image: url('../../icons/images/editorIconsEnabled_rtl.png'); /* editor icons sprite image - enabled state */
}
.dijitRtl .nihilo .dijitDisabled .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsDisabled_rtl.png');
+ background-image: url('../../icons/images/editorIconsDisabled_rtl.png'); /* editor icons sprite image - disabled state */
}
+
+
diff --git a/lib/dijit/themes/nihilo/Menu.css b/lib/dijit/themes/nihilo/Menu.css
index b530a90b1..cad469863 100644
--- a/lib/dijit/themes/nihilo/Menu.css
+++ b/lib/dijit/themes/nihilo/Menu.css
@@ -1,37 +1,44 @@
+/* Menu */
.nihilo .dijitMenu,
.nihilo .dijitMenuBar {
border: 1px solid #d3d3d3;
- margin: 0px;
- padding: 0px;
+ margin: 0;
+ padding: 0;
background-color: #fff;
}
+
.nihilo .dijitBorderContainer .dijitMenuBar {
border: 1px #ccc solid;
}
+
.nihilo .dijitMenuItem {
font-family: sans-serif;
- margin: 0px;
+ margin: 0;
color: #243C5F;
}
.nihilo .dijitMenuBar .dijitMenuItem {
padding: 4px 5px;
}
+
.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
font-style: italic;
}
.nihilo .dijitMenuItem TD {
padding:1px;
}
+
.nihilo .dijitMenuPassive .dijitMenuItemHover,
.nihilo .dijitMenuItemSelected {
- background-color: #ffe284;
+ background-color: #ffe284; /* #95a0b0; #555555; #aaaaaa; #646464; #60a1ea; #848484; */
color: #243C5F;
}
+
.nihilo .dijitMenuItemIcon {
width: 15px;
height: 15px;
}
+
.nihilo .dijitMenuExpand {
width:15px;
height:15px;
@@ -41,22 +48,30 @@
.dj_ie6 .nihilo .dijitMenuExpand {
background-image:url('images/spriteRoundedIconsSmall.gif');
}
+
.nihilo .dijitMenuSeparator {
height: 1px;
}
+
+/* separator can be two pixels -- set border of either one to 0 to have only one */
.nihilo .dijitMenuSeparatorTop {
- border-bottom: 1px solid #fff;
+ border-bottom: 1px solid #fff; /*97adcb; */
}
+
.nihilo .dijitMenuSeparatorBottom {
border-top: 1px solid #d3d3d3;
}
+
+/* the checked menu item */
.nihilo .dijitCheckedMenuItemIconChar {
display: none;
}
+
.nihilo .dijitCheckedMenuItemIcon {
background-image: url('images/spriteCheckbox.gif');
background-position: -80px;
}
+
.nihilo .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
background-position: -64px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/Menu_rtl.css b/lib/dijit/themes/nihilo/Menu_rtl.css
index 06fccbf81..40b3b4124 100644
--- a/lib/dijit/themes/nihilo/Menu_rtl.css
+++ b/lib/dijit/themes/nihilo/Menu_rtl.css
@@ -1,8 +1,10 @@
+/* Menu */
.dijitRtl .nihilo .dijitMenuItem .dijitMenuItemIcon {
padding-left: 3px;
- padding-right: 0px;
+ padding-right: 0;
}
+
.dijitRtl .nihilo .dijitMenuItem .dijitMenuExpand {
- background-position: 0px top;
-}
+ background-position: 0 top;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/ProgressBar.css b/lib/dijit/themes/nihilo/ProgressBar.css
index 7713aeb7c..6c50a7ef6 100644
--- a/lib/dijit/themes/nihilo/ProgressBar.css
+++ b/lib/dijit/themes/nihilo/ProgressBar.css
@@ -1,24 +1,33 @@
+/****
+ dijit.ProgressBar
+ ****/
+
.nihilo .dijitProgressBar {
- margin:2px 0px 2px 0px;
+ margin:2px 0 2px 0;
}
+
.nihilo .dijitProgressBarEmpty{
-
+ /* outer container and background of the bar that's not finished yet*/
background:#fff url("images/progressBarEmpty.png") repeat-x center center;
border-color: #f8d582 #f8d582 #f8d582 #f8d582;
}
+
.nihilo .dijitProgressBarTile{
-
+ /* inner container for finished portion when in 'tile' (image) mode */
background:#f0f0f0 url("images/progressBarFull.png") repeat-x center center;
}
+
.nihilo .dijitProgressBarFull {
border-right:1px solid #f8d582;
}
+
.nihilo .dijitProgressBarLabel {
-
+ /* Set to a color that contrasts with both the "Empty" and "Full" parts. */
color:#293a4b;
}
+
.nihilo .dijitProgressBarIndeterminate .dijitProgressBarTile {
-
+ /* use an animated gif for the progress bar in 'indeterminate' mode */
background:#cad2de url("images/progressBarAnim.gif") repeat-x center center;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/TimePicker.css b/lib/dijit/themes/nihilo/TimePicker.css
index 63157f29c..cffdbf55f 100644
--- a/lib/dijit/themes/nihilo/TimePicker.css
+++ b/lib/dijit/themes/nihilo/TimePicker.css
@@ -1,42 +1,51 @@
-
+/* Time Picker */
.nihilo .dijitTimePickerTick,
.nihilo .dijitTimePickerMarker {
border-color: #eeeeee;
}
+
.nihilo .dijitTimePickerTick {
color:white;
}
+
.nihilo .dijitTimePickerMarker {
background:#d3d3d3 url("images/titleBar.png") repeat-x top;
color:#293a4b;
font-weight: bold;
}
+
.nihilo .dijitTimePickerItemSelected {
color: black;
background: #ffe284 none;
}
+
.nihilo .dijitTimePickerItemHover {
background: #d6d6dd none;
color:black;
}
+
.nihilo .dijitTimePickerItemHover,
.nihilo .dijitTimePickerItemSelected {
position: relative;
z-index: 10;
}
+
.nihilo .dijitTimePickerTick .dijitTimePickerItemInner {
font-size:0.4em;
}
+
.nihilo .dijitTimePickerItemHover .dijitTimePickerItemInner,
.nihilo .dijitTimePickerItemSelected .dijitTimePickerItemInner {
font-size:1em;
}
+
.nihilo .dijitTimePickerMarkerHover {
border-top: 1px solid #eeeeee;
}
+
.nihilo .dijitTimePickerTickHover,
.nihilo .dijitTimePickerTickSelected {
margin-top:-0.3em;
margin-bottom:-0.3em;
border-bottom: none;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/TimePicker_rtl.css b/lib/dijit/themes/nihilo/TimePicker_rtl.css
index a6c0a68e7..50848c3fb 100644
--- a/lib/dijit/themes/nihilo/TimePicker_rtl.css
+++ b/lib/dijit/themes/nihilo/TimePicker_rtl.css
@@ -1,4 +1,4 @@
.dj_ie6-rtl .nihilo .dijitTimePickerMarkerHover,
.dj_ie7-rtl .nihilo .dijitTimePickerMarkerHover {
- border-top: 0px;
+ border-top: 0; /* IE6/7 bug causes mouseover/out event storm */
}
diff --git a/lib/dijit/themes/nihilo/TitlePane.css b/lib/dijit/themes/nihilo/TitlePane.css
index 58ca8e56c..6d16ff940 100644
--- a/lib/dijit/themes/nihilo/TitlePane.css
+++ b/lib/dijit/themes/nihilo/TitlePane.css
@@ -1,3 +1,7 @@
+/**
+ * dijit.TitlePane
+ *
+ */
.nihilo .dijitTitlePaneTitle {
background: #cccccc;
@@ -11,14 +15,17 @@
.nihilo .dijitTitlePaneTitleHover {
background: #f9f9f9 url("images/accordionItemActive.png") top repeat-x;
}
+
.nihilo .dijitTitlePane .dijitOpen .dijitArrowNode,
.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
width:15px;
height:15px;
}
+
.nihilo .dijitTitlePaneTextNode {
color: #243C5F;
}
+
.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
background: url('images/spriteRoundedIconsSmall.png') no-repeat -30px top;
}
@@ -31,15 +38,17 @@
.dj_ie6 .nihilo .dijitTitlePane .dijitOpen .dijitArrowNode {
background:url('images/spriteRoundedIconsSmall.gif') no-repeat -15px top;
}
+
.nihilo .dijitTitlePaneContentOuter {
background: #ffffff;
border:1px solid #bfbfbf;
- border-top: 0px;
+ border-top: 0;
}
.nihilo .dijitTitlePaneContentInner {
padding:10px;
}
+
.nihilo .dijitTitlePaneTextNode {
margin-left: 4px;
margin-right: 4px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/TitlePane_rtl.css b/lib/dijit/themes/nihilo/TitlePane_rtl.css
index a8aef8334..7b3ba21f2 100644
--- a/lib/dijit/themes/nihilo/TitlePane_rtl.css
+++ b/lib/dijit/themes/nihilo/TitlePane_rtl.css
@@ -1,6 +1,6 @@
.dijitRtl .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: 0px top;
+ background-position: 0 top;
}
.dj_ie6-rtl .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: 0px top;
-}
+ background-position: 0 top;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/Toolbar.css b/lib/dijit/themes/nihilo/Toolbar.css
index aeee9e4ed..1c3e32702 100644
--- a/lib/dijit/themes/nihilo/Toolbar.css
+++ b/lib/dijit/themes/nihilo/Toolbar.css
@@ -2,32 +2,38 @@
border-bottom: 1px solid #ccc;
background:#eaeaea url("images/titleBar.png") repeat-x top left;
}
+
+/* setting a min-height on ditor toolbar */
.dj_ie6 .nihilo .dijitToolbar {
height: 10px;
}
+
.nihilo .dijitToolbar .dijitButtonNode,
.nihilo .dijitToolbar .dijitComboButton .dijitButtonContents,
.nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButton {
background: none;
- margin: 0px;
- padding: 0px;
+ margin: 0;
+ padding: 0;
border: none;
font-size: 12px;
}
+
.nihilo .dijitToolbar .dijitButton,
.nihilo .dijitToolbar .dijitToggleButton,
.nihilo .dijitToolbar .dijitDropDownButton,
.nihilo .dijitToolbar .dijitComboButton .dijitButtonContents,
.nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButton {
background: none;
- padding: 1px;
+ padding: 1px; /* on hover etc., margin replaced w/border */
}
+
.nihilo .dijitToolbar .dijitButtonChecked,
.nihilo .dijitToolbar .dijitToggleButtonChecked {
background-color:#ffeeb9;
border:1px solid #f7c95c;
padding: 0;
}
+
.nihilo .dijitToolbar .dijitButtonCheckedHover,
.nihilo .dijitToolbar .dijitToggleButtonCheckedHover
{
@@ -35,22 +41,25 @@
border:1px solid #f7c95c;
padding: 0;
}
+
.nihilo .dijitToolbar .dijitButtonHover,
.nihilo .dijitToolbar .dijitToggleButtonHover,
.nihilo .dijitToolbar .dijitDropDownButtonHover,
.nihilo .dijitToolbar .dijitComboButton .dijitButtonContentsHover,
.nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover {
-
+ /* TODO: change this from Hover to Selected so that button is still highlighted while drop down is being used */
border: 1px solid #f7c95c;
padding: 0;
background-color:#ffe284;
}
+
.nihilo .dijitToolbar label {
padding: 3px 3px 0 6px;
}
+
.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
-
+ /* focus border doesn't appear on <td> for IE, so need to add it manually */
border: 1px #555 dotted !important;
- padding: 0px;
-}
+ padding: 0;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/Tree.css b/lib/dijit/themes/nihilo/Tree.css
index b0012be1e..a33b9696e 100644
--- a/lib/dijit/themes/nihilo/Tree.css
+++ b/lib/dijit/themes/nihilo/Tree.css
@@ -1,75 +1,100 @@
+/* Tree */
.nihilo .dijitTreeNode {
background : url('images/treeI.gif') no-repeat;
background-position : top left;
background-repeat : repeat-y;
- zoom: 1;
+ zoom: 1;
}
+
+/* left vertical line (grid) for all nodes */
.nihilo .dijitTreeIsLast {
background: url('images/treeI_half.gif') no-repeat;
}
+
.nihilo .dijitTreeRowHover {
-
+ /* using a transparent png so that we can still see grid lines, which are (unfortunately) behind the dijitRowNode that we are hovering over */
background-image: url(images/treeHover.png);
background-repeat: repeat;
background-color: transparent !important;
}
+
.nihilo .dijitTreeLabel {
font-weight: normal;
margin-left: 3px;
}
+
.nihilo .dijitTreeIsRoot {
margin-left: 0;
background-image: none;
}
+
.nihilo .dijitTreeExpando {
width: 18px;
height: 18px;
}
+
.nihilo .dijitTreeRow {
-
+ /* so insert line shows up on IE when dropping after a target element */
padding-bottom: 2px;
}
+
.nihilo .dijitTreeContent {
min-height: 18px;
min-width: 18px;
padding-left:1px;
}
+
.nihilo .dijitTreeExpandoOpened {
background: url('images/spriteTree.gif') no-repeat -18px top;
}
+
.nihilo .dijitTreeExpandoClosed {
background-image: url('images/spriteTree.gif');
}
+
.nihilo .dijitTreeExpandoLeaf {
background: url('images/spriteTree.gif') no-repeat -36px top;
}
+
.nihilo .dijitTreeExpandoLoading {
background-image: url('images/treeExpand_loading.gif');
}
+
.nihilo .dijitTreeIcon {
width: 16px;
height: 16px;
}
+
.nihilo .dijitFolderOpened {
background: url('images/spriteDivIcons.gif') no-repeat -16px top;
}
+
.nihilo .dijitFolderClosed {
background: url('images/spriteDivIcons.gif') no-repeat top left;
}
+
.nihilo .dijitLeaf {
background: url('images/spriteDivIcons.gif') no-repeat -32px top;
}
+
+/* Drag and Drop on TreeNodes
+ * Put insert line on dijitTreeContent node so it's aligned w/
+ * (ie, indented equally with) target element, even
+ * though dijitTreeRowNode is the actual "drag object"
+ */
.nihilo .dijitTreeNode .dojoDndItemBefore,
.nihilo .dijitTreeNode .dojoDndItemAfter {
border-bottom: none;
border-top: none;
}
+
.nihilo .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
-
+ /* copied from Common.css */
border-top: 2px solid #369;
}
+
.nihilo .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
-
+ /* copied from Common.css */
border-bottom: 2px solid #369;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/Tree_rtl.css b/lib/dijit/themes/nihilo/Tree_rtl.css
index 6a7a889ba..4462ed1bf 100644
--- a/lib/dijit/themes/nihilo/Tree_rtl.css
+++ b/lib/dijit/themes/nihilo/Tree_rtl.css
@@ -1,18 +1,22 @@
+/* Tree */
.dijitRtl .nihilo .dijitTreeNode,
.dijitRtl .nihilo .dijitTreeExpandoLeaf {
-
+ /* disable grid lines for Tree in RTL mode, too hard to support */
background-image: none;
}
+
.dijitRtl .nihilo .dijitTreeContent {
- padding-left: 0px;
+ padding-left: 0;
padding-right: 1px;
}
+
.dijitRtl .nihilo .dijitTreeExpandoOpened {
-
+ /* todo: icon contains grid line but grid lines disabled above */
background: url('images/spriteTree_rtl.gif') no-repeat -18px top;
}
+
.dijitRtl .nihilo .dijitTreeExpandoClosed {
-
+ /* todo: icon contains grid line but grid lines disabled above */
background-image: url('images/spriteTree_rtl.gif');
}
diff --git a/lib/dijit/themes/nihilo/form/Button.css b/lib/dijit/themes/nihilo/form/Button.css
index b1ea84e96..0be9ea4a3 100644
--- a/lib/dijit/themes/nihilo/form/Button.css
+++ b/lib/dijit/themes/nihilo/form/Button.css
@@ -1,28 +1,42 @@
+/*****
+ dijit.form.Button
+ dijit.form.DropDownButton
+ dijit.form.ComboButton
+ dijit.form.ComboBox (partial)
+ dijit.form.Spinner (partial) (TODO: create NumberSpinner.css file like claro has)
+ *****/
+
.nihilo .dijitButtonNode {
-
-
+ /* enabled state - inner */
+ /* border:1px outset #a0a0a0; */
border:1px solid #dedede;
border-bottom:1px solid #dedede;
padding: 0.1em 0.2em 0.2em 0.2em;
background: #fff url("../images/buttonEnabled.png") repeat-x top left;
}
+
.nihilo .dijitSelect .dijitButtonContents {
border-right: none;
}
+
.nihilo .dijitButtonText {
text-align: center;
padding: 0 0.3em;
}
+
.nihilo .dijitComboBox .dijitButtonNode {
- border-width: 0px 0px 0px 1px;
+ border-width: 0 0 0 1px;
}
+
.nihilo .dijitArrowButton {
color: #111;
}
+
.nihilo .dijitComboButton .dijitDownArrowButton {
padding-right:4px;
}
+
.nihilo .dijitComboBoxReadOnly,
.nihilo .dijitSpinnerReadOnly,
.nihilo .dijitSpinnerReadOnly .dijitButtonNode,
@@ -33,7 +47,7 @@
.nihilo .dijitComboBoxDisabled,
.nihilo .dijitSpinnerDisabled,
.nihilo .dijitSpinnerDisabled .dijitButtonNode {
-
+ /* disabled state - inner */
border-color: #dedede;
background:#fafafa url("../images/buttonDisabled.png") top repeat-x;
opacity: 0.60;
@@ -42,9 +56,11 @@
.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 */
color: #aaa;
}
+
+
.nihilo .dijitButtonHover .dijitButtonNode,
.nihilo .dijitButtonNodeHover,
.nihilo .dijitToggleButtonHover .dijitButtonNode,
@@ -52,11 +68,12 @@
.nihilo .dijitButtonContentsHover,
.nihilo .dijitDownArrowButtonHover,
.nihilo .dijitUpArrowButtonHover {
-
-
+ /* hover state - inner */
+ /* TODO: change from Hover to Selected so that button is still highlighted while drop down is being used */
color:#243C5F;
background:#fcfcfc url("../images/buttonHover.png") repeat-x top left;
}
+
.nihilo .dijitUpArrowButtonActive,
.nihilo .dijitDownArrowButtonActive,
.nihilo .dijitButtonActive .dijitButtonNode,
@@ -64,14 +81,18 @@
.nihilo .dijitDropDownButtonActive .dijitButtonNode,
.nihilo .dijitComboButton .dijitButtonContentsActive,
.nihilo .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
-
+ /* active state - inner (for when you are pressing a normal button, or
+ * when a radio-type button is in a depressed state
+ */
border-color:#dedede;
background: #f5f5f5 url("../images/buttonActive.png") top left repeat-x;
}
+
+
.nihilo .dijitArrowButtonInner {
background-image: url("../images/spriteArrows.png");
background-repeat: no-repeat;
- background-position: 0px center;
+ background-position: 0 center;
width: 11px;
height: 11px;
}
@@ -88,10 +109,10 @@
background-image: url("../images/spriteArrows.gif");
}
.dj_webkit .nihilo .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: -1px;
+ margin-top: -1px; /* image has too many blank pixels on top */
}
.dj_ie .nihilo .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: 1px;
+ margin-top: 1px; /* image has too many blank pixels on top */
}
.nihilo .dijitSpinnerButtonContainer {
width: auto;
diff --git a/lib/dijit/themes/nihilo/form/Button_rtl.css b/lib/dijit/themes/nihilo/form/Button_rtl.css
index 3a7acc04c..60d4c4da4 100644
--- a/lib/dijit/themes/nihilo/form/Button_rtl.css
+++ b/lib/dijit/themes/nihilo/form/Button_rtl.css
@@ -1,7 +1,8 @@
.dijitRtl .nihilo .dijitComboBox .dijitButtonNode {
- border-width: 0px 0px 0px 1px;
+ border-width: 0 0 0 1px;
}
.dijitRtl .nihilo .dijitSelect .dijitButtonContents {
border-left: none;
border-right-width: 1px;
}
+
diff --git a/lib/dijit/themes/nihilo/form/Checkbox.css b/lib/dijit/themes/nihilo/form/Checkbox.css
index ceee44ffe..260666f99 100644
--- a/lib/dijit/themes/nihilo/form/Checkbox.css
+++ b/lib/dijit/themes/nihilo/form/Checkbox.css
@@ -1,40 +1,67 @@
+/*
+ * CheckBox and Radio Widgets,
+ * and the CSS to embed a checkbox or radio icon inside a ToggleButton.
+ *
+ * Order of images in the default sprite (from L to R, checkbox and radio in same image):
+ * checkbox normal - checked
+ * - unchecked
+ * disabled - checked
+ * - unchecked
+ * hover - checked
+ * - unchecked
+ *
+ * radio normal - checked
+ * - unchecked
+ * disabled - checked
+ * - unchecked
+ * hover - checked
+ * - unchecked
+*/
+
.nihilo .dijitToggleButton .dijitCheckBox,
.nihilo .dijitToggleButton .dijitCheckBoxIcon {
background-image: url('../images/spriteCheckbox.gif');
}
+
.nihilo .dijitCheckBox,
-.nihilo .dijitCheckBoxIcon {
- background-image: url('../images/spriteCheckbox.gif');
+.nihilo .dijitCheckBoxIcon { /* inside a toggle button */
+ background-image: url('../images/spriteCheckbox.gif'); /* checkbox sprite image */
background-repeat: no-repeat;
width: 16px;
height: 16px;
margin: 0;
padding: 0;
}
+
.nihilo .dijitCheckBox,
.nihilo .dijitToggleButton .dijitCheckBoxIcon {
-
+ /* unchecked */
background-position: -16px;
}
+
.nihilo .dijitCheckBoxChecked,
.nihilo .dijitToggleButtonChecked .dijitCheckBoxIcon {
-
- background-position: 0px;
+ /* checked */
+ background-position: 0;
}
+
.nihilo .dijitCheckBoxDisabled {
-
+ /* disabled */
background-position: -48px;
}
+
.nihilo .dijitCheckBoxCheckedDisabled {
-
+ /* disabled but checked */
background-position: -32px;
}
+
.nihilo .dijitCheckBoxHover {
-
+ /* hovering over an unchecked enabled checkbox */
background-position: -80px;
}
+
.nihilo .dijitCheckBoxCheckedHover {
-
+ /* hovering over a checked enabled checkbox */
background-position: -64px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/form/Common.css b/lib/dijit/themes/nihilo/form/Common.css
index fab63eba8..65dddc637 100644
--- a/lib/dijit/themes/nihilo/form/Common.css
+++ b/lib/dijit/themes/nihilo/form/Common.css
@@ -1,25 +1,42 @@
+/****
+ dijit.form.TextBox
+ dijit.form.ValidationTextBox
+ dijit.form.SerializableTextBox
+ dijit.form.RangeBoundTextBox
+ dijit.form.NumberTextBox
+ dijit.form.CurrencyTextBox
+ dijit.form.NumberSpinner
+ dijit.form.ComboBox (partial)
+ ****/
+
.nihilo .dijitInputContainer INPUT,
.nihilo .dijitTextBox {
- margin: 0em 0.1em;
+ margin: 0 0.1em;
}
+
.nihilo .dijitTextBox,
.nihilo .dijitTextArea {
-
+ /* For all except dijit.form.NumberSpinner: the actual input element.
+ For TextBox, ComboBox, Spinner: the table that contains the input.
+ Otherwise the actual input element.
+ */
background:#fff url("../images/validationInputBg.png") repeat-x top left;
#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
border:1px solid #d3d3d3;
}
+
.nihilo .dijitComboBox .dijitButtonNode {
padding: 0 0.2em !important;
}
.nihilo .dijitTextBox .dijitButtonNode {
-
+ /* line between the input area and the drop down button */
border-color: #d3d3d3;
}
+
.nihilo .dijitTextBoxFocused,
.nihilo .dijitTextAreaFocused {
-
+ /* input field when focused (ie: typing affects it) */
border-color:#b3b3b3;
}
.nihilo .dijitTextBoxFocused .dijitButtonNode,
@@ -32,20 +49,26 @@
.nihilo .dijitSpinner .dijitDownArrowButtonActive {
border-top-color:#d3d3d3;
}
+
.nihilo .dijitError {
border-color:#b3b3b3;
background-color:#f9f7ba;
background-image:none;
}
+
.nihilo .dijitErrorFocused {
background-color:#ff6;
background-image:none;
}
+
+/* Validation errors */
.nihilo .dijitValidationIcon {
-
+ /* prevent height change when widget goes from valid to invalid state */
width: 16px;
background: transparent url('../images/warning.png') no-repeat center center;
}
+
+/* The highlight is shown in the ComboBox menu. */
.nihilo .dijitComboBoxHighlightMatch {
background-color:#d3d3d3;
}
diff --git a/lib/dijit/themes/nihilo/form/RadioButton.css b/lib/dijit/themes/nihilo/form/RadioButton.css
index c876f590e..d0dba3020 100644
--- a/lib/dijit/themes/nihilo/form/RadioButton.css
+++ b/lib/dijit/themes/nihilo/form/RadioButton.css
@@ -1,40 +1,66 @@
+/*
+ * CheckBox and Radio Widgets,
+ * and the CSS to embed a checkbox or radio icon inside a ToggleButton.
+ *
+ * Order of images in the default sprite (from L to R, checkbox and radio in same image):
+ * checkbox normal - checked
+ * - unchecked
+ * disabled - checked
+ * - unchecked
+ * hover - checked
+ * - unchecked
+ *
+ * radio normal - checked
+ * - unchecked
+ * disabled - checked
+ * - unchecked
+ * hover - checked
+ * - unchecked
+*/
.nihilo .dijitToggleButton .dijitRadio,
.nihilo .dijitToggleButton .dijitRadioIcon {
background-image: url('../images/spriteRadio.gif');
}
+
.nihilo .dijitRadio,
-.nihilo .dijitRadioIcon {
- background-image: url('../images/spriteRadio.gif');
+.nihilo .dijitRadioIcon { /* inside a toggle button */
+ background-image: url('../images/spriteRadio.gif'); /* checkbox sprite image */
background-repeat: no-repeat;
width: 16px;
height: 16px;
margin: 0;
padding: 0;
}
+
.nihilo .dijitRadio,
.nihilo .dijitToggleButton .dijitRadioIcon {
-
+ /* unselected */
background-position: -16px;
}
+
.nihilo .dijitRadioChecked,
.nihilo .dijitToggleButtonChecked .dijitRadioIcon {
-
- background-position: 0px;
+ /* selected */
+ background-position: 0;
}
+
.nihilo .dijitRadioDisabled {
-
+ /* unselected and disabled */
background-position: -48px;
}
+
.nihilo .dijitRadioCheckedDisabled {
-
+ /* selected but disabled */
background-position: -32px;
}
+
.nihilo .dijitRadioHover {
-
+ /* hovering over an unselected enabled radio button */
background-position: -80px;
}
+
.nihilo .dijitRadioCheckedHover {
-
+ /* hovering over a selected enabled radio button */
background-position: -64px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/form/Select.css b/lib/dijit/themes/nihilo/form/Select.css
index af811f50e..61967e550 100644
--- a/lib/dijit/themes/nihilo/form/Select.css
+++ b/lib/dijit/themes/nihilo/form/Select.css
@@ -1,6 +1,8 @@
.nihilo .dijitSelect .dijitButtonNode {
- padding: 0px;
+ padding: 0;
}
+
+/* Make unselected "look" more like a text box and less like a button */
.nihilo .dijitSelect .dijitButtonContents {
padding-top: 1px;
background:#fff url("../images/validationInputBg.png") repeat-x top left;
@@ -14,11 +16,14 @@
background: transparent none;
}
.dj_ie .nihilo .dijitSelect .dijitButtonContents {
- padding-top: 0px;
+ padding-top: 0;
}
+
.nihilo .dijitSelect .dijitArrowButton {
- padding: 0px 2px;
+ padding: 0 2px;
}
+
+/* Mirror DropDownButton */
.nihilo .dijitSelectDisabled .dijitButtonNode {
border-color: #dedede;
background:#fafafa url("../images/buttonDisabled.png") top repeat-x;
@@ -26,19 +31,24 @@
.dj_ie .nihilo .dijitSelectDisabled .dijitButtonNode * {
filter: gray() alpha(opacity=50);
}
+
.nihilo .dijitSelectHover .dijitButtonNode {
color:#000;
background:#fcfcfc url("../images/buttonHover.png") repeat-x top left;
}
+
.nihilo .dijitSelectActive .dijitButtonNode,
.nihilo .dijitSelectOpened .dijitButtonNode {
border-color:#dedede;
background: #f5f5f5 url("../images/buttonActive.png") top left repeat-x;
}
+
+/* Make the menu look more combobox-like */
.nihilo .dijitSelectMenu td {
- padding: 0em;
+ padding: 0;
}
.nihilo .dijitSelectMenu .dijitMenuItemLabel,
.nihilo .dijitSelectMenu .dijitMenuArrowCell {
padding: 0.1em 0.2em;
}
+
diff --git a/lib/dijit/themes/nihilo/form/Slider.css b/lib/dijit/themes/nihilo/form/Slider.css
index 6458e89f0..16bcd0980 100644
--- a/lib/dijit/themes/nihilo/form/Slider.css
+++ b/lib/dijit/themes/nihilo/form/Slider.css
@@ -1,38 +1,49 @@
+/****
+ SLIDER
+****/
+
.nihilo .dijitSliderProgressBarH {
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFull.png") repeat-x top left;
}
+
.nihilo .dijitSliderProgressBarV {
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFullVertical.png") repeat-y bottom left;
}
+
.nihilo .dijitSliderFocused .dijitSliderProgressBarH,
.nihilo .dijitSliderFocused .dijitSliderLeftBumper {
background-image:url("../images/sliderFullFocus.png");
}
+
.nihilo .dijitSliderFocused .dijitSliderProgressBarV,
.nihilo .dijitSliderFocused .dijitSliderBottomBumper {
background-image:url("../images/sliderFullVerticalFocus.png");
}
+
.nihilo .dijitSliderRemainingBarV {
border-color: #b4b4b4;
background: #dcdcdc url("../images/sliderEmptyVertical.png") repeat-y bottom left;
}
+
.nihilo .dijitSliderRemainingBarH {
border-color: #b4b4b4;
background: #dcdcdc url("../images/sliderEmpty.png") repeat-x top left;
}
+
.nihilo .dijitSliderBar {
border-style: solid;
outline:1px;
-
+ /* border-color: #b4b4b4; */
}
.nihilo .dijitSliderFocused .dijitSliderBar {
border-color:#727272;
}
+
.nihilo .dijitSliderImageHandleH {
- border:0px;
+ border:0;
width:15px;
height:18px;
background:url("../images/preciseSliderThumb.png") no-repeat center top;
@@ -42,37 +53,44 @@
background-image:url("../images/preciseSliderThumbFocus.png");
#background-image:url("../images/preciseSliderThumbFocus.gif");
}
+
.nihilo .dijitSliderLeftBumper {
border-left-width: 1px;
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFull.png") repeat-x top left;
}
+
.nihilo .dijitSliderRightBumper {
background: #dcdcdc url("../images/sliderEmpty.png") repeat-x top left;
border-color: #b4b4b4;
border-right-width: 1px;
}
+
.nihilo .dijitSliderImageHandleV {
- border:0px;
+ border:0;
width:20px;
height:15px;
background:url("../images/sliderThumb.png") no-repeat center center;
#background:url("../images/sliderThumb.gif") no-repeat center center;
}
+
.nihilo .dijitSliderFocused .dijitSliderImageHandleV {
background-image:url("../images/sliderThumbFocus.png");
#background-image:url("../images/sliderThumbFocus.gif");
}
+
.nihilo .dijitSliderBottomBumper {
border-bottom-width: 1px;
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFullVertical.png") repeat-y bottom left;
}
+
.nihilo .dijitSliderTopBumper {
background: #dcdcdc url("../images/sliderEmptyVertical.png") repeat-y top left;
border-color: #b4b4b4;
border-top-width: 1px;
}
+
.nihilo .dijitSliderIncrementIconH,
.nihilo .dijitSliderIncrementIconV {
background:url('../images/spriteRoundedIconsSmall.png') no-repeat -45px top;
@@ -83,6 +101,7 @@
background:url('../images/spriteRoundedIconsSmall.png') no-repeat -30px top;
#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat -30px top;
}
+
.nihilo .dijitSliderDecrementIconH,
.nihilo .dijitSliderDecrementIconV {
width:15px;
@@ -91,12 +110,14 @@
#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat -15px top;
}
.nihilo .dijitSliderDecrementIconH {
- background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top;
- #background:url('../images/spriteRoundedIconsSmall.gif') no-repeat 0px top;
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0 top;
+ #background:url('../images/spriteRoundedIconsSmall.gif') no-repeat 0 top;
}
+
.nihilo .dijitSliderButtonInner {
visibility:hidden;
}
+
.nihilo .dijitSliderReadOnly *,
.nihilo .dijitSliderDisabled * {
border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
@@ -104,7 +125,7 @@
}
.nihilo .dijitSliderReadOnly .dijitSliderDecrementIconH,
.nihilo .dijitSliderDisabled .dijitSliderDecrementIconH {
- background-position: 0px -15px;
+ background-position: 0 -15px;
}
.nihilo .dijitSliderReadOnly .dijitSliderIncrementIconH,
.nihilo .dijitSliderDisabled .dijitSliderIncrementIconH {
@@ -117,4 +138,4 @@
.nihilo .dijitSliderReadOnly .dijitSliderIncrementIconV,
.nihilo .dijitSliderDisabled .dijitSliderIncrementIconV {
background-position: -45px -15px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/form/Slider_rtl.css b/lib/dijit/themes/nihilo/form/Slider_rtl.css
index fc40452de..1523d4a96 100644
--- a/lib/dijit/themes/nihilo/form/Slider_rtl.css
+++ b/lib/dijit/themes/nihilo/form/Slider_rtl.css
@@ -1,4 +1,6 @@
+/* Slider */
+
.dijitRtl .nihilo .dijitSliderProgressBarH,
.dijitRtl .nihilo .dijitSliderRemainingBarH,
.dijitRtl .nihilo .dijitSliderLeftBumper,
@@ -6,23 +8,28 @@
.dijitRtl .nihilo .dijitSliderTopBumper {
background-position: top right;
}
+
.dijitRtl .nihilo .dijitSliderProgressBarV,
.dijitRtl .nihilo .dijitSliderRemainingBarV,
.dijitRtl .nihilo .dijitSliderBottomBumper {
background-position: bottom right;
}
+
.dijitRtl .nihilo .dijitSliderLeftBumper {
- border-left-width: 0px;
+ border-left-width: 0;
border-right-width: 1px;
}
+
.dijitRtl .nihilo .dijitSliderRightBumper {
border-left-width: 1px;
- border-right-width: 0px;
+ border-right-width: 0;
}
+
.dijitRtl .nihilo .dijitSliderIncrementIconH {
background:url('../images/spriteRoundedIconsSmall.png') no-repeat left top;
#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat left top;
}
+
.dijitRtl .nihilo .dijitSliderDecrementIconH {
background:url('../images/spriteRoundedIconsSmall.png') no-repeat -30px top;
#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat -30px top;
diff --git a/lib/dijit/themes/nihilo/form/TimeTextBox.css b/lib/dijit/themes/nihilo/form/TimeTextBox.css
index d450925b4..bf67b66d0 100644
--- a/lib/dijit/themes/nihilo/form/TimeTextBox.css
+++ b/lib/dijit/themes/nihilo/form/TimeTextBox.css
@@ -1 +1 @@
-@CHARSET "UTF-8";
+@CHARSET "UTF-8"; \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/layout/AccordionContainer.css b/lib/dijit/themes/nihilo/layout/AccordionContainer.css
index a74b01a2e..f42db806c 100644
--- a/lib/dijit/themes/nihilo/layout/AccordionContainer.css
+++ b/lib/dijit/themes/nihilo/layout/AccordionContainer.css
@@ -1,8 +1,15 @@
+/**
+ * dijit.layout.Accordioncontainer
+ *
+ */
.nihilo .dijitAccordionContainer {
border-color: #ccc;
background-color: #fff;
}
+
+/* common */
+
.nihilo .dijitAccordionTitle {
background:#fafafa url("../images/titleBar.png") repeat-x top left;
border-top: 1px solid #dedede;
@@ -11,6 +18,7 @@
font-weight: bold;
color: #6d6d6d;
}
+
.nihilo .dijitAccordionTitleSelected {
background: #f9f9f9 url("../images/accordionItemActive.png") top repeat-x;
font-weight: bold;
@@ -19,16 +27,19 @@
padding: 5px 4px 5px 8px;
color: #243C5F;
}
+
.nihilo .dijitAccordionArrow {
background:url("../images/spriteRoundedIconsSmall.gif") no-repeat -30px top;
width:15px;
height:15px;
margin-top:-1px;
}
+
.nihilo .dijitAccordionTitleSelected .dijitAccordionArrow {
background:url("../images/spriteRoundedIconsSmall.gif") no-repeat -15px top;
margin-top:-1px;
}
+
.nihilo .dijitAccordionText {
margin-left: 4px;
margin-right: 4px;
diff --git a/lib/dijit/themes/nihilo/layout/AccordionContainer_rtl.css b/lib/dijit/themes/nihilo/layout/AccordionContainer_rtl.css
index b71afbacf..f669a4753 100644
--- a/lib/dijit/themes/nihilo/layout/AccordionContainer_rtl.css
+++ b/lib/dijit/themes/nihilo/layout/AccordionContainer_rtl.css
@@ -1,7 +1,8 @@
.dijitRtl .nihilo .dijitAccordionArrow {
- background-position: 0px top;
+ background-position: 0 top;
}
+
.dijitRtl .nihilo .dijitAccordionTitleSelected .dijitAccordionArrow {
-
+ /* same rule as LTR mode, just listed to override previous rule in this file */
background-position: -15px top;
}
diff --git a/lib/dijit/themes/nihilo/layout/BorderContainer.css b/lib/dijit/themes/nihilo/layout/BorderContainer.css
index 29fcc39da..493da54e1 100644
--- a/lib/dijit/themes/nihilo/layout/BorderContainer.css
+++ b/lib/dijit/themes/nihilo/layout/BorderContainer.css
@@ -1,53 +1,70 @@
+/**
+ * dijit.layout.BorderContainer
+ *
+ */
.nihilo .dijitBorderContainer {
background-color: #fcfcfc;
padding: 5px;
}
+
.nihilo .dijitSplitContainer-child,
.nihilo .dijitBorderContainer-child {
-
+ /* By default, put borders on all children of BorderContainer,
+ * to give illusion of borders on the splitters themselves.
+ */
border: 1px #ccc solid;
}
+
.nihilo .dijitBorderContainer-dijitTabContainerTop,
.nihilo .dijitBorderContainer-dijitTabContainerBottom,
.nihilo .dijitBorderContainer-dijitTabContainerLeft,
.nihilo .dijitBorderContainer-dijitTabContainerRight {
-
+ /* except that TabContainer defines borders on it's sub-nodes (tablist and dijitTabPaneWrapper),
+ * so override rule setting border on domNode
+ */
border: none;
}
+
.nihilo .dijitBorderContainer-dijitBorderContainer {
-
+ /* also, make nested BorderContainers look like a single big widget with lots of splitters */
border: none;
- padding: 0px;
+ padding: 0;
}
+
.nihilo .dijitSplitterH,
.nihilo .dijitGutterH {
background:#FCFCFC;
border:0;
- border-left:0px solid #d3d3d3;
- border-right:0px solid #d3d3d3;
+ border-left:0 solid #d3d3d3;
+ border-right:0 solid #d3d3d3;
height:5px;
}
+
.nihilo .dijitSplitterH .dijitSplitterThumb {
background:#8BA0BD none;
height:1px;
top:2px;
width:19px;
}
+
.nihilo .dijitSplitterV,
.nihilo .dijitGutterV {
background:#FCFCFC;
border:0;
- border-top:0px solid #d3d3d3;
- border-bottom:0px solid #d3d3d3;
+ border-top:0 solid #d3d3d3;
+ border-bottom:0 solid #d3d3d3;
width:5px;
}
+
.nihilo .dijitSplitterV .dijitSplitterThumb {
background:#8BA0BD none;
height:19px;
left:2px;
width:1px;
}
+
+/* active splitter */
.nihilo .dijitSplitterActive {
font-size: 1px;
background-image: none;
@@ -56,4 +73,4 @@
opacity: 0.6;
filter: Alpha(Opacity=60);
margin: 0;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/layout/ContentPane.css b/lib/dijit/themes/nihilo/layout/ContentPane.css
index 2bd0a191b..75272db5a 100644
--- a/lib/dijit/themes/nihilo/layout/ContentPane.css
+++ b/lib/dijit/themes/nihilo/layout/ContentPane.css
@@ -1,7 +1,10 @@
+/* ContentPane */
.nihilo .dijitContentPane {
- padding: 0px;
+ padding: 0;
}
+
+/* nested layouts */
.nihilo .dijitTabContainerTop-dijitContentPane,
.nihilo .dijitTabContainerLeft-dijitContentPane,
.nihilo .dijitTabContainerRight-dijitContentPane,
@@ -10,8 +13,9 @@
background-color: #fff;
padding: 5px;
}
+
.nihilo .dijitSplitContainer-dijitContentPane,
.nihilo .dijitBorderContainer-dijitContentPane {
- background-color: #fff;
+ background-color: #fff; /* override background-color setting on parent .dijitBorderContainer */
padding: 5px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/layout/SplitContainer.css b/lib/dijit/themes/nihilo/layout/SplitContainer.css
index 79d8fbdde..9f4defadd 100644
--- a/lib/dijit/themes/nihilo/layout/SplitContainer.css
+++ b/lib/dijit/themes/nihilo/layout/SplitContainer.css
@@ -1,27 +1,34 @@
+/**
+ * dijit.layout.SplitContainer
+ *
+ */
.nihilo .dijitSplitContainerSizerH {
background:url("../images/splitContainerSizerV.png") repeat-y #fff;
border:0;
- border-left:0px solid #d3d3d3;
- border-right:0px solid #d3d3d3;
+ border-left:0 solid #d3d3d3;
+ border-right:0 solid #d3d3d3;
width:5px;
}
+
.nihilo .dijitSplitContainerSizerH .thumb {
background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
left:1px;
width:2px;
height:19px;
}
+
.nihilo .dijitSplitContainerSizerV {
background:url("../images/splitContainerSizerH.png") repeat-x #fff;
border:0;
- border-top:0px solid #d3d3d3;
- border-bottom:0px solid #d3d3d3;
+ border-top:0 solid #d3d3d3;
+ border-bottom:0 solid #d3d3d3;
height:2px;
}
+
.nihilo .dijitSplitContainerSizerV .thumb {
background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
top:1px;
width:19px;
height:5px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/layout/TabContainer.css b/lib/dijit/themes/nihilo/layout/TabContainer.css
index 3652f229b..21266577e 100644
--- a/lib/dijit/themes/nihilo/layout/TabContainer.css
+++ b/lib/dijit/themes/nihilo/layout/TabContainer.css
@@ -1,133 +1,99 @@
+/**
+ * dijit.layout.TabContainer
+ *
+ * To style TabContainer with rounded corners
+ * you can use these classes: .dijitTab (left), .dijitTabContent (center), dijitTabInnerDiv (right)
+ * For tabs aligned to top you can style a stripe div right underneath the tabs using .dijitTabStripe
+ */
+@import url("../Menu.css");
+
+/* Classes for all types of tabs (top/bottom/left/right) */
-.nihilo .dijitMenu,
-.nihilo .dijitMenuBar {
- border: 1px solid #d3d3d3;
- margin: 0px;
- padding: 0px;
- background-color: #fff;
-}
-.nihilo .dijitBorderContainer .dijitMenuBar {
- border: 1px #ccc solid;
-}
-.nihilo .dijitMenuItem {
- font-family: sans-serif;
- margin: 0px;
- color: #243C5F;
-}
-.nihilo .dijitMenuBar .dijitMenuItem {
- padding: 4px 5px;
-}
-.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
- font-style: italic;
-}
-.nihilo .dijitMenuItem TD {
- padding:1px;
-}
-.nihilo .dijitMenuPassive .dijitMenuItemHover,
-.nihilo .dijitMenuItemSelected {
- background-color: #ffe284;
- color: #243C5F;
-}
-.nihilo .dijitMenuItemIcon {
- width: 15px;
- height: 15px;
-}
-.nihilo .dijitMenuExpand {
- width:15px;
- height:15px;
- background-image: url(../images/spriteRoundedIconsSmall.png);
- background-position: -30px top;
-}
-.dj_ie6 .nihilo .dijitMenuExpand {
- background-image:url(../images/spriteRoundedIconsSmall.gif);
-}
-.nihilo .dijitMenuSeparator {
- height: 1px;
-}
-.nihilo .dijitMenuSeparatorTop {
- border-bottom: 1px solid #fff;
-}
-.nihilo .dijitMenuSeparatorBottom {
- border-top: 1px solid #d3d3d3;
-}
-.nihilo .dijitCheckedMenuItemIconChar {
- display: none;
-}
-.nihilo .dijitCheckedMenuItemIcon {
- background-image: url(../images/spriteCheckbox.gif);
- background-position: -80px;
-}
-.nihilo .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
- background-position: -64px;
-}
.nihilo .dijitTabContainer .tabStripRBtn {
margin-right: 21px;
}
.nihilo .dijitTabContainer .tabStripLBtn {
margin-left: 21px;
}
+
.nihilo .dijitTabContainerBottom .nowrapTabStrip .dijitTab {
- top: 0px;
+ top: 0;
}
+
+/* Tabs, shared classes */
.nihilo .dijitTabPaneWrapper {
background:#fff;
border:1px solid #ccc;
margin: 0;
padding: 0;
}
+
.nihilo .dijitTabInnerDiv {
- padding:0px 3px 0px 0px;
+ padding:0 3px 0 0;
margin: 0 0 0 4px;
background: url("../images/tabContainerSprite.gif") no-repeat;
background-position: right -400px;
}
+
.nihilo .dijitTab {
line-height:normal;
- margin:0 2px 0 0;
- padding:0px;
+ margin:0 2px 0 0; /* space between one tab and the next in top/bottom mode */
+ padding:0;
background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
color: #6d6d6d;
border-bottom: 1px #ccc solid;
}
+
.nihilo .dijitTabInnerDiv .dijitTabContent {
padding:3px 3px 3px 4px;
background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
position: relative;
}
+
+/* hovered tab */
.nihilo .dijitTabHover {
color: #243C5F;
- background: url("../images/tabContainerSprite.gif") no-repeat 0px -150px;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0 -150px;
}
+
.nihilo .dijitTabHover .dijitTabInnerDiv {
background: url("../images/tabContainerSprite.gif") no-repeat right -250px;
}
+
.nihilo .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabContainerSprite.gif") repeat-x 0 -200px;
}
+
+/* checked tab*/
.nihilo .dijitTabChecked
{
-
- background: url("../images/tabContainerSprite.gif") no-repeat 0px -0px;
+ /* the selected tab (with or without hover) */
+ background: url("../images/tabContainerSprite.gif") no-repeat 0 -0;
}
+
.nihilo .dijitTabChecked .dijitTabInnerDiv {
background: url("../images/tabContainerSprite.gif") no-repeat right -100px;
}
+
.nihilo .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
color: #243C5F !important;
}
+
+/* Nested Tabs */
.nihilo .dijitTabContainerNested .dijitTabListWrapper {
height: auto;
}
+
.nihilo .dijitTabContainerTabListNested {
background: #FDFDFD;
border: none;
- margin-bottom: 0px;
+ margin-bottom: 0; /* override margin: -1px; */
}
.nihilo .dijitTabContainerTabListNested .dijitTab {
background: none;
border: none;
- top: 0px;
+ top: 0; /* override top:1px setting of top-level tabs */
}
.nihilo .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv,
.nihilo .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
@@ -141,19 +107,23 @@
font-weight: bold;
}
.nihilo .dijitTabContainerSpacerNested {
-
- height: 0px;
- border-bottom: 0px;
+ /* thinner line between tab (labels) and content */
+ height: 0;
+ border-bottom: 0;
}
.nihilo .dijitTabPaneWrapperNested {
- border: none;
+ border: none; /* prevent double border */
}
+
+
+/* Close button */
.nihilo .dijitTabCloseButton {
background: url("../images/spriteRoundedIconsSmall.png") no-repeat -60px top;
width: 15px;
height: 15px;
margin-top: -1px;
}
+
.dj_ie6 .nihilo .dijitTabCloseButton {
background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px top;
}
@@ -163,40 +133,42 @@
.dj_ie6 .nihilo .dijitTabCloseButtonHover {
background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px -15px;
}
-.nihilo .dijitTab .tabLabel {
-
- min-height: 15px;
- display: inline-block;
-}
-.dj_ie6 .nihilo .dijitTabButtonIcon {
-
- height: 18px;
- width: 1px;
-}
+
+/* ================================ */
+/* top tabs */
.nihilo .dijitTabContainerTop-tabs {
border-bottom: none;
padding-bottom: 1px;
background-position: bottom;
padding-left: 3px;
}
+
.dj_ie6 .nihilo .dijitTabListContainer-top,
.dj_ie7 .nihilo .dijitTabListContainer-top {
z-index: 3;
}
+
.dj_ie6 .nihilo .dijitTabContainerTop-tabs,
.dj_ie7 .nihilo .dijitTabContainerTop-tabs {
border-bottom: 1px solid #ccc;
- padding-bottom: 0px;
+ padding-bottom: 0;
}
+
.nihilo .dijitTabContainerTopNoStrip {
padding-top: 3px;
}
+
+/* top container */
.nihilo .dijitTabContainerTop-container {
border-top: none;
}
+
+/* checked tabs */
.nihilo .dijitTabContainerTop-tabs .dijitTabChecked {
border-bottom-color: #f8f8f8;
}
+
+/* strip */
.nihilo .dijitTabContainer .dijitTabContainerTopStrip {
border-bottom: none;
padding-top: 1px;
@@ -206,77 +178,105 @@
border-right: 1px solid #CCC;
border-left: 1px solid #CCC;
}
+
+
+/* ================================ */
+/* bottom tabs */
.nihilo .dijitTabContainerBottom-tabs {
border-top: none;
background-position: top;
padding-left: 3px;
}
+
.dj_ie6 .nihilo .dijitTabListContainer-bottom,
.dj_ie7 .nihilo .dijitTabListContainer-bottom {
z-index: 3;
}
+
.dj_ie6 .nihilo .dijitTabContainerBottom-tabs,
.dj_ie7 .nihilo .dijitTabContainerBottom-tabs {
border-top: 1px solid #ccc;
margin-top: -1px;
}
+
+/* bottom container */
.nihilo .dijitTabContainerBottom-container {
border-bottom: none;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTab {
border-bottom: none;
border-top: 1px solid #ccc;
background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
}
+
+/* checked tabs */
.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked {
border-top-color: #f8f8f8;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
padding-top: 3px;
padding-bottom: 3px;
background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom right;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTabHover {
color: #243C5F;
background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom left;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv {
background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom right;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabBottomHoverC.gif") repeat-x bottom left;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked {
-
+ /* the selected tab (with or without hover) */
background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom left;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom right;
}
+
.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
}
+
+/* strip */
.nihilo .dijitTabContainer .dijitTabContainerBottomStrip {
border: 1px solid #ccc;
background: #f2f2f2;
border-top: none;
padding-bottom: 2px;
}
+
+/* top/bottom strip */
.nihilo .dijitTabContainerBottom-spacer,
.nihilo .dijitTabContainerTop-spacer {
height: 2px;
border: 1px solid #ccc;
background: #f8f8f8;
}
+
.nihilo .dijitTabContainerTop-spacer {
margin-top: -1px;
}
.nihilo .dijitTabContainerBottom-spacer {
margin-bottom: -1px;
}
+
+
+/* ================================ */
+/* right tabs */
.nihilo .dijitTabContainerRight-tabs {
border-color: #ccc;
padding-top: 3px;
@@ -284,53 +284,76 @@
.nihilo .dijitTabContainerRight .dijitTabListWrapper {
padding-right: 3px;
}
+
+/* right container */
.nihilo .dijitTabContainerRight-container {
border-right: none;
}
+
.nihilo .dijitTabContainerRight-tabs .dijitTab {
border-bottom: none;
border-left: 1px solid #ccc;
border-bottom: 1px solid #dedede !important;
}
+
+
+/* some odd ie bug when borders dissapear when setting a bottom margin, this sortof helps */
.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabInnerDiv {
border-bottom: solid #fff 1px;
}
+
+/* checked tabs */
.nihilo .dijitTabContainerRight-tabs .dijitTabChecked {
border-left-color: #f8f8f8;
}
+
.nihilo .dijitTabContainerRight-tabs .dijitTabChecked {
background: url("../images/tabRightChecked.gif") no-repeat left top !important;
}
+
+/* some odd ie bug when borders dissapear when setting a bottom margin, this sortof helps */
.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
border-bottom: solid #efefef 1px;
}
+
.nihilo .dijitTabContainerRight-tabs .dijitTab {
background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
}
.nihilo .dijitTabContainerRight-tabs .dijitTabHover .dijitTab {
background: url("../images/tabContainerSprite.gif") no-repeat left -200px;
}
+
+/* strip */
.nihilo .dijitTabContainerRightStrip {
padding-right: 2px;
border: 1px solid #ccc;
border-left: none;
background: #f2f2f2;
}
+
+/* ================================ */
+/* left tabs */
.nihilo .dijitTabContainerLeft-tabs {
border-color: #ccc;
padding-top: 3px;
}
+
+/* left conatiner */
.nihilo .dijitTabContainerLeft-container {
border-left: none;
}
+
.nihilo .dijitTabContainerLeft-tabs .dijitTab {
border-right: 1px solid #ccc;
border-bottom: 1px solid #dedede;
}
+
+/* checked tabs */
.nihilo .dijitTabContainerLeft-tabs .dijitTabChecked {
border-right: 1px solid #f8f8f8;
}
+
.nihilo .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
background: url("../images/tabContainerSprite.gif") no-repeat right -350px;
}
@@ -341,35 +364,47 @@
.nihilo .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
background: url("../images/tabLeftChecked.gif") no-repeat right top;
}
+
.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
border-bottom: solid #efefef 1px;
}
+
.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
border-bottom: solid #fff 1px;
}
+
+/* strip */
.nihilo .dijitTabContainerLeftStrip {
padding-left: 2px;
border: 1px solid #ccc;
border-right: none;
}
+
.nihilo .dijitTabContainerLeftStrip {
background: #f2f2f2;
}
+
+/* ================================ */
+/* left/right tabs */
.nihilo .dijitTabContainerLeft-tabs .dijitTab,
.nihilo .dijitTabContainerRight-tabs .dijitTab {
margin-right:auto;
- margin-bottom:2px;
+ margin-bottom:2px; /* space between one tab and the next in left/right mode */
}
+
+/* left/right tabstrip */
.nihilo .dijitTabContainerLeft-spacer,
.nihilo .dijitTabContainerRight-spacer {
width: 2px;
border: 1px solid #ccc;
background: #f8f8f8;
}
+
.nihilo .dijitTabContainerRight-spacer {
border-right: none;
}
+
.nihilo .dijitTabContainerRight-tabs {
padding-top: 3px;
height: 100%;
@@ -377,63 +412,85 @@
.nihilo .dijitTabContainerLeft-tabs {
height: 100%;
}
+
.nihilo .dijitTabContainerLeft-spacer {
border-left: none;
}
+
+/* ================================ */
+
+/* this resets the tabcontainer stripe when within a contentpane */
.nihilo .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
- border-left: 0px solid #ccc;
- border-top: 0px solid #ccc;
- border-right: 0px solid #ccc;
- padding-top: 0px;
- padding-left: 0px;
+ border-left: 0 solid #ccc;
+ border-top: 0 solid #ccc;
+ border-right: 0 solid #ccc;
+ padding-top: 0;
+ padding-left: 0;
}
+
+/* ================================ */
+
+/* Menu and slider control styles */
.nihilo .dijitTabContainer .tabStripButton {
- margin-right: 0px;
+ margin-right: 0;
}
+
.nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
padding: 5px 0 6px;
}
+
.dj_ie6 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
.dj_ie7 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
.dj_opera .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
padding-bottom: 7px;
}
+
.nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
padding: 3px 0 5px;
}
+
.dj_ie6 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
.dj_ie7 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
.dj_opera .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
padding-top: 4px;
}
+
.nihilo .dijitTabStripIcon {
height: 14px;
width: 14px;
background: url(../images/spriteRoundedIconsSmall.png) no-repeat left top;
}
+
.dj_ie6 .nihilo .dijitTabStripIcon {
background-image: url(../images/spriteRoundedIconsSmall.gif);
}
+
.nihilo .dijitTabStripSlideRightIcon {
background-position: -30px top;
}
+
.nihilo .dijitTabStripMenuIcon {
background-position: -15px top;
}
+
.nihilo .dijitTabContainerTopNone {
- padding-top: 0px;
+ padding-top: 0;
}
+
.nihilo .dijitTabContainer .tabStripButton-top {
margin-top: 1px;
}
+
.nihilo .dijitTabContainer .tabStripButton-bottom {
background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
border-bottom: medium none;
border-top: 1px solid #CCCCCC;
}
+
.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
}
+
.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
background: transparent;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/layout/TabContainer_rtl.css b/lib/dijit/themes/nihilo/layout/TabContainer_rtl.css
index 8a55f5026..225fc3eba 100644
--- a/lib/dijit/themes/nihilo/layout/TabContainer_rtl.css
+++ b/lib/dijit/themes/nihilo/layout/TabContainer_rtl.css
@@ -1,10 +1,13 @@
.dijitRtl .nihilo .dijitTab {
margin-right:0;
- margin-left:2px;
+ margin-left:2px; /* space between one tab and the next in top/bottom mode */
}
+
+/* tab strips */
.dijitRtl .nihilo .dijitTabContainer .tabStripButton {
margin-left: 0;
}
+
.dijitRtl .nihilo .dijitTabContainerTopStrip,
.dijitRtl .nihilo .dijitTabContainerBottomStrip,
.dijitRtl .nihilo .dijitTabContainerTop-tabs,
@@ -12,23 +15,29 @@
padding-left: 0;
padding-right: 3px;
}
+
.dijitRtl .nihilo .dijitTabInnerDiv {
padding-left: 3px;
padding-right: 4px;
}
+
.dijitRtl .nihilo .dijitTabPaneWrapper {
#zoom: 1;
}
+
.dj_ie-rtl .nihilo .dijitTabContainerLeft-tabs {
- margin-left: 0px !important;
+ margin-left: 0 !important;
}
+
.dj_ie-rtl .nihilo .dijitTabContainerRight-tabs {
- margin-right: 0px !important;
+ margin-right: 0 !important;
}
+
.dijitRtl .nihilo .dijitTabContainerLeft-tabs .dijitTab,
.dijitRtl .nihilo .dijitTabContainerRight-tabs .dijitTab {
- margin-left:0px;
+ margin-left:0;
}
+
.dj_ie-rtl .nihilo .dijitTab .dijitTabInnerDiv{
width : 1%;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/nihilo.css b/lib/dijit/themes/nihilo/nihilo.css
index 5a0bc3e3d..97ba8f6eb 100644
--- a/lib/dijit/themes/nihilo/nihilo.css
+++ b/lib/dijit/themes/nihilo/nihilo.css
@@ -1,3404 +1,42 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
-.dijitReset {
-
- margin:0;
- border:0;
- padding:0;
- line-height:normal;
- font: inherit;
- color: inherit;
-}
-.dijit_a11y .dijitReset {
- -moz-appearance: none;
-}
-.dijitInline {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
- border:0;
- padding:0;
- vertical-align:middle;
- #vertical-align: auto;
-}
-.dijitHidden {
-
- display: none !important;
-}
-.dijitVisible {
-
- display: block !important;
- position: relative;
-}
-.dijitInputContainer {
-
- #zoom: 1;
- overflow: hidden;
- float: none !important;
- position:relative;
-}
-.dj_ie INPUT.dijitTextBox,
-.dj_ie .dijitTextBox INPUT {
- font-size: 100%;
-}
-.dijitTextBox .dijitSpinnerButtonContainer,
-.dijitTextBox .dijitArrowButtonContainer,
-.dijitTextBox .dijitValidationContainer {
- float: right;
- text-align: center;
-}
-.dijitTextBox INPUT.dijitInputField {
-
- padding-left: 0 !important;
- padding-right: 0 !important;
-}
-.dijitTextBox .dijitValidationContainer {
- display: none;
-}
-.dijitInlineTable {
-
- display:inline-table;
- display:inline-block;
- #zoom: 1;
- #display:inline;
- box-sizing: content-box; -moz-box-sizing: content-box;
- border:0;
- padding:0;
-}
-.dijitTeeny {
- font-size:1px;
- line-height:1px;
-}
-.dijitOffScreen {
- position: absolute;
- visibility: hidden;
- left: 50%;
- top: -10000px;
-}
-.dijitPopup {
- position: absolute;
- background-color: transparent;
- margin: 0;
- border: 0;
- padding: 0;
-}
-.dijit_a11y .dijitPopup,
-.dijit_ally .dijitPopup DIV,
-.dijit_a11y .dijitPopup TABLE,
-.dijit_a11y .dijitTooltipContainer {
- background-color: white !important;
-}
-.dijitPositionOnly {
-
- padding: 0 !important;
- border: 0 !important;
- background-color: transparent !important;
- background-image: none !important;
- height: auto !important;
- width: auto !important;
-}
-.dijitNonPositionOnly {
-
- float: none !important;
- position: static !important;
- margin: 0 0 0 0 !important;
- vertical-align: middle !important;
-}
-.dijitBackgroundIframe {
-
- position: absolute;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- border: 0;
- padding: 0;
- margin: 0;
-}
-.dijitDisplayNone {
-
- display:none !important;
-}
-.dijitContainer {
-
- overflow: hidden;
-}
-.dijit_a11y * {
- background-image:none !important;
-}
-.dijit_a11y .dijitIcon,
-.dijit_a11y DIV.dijitArrowButtonInner,
-.dijit_a11y SPAN.dijitArrowButtonInner,
-.dijit_a11y IMG.dijitArrowButtonInner,
-.dijit_a11y .dijitCalendarIncrementControl {
-
- display: none;
-}
-.dijitSpinner DIV.dijitArrowButtonInner {
- display: block;
-}
-.dijit_a11y .dijitA11ySideArrow {
- display: inline !important;
- cursor: pointer;
-}
-.dijit_a11y .dijitCalendarDateLabel {
- padding: 1px;
-}
-.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
- border-style: dotted !important;
- border-width: 1px;
- padding: 0px;
-}
-.dijit_a11y .dijitCalendarDateTemplate {
- padding-bottom: 0.1em !important;
-}
-.dijit_a11y .dijit * {
- background:white !important;
- color:black !important;
-}
-.dijit_a11y .dijitButtonNode {
- border-color: black!important;
- border-style: outset!important;
- border-width: medium!important;
-}
-.dijit_a11y .dijitTextBoxReadOnly .dijitInputField,
-.dijit_a11y .dijitTextBoxReadOnly .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
-.dijitButtonNode * {
- vertical-align: middle;
-}
-.dijitButtonNode .dijitArrowButtonInner {
-
- background: no-repeat center;
- width: 12px;
- height: 12px;
- direction: ltr;
-}
-.dijitLeft {
-
- background-position:left top;
- background-repeat:no-repeat;
-}
-.dijitStretch {
-
- white-space:nowrap;
- background-repeat:repeat-x;
-}
-.dijitRight {
-
- #display:inline;
- background-position:right top;
- background-repeat:no-repeat;
-}
-.dijitToggleButton,
-.dijitButton,
-.dijitDropDownButton,
-.dijitComboButton {
-
- margin: 0.2em;
-}
-.dijitButtonContents {
- display: block;
-}
-td.dijitButtonContents {
- display: table-cell;
-}
-.dijitButtonNode IMG {
-
- vertical-align:middle;
-
-}
-TABLE.dijitComboButton {
-
- border-collapse: collapse;
- border:0;
- padding:0;
- margin:0;
-}
-.dijitToolbar .dijitComboButton {
-
- border-collapse: separate;
-}
-.dijitToolbar .dijitToggleButton,
-.dijitToolbar .dijitButton,
-.dijitToolbar .dijitDropDownButton,
-.dijitToolbar .dijitComboButton {
- margin: 0;
-}
-.dijitToolbar .dijitButtonContents {
-
- padding: 1px 2px;
-}
-.dj_ie .dijitComboButton {
-
- margin-bottom: -3px;
-}
-.dj_webkit .dijitToolbar .dijitDropDownButton {
- padding-left: 0.3em;
-}
-.dj_gecko .dijitToolbar .dijitButtonNode::-moz-focus-inner {
- padding:0;
-}
-.dijitButtonNode {
-
- border:1px solid gray;
- margin:0;
- line-height:normal;
- vertical-align: middle;
- #vertical-align: auto;
- text-align:center;
- white-space: nowrap;
-}
-.dj_webkit .dijitSpinner .dijitSpinnerButtonContainer {
-
- line-height:inherit;
-}
-.dijitTextBox .dijitButtonNode {
- border-width: 0;
-}
-.dijitButtonNode,
-.dijitButtonNode * {
- cursor: pointer;
-}
-.dj_ie .dijitButtonNode {
-
- zoom: 1;
-}
-.dj_ie .dijitButtonNode button {
-
- overflow: visible;
-}
-DIV.dijitArrowButton {
- float: right;
-}
-.dijitTextBox {
- border: solid black 1px;
- #overflow: hidden;
- width: 15em;
- vertical-align: middle;
- #vertical-align: auto;
-}
-.dijitTextBoxReadOnly,
-.dijitTextBoxDisabled {
- color: gray;
-}
-.dj_webkit .dijitTextBoxDisabled INPUT {
- color: #eee;
-}
-.dj_webkit TEXTAREA.dijitTextAreaDisabled {
- color: #333;
-}
-.dj_gecko .dijitTextBoxReadOnly INPUT,
-.dj_gecko .dijitTextBoxDisabled INPUT {
- -moz-user-input: none;
-}
-.dijitPlaceHolder {
-
- color: #AAAAAA;
- font-style: italic;
- position: absolute;
- top: 0;
- left: 0;
- #filter: "";
-}
-.dijitTimeTextBox {
- width: 8em;
-}
-.dijitTextBox INPUT:focus {
- outline: none;
-}
-.dijitTextBoxFocused {
- outline: auto 5px -webkit-focus-ring-color;
-}
-.dijitTextBox INPUT {
- float: left;
-}
-.dijitInputInner {
-
- border:0 !important;
- vertical-align:middle !important;
- background-color:transparent !important;
- width:100% !important;
-
- padding-left: 0 !important;
- padding-right: 0 !important;
- margin-left: 0 !important;
- margin-right: 0 !important;
-}
-.dijit_a11y .dijitTextBox INPUT {
- margin: 0 !important;
-}
-.dijitTextBoxError INPUT.dijitValidationInner,
-.dijitTextBox INPUT.dijitArrowButtonInner {
-
- text-indent: -1em !important;
- direction: ltr !important;
- text-align: left !important;
- height: auto !important;
- #text-indent: 0 !important;
- #letter-spacing: -5em !important;
- #text-align: right !important;
-}
-.dj_ie .dijitTextBox INPUT,
-.dj_ie INPUT.dijitTextBox {
- overflow-y: visible;
- line-height: normal;
-}
-.dj_ie7 .dijitTextBox INPUT.dijitValidationInner,
-.dj_ie7 .dijitTextBox INPUT.dijitArrowButtonInner {
- line-height: 86%;
-}
-.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%;
-}
-.dijit_a11y INPUT.dijitValidationInner,
-.dijit_a11y INPUT.dijitArrowButtonInner {
-
- text-indent: 0 !important;
- width: 1em !important;
- #text-align: left !important;
-}
-.dijitTextBoxError .dijitValidationContainer {
- display: inline;
- cursor: default;
-}
-.dijitSpinner .dijitSpinnerButtonContainer,
-.dijitComboBox .dijitArrowButtonContainer {
-
- border-width: 0 0 0 1px !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
-
- border-width: 0;
-}
-.dj_ie .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
- clear: both;
-}
-.dijit_a11y .dijitTextBox .dijitValidationContainer,
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBox .dijitArrowButtonContainer {
-
- border: solid black !important;
- border-width: 0 0 0 1px !important;
-}
-.dj_ie .dijitToolbar .dijitComboBox {
-
- vertical-align: middle;
-}
-.dijitTextBox .dijitSpinnerButtonContainer {
- width: 1em;
- position: relative !important;
- overflow: hidden;
-}
-.dijitSpinner .dijitSpinnerButtonInner {
- width:1em;
- visibility:hidden !important;
- overflow-x:hidden;
-}
-.dijitComboBox .dijitButtonNode,
-.dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 0;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border: 0 none !important;
-}
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner,
-.dijit_a11y .dijitSpinnerButtonContainer INPUT {
- width: 1em !important;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner {
- margin: 0 auto !important;
-}
-.dj_ie .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.3em !important;
- padding-right: 0.3em !important;
- margin-left: 0.3em !important;
- margin-right: 0.3em !important;
- width: 1.4em !important;
-}
-.dj_ie7 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.0em !important;
- padding-right: 0.0em !important;
- width: 1em !important;
-}
-.dj_ie6 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- margin-left: 0.1em !important;
- margin-right: 0.1em !important;
- width: 1em !important;
-}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- margin-left: 0 !important;
- margin-right: 0 !important;
- width: 2em !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
-
- padding: 0;
- position: absolute !important;
- right: 0;
- float: none;
- height: 50%;
- width: 100%;
- bottom: auto;
- left: 0;
- right: auto;
-}
-.dj_iequirks .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: auto;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitArrowButton {
- overflow: visible !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitDownArrowButton {
- top: 50%;
- border-top-width: 1px !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitUpArrowButton {
- #bottom: 50%;
- top: 0;
-}
-.dijitSpinner .dijitArrowButtonInner {
- margin: auto;
- overflow-x: hidden;
- height: 100% !important;
-}
-.dj_iequirks .dijitSpinner .dijitArrowButtonInner {
- height: auto !important;
-}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- -moz-transform: scale(0.5);
- -moz-transform-origin: center top;
- -webkit-transform: scale(0.5);
- -webkit-transform-origin: center top;
- -o-transform: scale(0.5);
- -o-transform-origin: center top;
- transform: scale(0.5);
- transform-origin: left top;
- padding-top: 0;
- padding-bottom: 0;
- padding-left: 0 !important;
- padding-right: 0 !important;
- width: 100%;
-}
-.dj_ie .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- zoom: 50%;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButtonInner {
- overflow: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 100%;
-}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 1em;
-}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- visibility: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- vertical-align:top;
- visibility: visible;
-}
-.dijit_a11y .dijitSpinnerButtonContainer {
- width: 1em;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 1px 0px 0px 0px;
- border-style: solid !important;
-}
-.dijitCheckBox,
-.dijitRadio,
-.dijitCheckBoxInput {
- padding: 0;
- border: 0;
- width: 16px;
- height: 16px;
- background-position:center center;
- background-repeat:no-repeat;
- overflow: hidden;
-}
-.dijitCheckBox INPUT,
-.dijitRadio INPUT {
- margin: 0;
- padding: 0;
- display: block;
-}
-.dijitCheckBoxInput {
-
- opacity: 0.01;
-}
-.dj_ie .dijitCheckBoxInput {
- filter: alpha(opacity=0);
-}
-.dijit_a11y .dijitCheckBox,
-.dijit_a11y .dijitRadio {
-
- width: auto !important;
- height: auto !important;
-}
-.dijit_a11y .dijitCheckBoxInput {
- opacity: 1;
- filter: none;
- width: auto;
- height: auto;
-}
-.dijitProgressBarEmpty {
-
- position:relative;overflow:hidden;
- border:1px solid black;
- z-index:0;
-}
-.dijitProgressBarFull {
-
- position:absolute;
- overflow:hidden;
- z-index:-1;
- top:0;
- width:100%;
-}
-.dj_ie6 .dijitProgressBarFull {
- height:1.6em;
-}
-.dijitProgressBarTile {
-
- position:absolute;
- overflow:hidden;
- top:0;
- left:0;
- bottom:0;
- right:0;
- margin:0;
- padding:0;
- width:auto;
- height:auto;
- background-color:#aaa;
- background-attachment: fixed;
-}
-.dijit_a11y .dijitProgressBarTile {
-
- border-width:2px;
- border-style:solid;
- background-color:transparent !important;
-}
-.dj_ie6 .dijitProgressBarTile {
-
- position:static;
-
- height:1.6em;
-}
-.dijitProgressBarIndeterminate .dijitProgressBarLabel {
- visibility:hidden;
-}
-.dijitProgressBarIndeterminate .dijitProgressBarTile {
-
-}
-.dijitProgressBarIndeterminateHighContrastImage {
- display:none;
-}
-.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
- display:block;
- position:absolute;
- top:0;
- bottom:0;
- margin:0;
- padding:0;
- width:100%;
- height:auto;
-}
-.dijitProgressBarLabel {
- display:block;
- position:static;
- width:100%;
- text-align:center;
- background-color:transparent !important;
-}
-.dijitTooltip {
- position: absolute;
- z-index: 2000;
- display: block;
-
- left: 50%;
- top: -10000px;
- overflow: visible;
-}
-.dijitTooltipContainer {
- border: solid black 2px;
- background: #b8b5b5;
- color: black;
- font-size: small;
-}
-.dijitTooltipFocusNode {
- padding: 2px 2px 2px 2px;
-}
-.dijitTooltipConnector {
- position: absolute;
-}
-.dijit_a11y .dijitTooltipConnector {
- display: none;
-}
-.dijitTooltipData {
- display:none;
-}
-.dijitLayoutContainer {
- position: relative;
- display: block;
- overflow: hidden;
-}
-body .dijitAlignTop,
-body .dijitAlignBottom,
-body .dijitAlignLeft,
-body .dijitAlignRight {
- position: absolute;
- overflow: hidden;
-}
-body .dijitAlignClient { position: absolute; }
-.dijitBorderContainer, .dijitBorderContainerNoGutter {
- position:relative;
- overflow: hidden;
-}
-.dijitBorderContainerPane,
-.dijitBorderContainerNoGutterPane {
- position: absolute !important;
- z-index: 2;
-}
-.dijitBorderContainer > .dijitTextArea {
-
- resize: none;
-}
-.dijitGutter {
-
- position: absolute;
- font-size: 1px;
-}
-.dijitSplitter {
- position: absolute;
- overflow: hidden;
- z-index: 10;
- background-color: #fff;
- border-color: gray;
- border-style: solid;
- border-width: 0;
-}
-.dj_ie .dijitSplitter {
- z-index: 1;
-}
-.dijitSplitterActive {
- z-index: 11 !important;
-}
-.dijitSplitterCover {
- position:absolute;
- z-index:-1;
- top:0;
- left:0;
- width:100%;
- height:100%;
-}
-.dijitSplitterCoverActive {
- z-index:3 !important;
-}
-.dj_ie .dijitSplitterCover {
- background: white;
- filter: alpha(opacity=0);
-}
-.dijitSplitterH {
- height: 7px;
- border-top:1px;
- border-bottom:1px;
- cursor: ns-resize;
-}
-.dijitSplitterV {
- width: 7px;
- border-left:1px;
- border-right:1px;
- cursor: ew-resize;
-}
-.dijitSplitContainer {
- position: relative;
- overflow: hidden;
- display: block;
-}
-.dj_ff3 .dijit_a11y div.dijitSplitter:focus {
- outline-style:dotted;
- outline-width: 2px;
-}
-.dijitSplitPane {
- position: absolute;
-}
-.dijitSplitContainerSizerH,
-.dijitSplitContainerSizerV {
- position:absolute;
- font-size: 1px;
- cursor: move;
- cursor: w-resize;
- background-color: ThreeDFace;
- border: 1px solid;
- border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
- margin: 0;
-}
-.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
- overflow:hidden;
- position:absolute;
- top:49%;
-}
-.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
- position:absolute;
- left:49%;
-}
-.dijitSplitterShadow,
-.dijitSplitContainerVirtualSizerH,
-.dijitSplitContainerVirtualSizerV {
- font-size: 1px;
- background-color: ThreeDShadow;
- -moz-opacity: 0.5;
- opacity: 0.5;
- filter: Alpha(Opacity=50);
- margin: 0;
-}
-.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
- cursor: w-resize;
-}
-.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
- cursor: n-resize;
-}
-.dijit_a11y .dijitSplitterH {
- border-top:1px solid #d3d3d3 !important;
- border-bottom:1px solid #d3d3d3 !important;
-}
-.dijit_a11y .dijitSplitterV {
- border-left:1px solid #d3d3d3 !important;
- border-right:1px solid #d3d3d3 !important;
-}
-.dijitContentPane {
- display: block;
- overflow: auto;
-}
-.dijitContentPaneSingleChild {
-
- overflow: hidden;
-}
-.dijitTitlePane {
- display: block;
- overflow: hidden;
-}
-.dijitTitlePaneTitle {
- cursor: pointer;
-}
-.dijitFixedOpen {
-
- cursor: default;
-}
-.dijitTitlePaneTitle * {
- vertical-align: middle;
-}
-.dijitTitlePane .dijitArrowNodeInner {
-
- display: none;
-}
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
-
- display:inline !important;
- font-family: monospace;
-}
-.dijit_a11y .dijitTitlePane .dijitArrowNode {
-
- display:none;
-}
-.dj_ie6 .dijitTitlePaneContentOuter,
-.dj_ie6 .dijitTitlePane .dijitTitlePaneTitle {
-
- zoom: 1;
-}
-.dijitColorPalette {
- border: 1px solid #999;
- background: #fff;
- position: relative;
-}
-img.dijitColorPaletteUnder {
-
- border-style: none;
- position: absolute;
- left: 0;
- top: 0;
-}
-.dijitColorPalette .dijitPaletteTable {
-
- padding: 2px 3px 3px 3px;
- position: relative;
- overflow: hidden;
- outline: 0;
- border-collapse: separate;
-}
-.dj_ie6 .dijitColorPalette .dijitPaletteTable,
-.dj_ie7 .dijitColorPalette .dijitPaletteTable,
-.dj_iequirks .dijitColorPalette .dijitPaletteTable {
-
- padding: 0;
- margin: 2px 3px 3px 3px;
-}
-.dijitColorPalette .dijitPaletteCell {
-
- height: 20px;
- width: 20px;
- font-size: 1px;
- vertical-align: middle;
- text-align: center;
-}
-.dijitColorPalette .dijitPaletteImg {
-
- width: 16px;
- height: 14px;
- border: 1px solid #999;
- cursor: default;
- vertical-align: middle;
-}
-.dj_iequirks .dijitColorPalette .dijitPaletteImg {
- margin: 1px;
-}
-.dijitPaletteTable td {
- padding: 0px;
-}
-.dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
-
- border: 1px solid #000;
-}
-.dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
-.dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
- border: 2px solid #000;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteTable,
-.dijit_a11y .dijitColorPalette .dijitPaletteTable * {
-
- background-color: transparent !important;
-}
-.dj_gecko .dijit_a11y .dijitColorPalette .dijitPaletteCellFocused .dijitPaletteImg {
- border: 3px dotted #000;
- margin: -1px;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
- border: 2px solid #000 !important;
-}
-.dijitAccordionContainer {
- border:1px solid #b7b7b7;
- border-top:0 !important;
-}
-.dijitAccordionTitle {
- cursor: pointer;
-}
-.dijitAccordionTitleSelected {
- cursor: default;
-}
-.dijitAccordionTitle .arrowTextUp,
-.dijitAccordionTitle .arrowTextDown {
- display: none;
- font-size: 0.65em;
- font-weight: normal !important;
-}
-.dijit_a11y .dijitAccordionTitle .arrowTextUp,
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextDown {
- display: inline;
-}
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextUp {
- display: none;
-}
-.dj_ie6 .dijitAccordionTitle,
-.dj_iequirks .dijitAccordionTitle {
-
- zoom: 1;
-}
-.dijitCalendarContainer {
- width: auto;
-}
-.dijitCalendarContainer th, .dijitCalendarContainer td {
- padding: 0;
-}
-.dijitCalendarNextYear {
- margin:0 0 0 0.55em;
-}
-.dijitCalendarPreviousYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarIncrementControl {
- vertical-align: middle;
-}
-.dijitCalendarIncrementControl,
-.dijitCalendarDateTemplate,
-.dijitCalendarMonthLabel,
-.dijitCalendarPreviousYear,
-.dijitCalendarNextYear {
- cursor: pointer;
-}
-.dijitCalendarDisabledDate {
- color: gray;
- text-decoration: line-through;
- cursor: default;
-}
-.dijitSpacer {
-
- position: relative;
- height: 1px;
- overflow: hidden;
- visibility: hidden;
-}
-.dijitMenu {
- border:1px solid black;
- background-color:white;
-}
-.dijitMenuTable {
- border-collapse:collapse;
- border-width:0;
- background-color:white;
-}
-.dj_webkit .dijitMenuTable td[colspan="2"]{
- border-right:hidden;
-}
-.dijitMenuItem {
- text-align: left;
- white-space: nowrap;
- padding:.1em .2em;
- cursor:pointer;
-}
-.dijitMenuPassive .dijitMenuItemHover,
-.dijitMenuItemSelected {
-
- background-color:black;
- color:white;
-}
-.dijitMenuItemIcon, .dijitMenuExpand {
- background-repeat: no-repeat;
-}
-.dijitMenuItemDisabled * {
-
- opacity:0.5;
- cursor:default;
-}
-.dj_ie .dijit_a11y .dijitMenuItemDisabled,
-.dj_ie .dijit_a11y .dijitMenuItemDisabled td,
-.dj_ie .dijitMenuItemDisabled *,
-.dj_ie .dijitMenuItemDisabled td {
- color:gray !important;
- filter: alpha(opacity=35);
-}
-.dijitMenuItemLabel {
- position: relative;
- vertical-align: middle;
-}
-.dijit_a11y .dijitMenuItemSelected {
- border: 1px dotted black !important;
-}
-.dj_ff3 .dijit_a11y .dijitMenuItem td {
- padding: none !important;
- background:none !important;
-}
-.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
- border-width: 1px;
- border-style: solid;
-}
-.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
- position:static;
-}
-.dijitMenuExpandA11y {
- display: none;
-}
-.dijit_a11y .dijitMenuExpandA11y {
- display: inline;
-}
-.dijitMenuSeparator td {
- border: 0;
- padding: 0;
-}
-.dijitMenuSeparatorTop {
- height: 50%;
- margin: 0;
- margin-top:3px;
- font-size: 1px;
-}
-.dijitMenuSeparatorBottom {
- height: 50%;
- margin: 0;
- margin-bottom:3px;
- font-size: 1px;
-}
-.dijitCheckedMenuItemIconChar {
- vertical-align: middle;
- visibility:hidden;
-}
-.dijitCheckedMenuItemChecked .dijitCheckedMenuItemIconChar {
- visibility: visible;
-}
-.dijit_a11y .dijitCheckedMenuItemIconChar {
- display:inline !important;
-}
-.dijit_a11y .dijitCheckedMenuItemIcon {
- display: none;
-}
-.dj_ie .dijit_a11y .dijitMenuBar .dijitMenuItem {
-
- margin: 0px;
-}
-.dijitStackController .dijitToggleButtonChecked * {
- cursor: default;
-}
-.dijitTabContainerNoLayout {
- width: 100%;
-}
-.dijitTabContainerBottom-tabs,
-.dijitTabContainerTop-tabs,
-.dijitTabContainerLeft-tabs,
-.dijitTabContainerRight-tabs {
- overflow: visible !important;
-}
-.dijitTabContainerBottom-container,
-.dijitTabContainerTop-container,
-.dijitTabContainerLeft-container,
-.dijitTabContainerRight-container {
- z-index:0;
- overflow: hidden;
- border: 1px solid black;
-}
-.nowrapTabStrip {
- width: 50000px;
- display: block;
- position: relative;
-}
-.dijitTabListWrapper {
- overflow: hidden;
-}
-.dijit_a11y .tabStripButton img {
-
- display: none;
-}
-.dijitTabContainerTop-tabs {
- border-bottom: 1px solid black;
-}
-.dijitTabContainerTop-container {
- border-top: 0px;
-}
-.dijitTabContainerLeft-tabs {
- border-right: 1px solid black;
- float: left;
-}
-.dijitTabContainerLeft-container {
- border-left: 0px;
-}
-.dijitTabContainerBottom-tabs {
- border-top: 1px solid black;
-}
-.dijitTabContainerBottom-container {
- border-bottom: 0px;
-}
-.dijitTabContainerRight-tabs {
- border-left: 1px solid black;
- float: left;
-}
-.dijitTabContainerRight-container {
- border-right: 0px;
-}
-DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
- cursor: auto;
-}
-.dijitTab {
- position:relative;
- cursor:pointer;
- white-space:nowrap;
- z-index:3;
-}
-.dijitTab * {
-
- vertical-align: middle;
-}
-.dijitTabChecked {
- cursor: default;
-}
-.dijitTabContainerTop-tabs .dijitTab {
- top: 1px;
-}
-.dijitTabContainerBottom-tabs .dijitTab {
- top: -1px;
-}
-.dijitTabContainerLeft-tabs .dijitTab {
- left: 1px;
-}
-.dijitTabContainerRight-tabs .dijitTab {
- left: -1px;
-}
-.dijitTabContainerTop-tabs .dijitTab,
-.dijitTabContainerBottom-tabs .dijitTab {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
-}
-.dijitTabInnerDiv {
- position:relative;
-}
-.tabStripButton {
- z-index: 12;
-}
-.dijitTabButtonDisabled .tabStripButton {
- display: none;
-}
-.dijitTabCloseButton {
- margin-left: 1em;
-}
-.dijitTabCloseText {
- display:none;
-}
-.dijit_a11y .dijitTabCloseButton {
- background-image: none !important;
- width: auto !important;
- height: auto !important;
- border: thin dotted;
-}
-.dijit_a11y .dijitTabCloseButtonHover {
- border:thin solid;
-}
-.dijit_a11y .dijitTabCloseText {
- display: inline;
-}
-.dijit_a11y .dijitTabChecked {
-
- border-style:dashed !important;
-}
-.dijit_a11y .dijitTabInnerDiv {
- border-left:none !important;
- }
-.dijitTabPane,
-.dijitStackContainer-child,
-.dijitAccordionContainer-child {
-
- border: none !important;
-}
-.dijitInlineEditBoxDisplayMode {
- border: 1px solid transparent;
- cursor: text;
-}
-.dijit_a11y .dijitInlineEditBoxDisplayMode,
-.dj_ie6 .dijitInlineEditBoxDisplayMode {
-
- border: none;
-}
-.dijitInlineEditBoxDisplayModeHover,
-.dijit_a11y .dijitInlineEditBoxDisplayModeHover,
-.dj_ie6 .dijitInlineEditBoxDisplayModeHover {
-
- background-color: #e2ebf2;
- border: solid 1px black;
-}
-.dijitInlineEditBoxDisplayModeDisabled {
- cursor: default;
-}
-.dijitTreeIndent {
-
- width: 19px;
-}
-.dijitTreeRow, .dijitTreeContent {
- white-space: nowrap;
-}
-.dijitTreeRow img {
-
- vertical-align: middle;
-}
-.dijitTreeContent {
- cursor: default;
-}
-.dijitExpandoText {
- display: none;
-}
-.dijit_a11y .dijitExpandoText {
- display: inline;
- padding-left: 10px;
- padding-right: 10px;
- font-family: monospace;
- border-style: solid;
- border-width: thin;
- cursor: pointer;
-}
-.dijitTreeLabel {
- margin: 0px 4px;
-}
-.dijitDialog {
- position: absolute;
- z-index: 999;
- overflow: hidden;
-}
-.dijitDialogTitleBar {
- cursor: move;
-}
-.dijitDialogFixed .dijitDialogTitleBar {
- cursor:default;
-}
-.dijitDialogCloseIcon {
- cursor: pointer;
-}
-.dijitDialogUnderlayWrapper {
- position: absolute;
- left: 0;
- top: 0;
- z-index: 998;
- display: none;
- background: transparent !important;
-}
-.dijitDialogUnderlay {
- background: #eee;
- opacity: 0.5;
-}
-.dj_ie .dijitDialogUnderlay {
- filter: alpha(opacity=50);
-}
-.dijit_a11y .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitDialog {
- opacity: 1 !important;
- background-color: white !important;
-}
-.dijitDialog .closeText {
- display:none;
-
- position:absolute;
-}
-.dijit_a11y .dijitDialog .closeText {
- display:inline;
-}
-.dijitSliderMoveable {
- z-index:99;
- position:absolute !important;
- display:block;
- vertical-align:middle;
-}
-.dijitSliderMoveableH {
- right:0;
-}
-.dijitSliderMoveableV {
- right:50%;
-}
-.dijit_a11y DIV.dijitSliderImageHandle,
-.dijitSliderImageHandle {
- margin:0;
- padding:0;
- position:relative !important;
- border:8px solid gray;
- width:0;
- height:0;
- cursor: pointer;
-}
-.dj_iequirks .dijit_a11y .dijitSliderImageHandle {
- font-size: 0;
-}
-.dj_ie7 .dijitSliderImageHandle {
- overflow: hidden;
-}
-.dj_ie7 .dijit_a11y .dijitSliderImageHandle {
- overflow: visible;
-}
-.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
- border:4px solid #000;
- height:8px;
- width:8px;
-}
-.dijitSliderImageHandleV {
- top:-8px;
- right: -50%;
-}
-.dijitSliderImageHandleH {
- left:50%;
- top:-5px;
- vertical-align:top;
-}
-.dijitSliderBar {
- border-style:solid;
- border-color:black;
- cursor: pointer;
-}
-.dijitSliderBarContainerV {
- position:relative;
- height:100%;
- z-index:1;
-}
-.dijitSliderBarContainerH {
- position:relative;
- z-index:1;
-}
-.dijitSliderBarH {
- height:4px;
- border-width:1px 0;
-}
-.dijitSliderBarV {
- width:4px;
- border-width:0 1px;
-}
-.dijitSliderProgressBar {
- background-color:red;
- z-index:1;
-}
-.dijitSliderProgressBarV {
- position:static !important;
- height:0%;
- vertical-align:top;
- text-align:left;
-}
-.dijitSliderProgressBarH {
- position:absolute !important;
- width:0%;
- vertical-align:middle;
- overflow:visible;
-}
-.dijitSliderRemainingBar {
- overflow:hidden;
- background-color:transparent;
- z-index:1;
-}
-.dijitSliderRemainingBarV {
- height:100%;
- text-align:left;
-}
-.dijitSliderRemainingBarH {
- width:100% !important;
-}
-.dijitSliderBumper {
- overflow:hidden;
- z-index:1;
-}
-.dijitSliderBumperV {
- width:4px;
- height:8px;
- border-width:0 1px;
-}
-.dijitSliderBumperH {
- width:8px;
- height:4px;
- border-width:1px 0;
-}
-.dijitSliderBottomBumper,
-.dijitSliderLeftBumper {
- background-color:red;
-}
-.dijitSliderTopBumper,
-.dijitSliderRightBumper {
- background-color:transparent;
-}
-.dijitSliderDecoration {
- text-align:center;
-}
-.dijitSliderV TD {
- position: relative;
-}
-.dijitSliderDecorationH {
- width: 100%;
-}
-.dijitSliderDecorationV {
- height: 100%;
-}
-.dijitSliderButton {
- font-family:monospace;
- margin:0;
- padding:0;
- display:block;
-}
-.dijit_a11y .dijitSliderButtonInner {
- visibility:visible !important;
-}
-.dijitSliderButtonContainer {
- text-align:center;
- height:0;
-}
-.dijitSliderButtonContainer * {
- cursor: pointer;
-}
-.dijitSlider .dijitButtonNode {
- padding:0;
- display:block;
-}
-.dijitRuleContainer {
- position:relative;
- overflow:visible;
-}
-.dijitRuleContainerV {
- height:100%;
- line-height:0;
- float:left;
- text-align:left;
-}
-.dj_opera .dijitRuleContainerV {
- line-height:2%;
-}
-.dj_ie .dijitRuleContainerV {
- line-height:normal;
-}
-.dj_gecko .dijitRuleContainerV {
- margin:0 0 1px 0;
-}
-.dijitRuleMark {
- position:absolute;
- border:1px solid black;
- line-height:0;
- height:100%;
-}
-.dijitRuleMarkH {
- width:0;
- border-top-width:0 !important;
- border-bottom-width:0 !important;
- border-left-width:0 !important;
-}
-.dijitRuleLabelContainer {
- position:absolute;
-}
-.dijitRuleLabelContainerH {
- text-align:center;
- display:inline-block;
-}
-.dijitRuleLabelH {
- position:relative;
- left:-50%;
-}
-.dijitRuleLabelV {
-
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
-}
-.dijitRuleMarkV {
- height:0;
- border-right-width:0 !important;
- border-bottom-width:0 !important;
- border-left-width:0 !important;
- width:100%;
- left:0;
-}
-.dj_ie .dijitRuleLabelContainerV {
- margin-top:-.55em;
-}
-.dijit_a11y .dijitSliderReadOnly,
-.dijit_a11y .dijitSliderDisabled {
- opacity:0.6;
-}
-.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
-.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
- filter: alpha(opacity=40);
-}
-.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
- font-family: monospace;
- font-size: 1em;
- line-height: 1em;
- height: auto;
- width: auto;
- margin: 0px 4px;
-}
-.dijit_a11y .dijitButtonContents .dijitButtonText,
-.dijit_a11y .dijitTab .tabLabel {
- display: inline !important;
-}
-.dijitTextArea {
- width:100%;
- overflow-y: auto;
-}
-.dijitTextArea[cols] {
- width:auto;
-}
-.dj_ie .dijitTextAreaCols {
- width:auto;
-}
-.dijitToolbarSeparator {
- height: 18px;
- width: 5px;
- padding: 0 1px;
- margin: 0;
-}
-.dijitIEFixedToolbar {
- position:absolute;
-
- top: expression(eval((document.documentElement||document.body).scrollTop));
-}
-.dijitEditor {
- display: block;
-}
-.dijitEditorDisabled,
-.dijitEditorReadOnly {
- color: gray;
-}
-.dijitTimePickerItemInner {
- text-align:center;
- border:0;
- padding:2px 8px 2px 8px;
-}
-.dijitTimePickerTick,
-.dijitTimePickerMarker {
- border-bottom:1px solid gray;
-}
-.dijitTimePicker .dijitDownArrowButton {
- border-top: none !important;
-}
-.dijitTimePickerTick {
- color:#CCC;
-}
-.dijitTimePickerMarker {
- color:black;
- background-color:#CCC;
-}
-.dijitTimePickerItemSelected {
- font-weight:bold;
- color:#333;
- background-color:#b7cdee;
-}
-.dijitTimePickerItemHover {
- background-color:gray;
- color:white;
- cursor:pointer;
-}
-.dijit_a11y .dijitTimePickerItemSelected .dijitTimePickerItemInner {
- border: solid 4px black;
-}
-.dijit_a11y .dijitTimePickerItemHover .dijitTimePickerItemInner {
- border: dashed 4px black;
-}
-.dijitToggleButtonIconChar {
-
- display:none !important;
-}
-.dijit_a11y .dijitToggleButton .dijitToggleButtonIconChar {
- display:inline !important;
- visibility:hidden;
-}
-.dj_ie6 .dijitToggleButtonIconChar, .dj_ie6 .tabStripButton .dijitButtonText {
- font-family: "Arial Unicode MS";
-}
-.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
- display: inline !important;
- visibility:visible !important;
-}
-.dijitArrowButtonChar {
- display:none !important;
-}
-.dijit_a11y .dijitArrowButtonChar {
- display:inline !important;
-}
-.dijit_a11y .dijitDropDownButton .dijitArrowButtonInner,
-.dijit_a11y .dijitComboButton .dijitArrowButtonInner {
- display:none !important;
-}
-.dijitSelect {
- margin: 0.2em;
- border-collapse: collapse;
-}
-.dj_ie .dijitSelect,
-.dj_ie7 .dijitSelect,
-.dj_iequirks .dijitSelect {
- vertical-align: middle;
-}
-.dj_ie8 .dijitSelect .dijitButtonText {
- vertical-align: top;
-}
-.dijitToolbar .dijitSelect {
- margin: 0;
-}
-.dj_webkit .dijitToolbar .dijitSelect {
- padding-left: 0.3em;
-}
-.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
-.dijitSelect .dijitButtonContents {
- padding: 0px;
- background: transparent none;
- white-space: nowrap;
- text-align: left;
-}
-.dijitSelectFixedWidth .dijitButtonContents {
- width: 100%;
-}
-.dijitSelectMenu .dijitMenuItemIcon {
-
- display:none;
-}
-.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
-.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
-
- position: static;
-}
-.dijitSelectLabel *
-{
- vertical-align: baseline;
-}
-.dijitSelectSelectedOption * {
- font-weight: bold;
-}
-.dijitSelectMenu {
- border-width: 1px;
-}
-.dijitSelectMenu .dijitMenuTable {
- margin: 0px;
- background-color: transparent;
-}
-.dijitForceStatic {
- position: static !important;
-}
-.dijitReadOnly *,
-.dijitDisabled *,
-.dijitReadOnly,
-.dijitDisabled {
-
- cursor: default;
-}
-.dijitIconSave,
-.dijitIconPrint,
-.dijitIconCut,
-.dijitIconCopy,
-.dijitIconClear,
-.dijitIconDelete,
-.dijitIconUndo,
-.dijitIconEdit,
-.dijitIconNewTask,
-.dijitIconEditTask,
-.dijitIconEditProperty,
-.dijitIconTask,
-.dijitIconFilter,
-.dijitIconConfigure,
-.dijitIconSearch,
-.dijitIconApplication,
-.dijitIconBookmark,
-.dijitIconChart,
-.dijitIconConnector,
-.dijitIconDatabase,
-.dijitIconDocuments,
-.dijitIconMail,
-.dijitLeaf,
-.dijitIconFile,
-.dijitIconFunction,
-.dijitIconKey,
-.dijitIconPackage,
-.dijitIconSample,
-.dijitIconTable,
-.dijitIconUsers,
-.dijitFolderClosed,
-.dijitIconFolderClosed,
-.dijitFolderOpened,
-.dijitIconFolderOpen,
-.dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActEnabled.png);
- width: 16px;
- height: 16px;
-}
-.dj_ie6 .dijitIconSave,
-.dj_ie6 .dijitIconPrint,
-.dj_ie6 .dijitIconCut,
-.dj_ie6 .dijitIconCopy,
-.dj_ie6 .dijitIconClear,
-.dj_ie6 .dijitIconDelete,
-.dj_ie6 .dijitIconUndo,
-.dj_ie6 .dijitIconEdit,
-.dj_ie6 .dijitIconNewTask,
-.dj_ie6 .dijitIconEditTask,
-.dj_ie6 .dijitIconEditProperty,
-.dj_ie6 .dijitIconTask,
-.dj_ie6 .dijitIconFilter,
-.dj_ie6 .dijitIconConfigure,
-.dj_ie6 .dijitIconSearch,
-.dj_ie6 .dijitIconApplication,
-.dj_ie6 .dijitIconBookmark,
-.dj_ie6 .dijitIconChart,
-.dj_ie6 .dijitIconConnector,
-.dj_ie6 .dijitIconDatabase,
-.dj_ie6 .dijitIconDocuments,
-.dj_ie6 .dijitIconMail,
-.dj_ie6 .dijitLeaf,
-.dj_ie6 .dijitIconFile,
-.dj_ie6 .dijitIconFunction,
-.dj_ie6 .dijitIconKey,
-.dj_ie6 .dijitIconPackage,
-.dj_ie6 .dijitIconSample,
-.dj_ie6 .dijitIconTable,
-.dj_ie6 .dijitIconUsers,
-.dj_ie6 .dijitFolderClosed,
-.dj_ie6 .dijitIconFolderClosed,
-.dj_ie6 .dijitFolderOpened,
-.dj_ie6 .dijitIconFolderOpen,
-.dj_ie6 .dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActEnabled8bit.png);
-}
-.dijitDisabled .dijitIconSave,
-.dijitDisabled .dijitIconPrint,
-.dijitDisabled .dijitIconCut,
-.dijitDisabled .dijitIconCopy,
-.dijitDisabled .dijitIconClear,
-.dijitDisabled .dijitIconDelete,
-.dijitDisabled .dijitIconUndo,
-.dijitDisabled .dijitIconEdit,
-.dijitDisabled .dijitIconNewTask,
-.dijitDisabled .dijitIconEditTask,
-.dijitDisabled .dijitIconEditProperty,
-.dijitDisabled .dijitIconTask,
-.dijitDisabled .dijitIconFilter,
-.dijitDisabled .dijitIconConfigure,
-.dijitDisabled .dijitIconSearch,
-.dijitDisabled .dijitIconApplication,
-.dijitDisabled .dijitIconBookmark,
-.dijitDisabled .dijitIconChart,
-.dijitDisabled .dijitIconConnector,
-.dijitDisabled .dijitIconDatabase,
-.dijitDisabled .dijitIconDocuments,
-.dijitDisabled .dijitIconMail,
-.dijitDisabled .dijitLeaf,
-.dijitDisabled .dijitIconFile,
-.dijitDisabled .dijitIconFunction,
-.dijitDisabled .dijitIconKey,
-.dijitDisabled .dijitIconPackage,
-.dijitDisabled .dijitIconSample,
-.dijitDisabled .dijitIconTable,
-.dijitDisabled .dijitIconUsers,
-.dijitDisabled .dijitFolderClosed,
-.dijitDisabled .dijitIconFolderClosed,
-.dijitDisabled .dijitFolderOpened,
-.dijitDisabled .dijitIconFolderOpen,
-.dijitDisabled .dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActDisabled.png);
-}
-.dijitIconSave { background-position: 0px; }
-.dijitIconPrint { background-position: -16px; }
-.dijitIconCut { background-position: -32px; }
-.dijitIconCopy { background-position: -48px; }
-.dijitIconClear { background-position: -64px; }
-.dijitIconDelete { background-position: -80px; }
-.dijitIconUndo { background-position: -96px; }
-.dijitIconEdit { background-position: -112px; }
-.dijitIconNewTask { background-position: -128px; }
-.dijitIconEditTask { background-position: -144px; }
-.dijitIconEditProperty { background-position: -166px; }
-.dijitIconTask { background-position: -176px; }
-.dijitIconFilter { background-position: -192px; }
-.dijitIconConfigure { background-position: -208px; }
-.dijitIconSearch { background-position: -224px; }
-.dijitIconError { background-position: -496px; }
-.dijitIconApplication { background-position: -240px; }
-.dijitIconBookmark { background-position: -256px; }
-.dijitIconChart { background-position: -272px; }
-.dijitIconConnector { background-position: -288px; }
-.dijitIconDatabase { background-position: -304px; }
-.dijitIconDocuments { background-position: -320px; }
-.dijitIconMail { background-position: -336px; }
-.dijitIconFile, .dijitLeaf { background-position: -352px; }
-.dijitIconFunction { background-position: -368px; }
-.dijitIconKey { background-position: -384px; }
-.dijitIconPackage{ background-position: -400px; }
-.dijitIconSample { background-position: -416px; }
-.dijitIconTable { background-position: -432px; }
-.dijitIconUsers { background-position: -448px; }
-.dijitIconFolderClosed, .dijitFolderClosed { background-position: -464px; }
-.dijitIconFolderOpen, .dijitFolderOpened { background-position: -480px; }
-.nihilo .dojoDndItemBefore {
- border-top: 2px solid #369;
-}
-.nihilo .dojoDndItemAfter {
- border-bottom: 2px solid #369;
-}
-.nihilo .dojoDndItemOver {
- cursor:pointer;
-}
-.nihilo table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
-.nihilo .dojoDndAvatar td { border: none; }
-.nihilo .dojoDndAvatar tr { border: none; }
-.nihilo .dojoDndAvatarHeader td { height: 20px; padding: 0 0 0 21px; }
-.nihilo .dojoDndAvatarItem td { padding: 2px;}
-.nihilo.dojoDndMove .dojoDndAvatarHeader {background-color: #f58383; background-image: url(images/dndNoMove.png); background-repeat: no-repeat; background-position: 2px center;}
-.nihilo.dojoDndCopy .dojoDndAvatarHeader {background-color: #f58383; background-image: url(images/dndNoCopy.png); background-repeat: no-repeat; background-position: 2px center;}
-.nihilo.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader {background-color: #97e68d; background-image: url(images/dndMove.png); background-repeat: no-repeat; background-position: 2px center;}
-.nihilo.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader {background-color: #97e68d; background-image: url(images/dndCopy.png); background-repeat: no-repeat; background-position: 2px center;}
-.nihilo .dijitContentPane {
- padding: 0px;
-}
-.nihilo .dijitTabContainerTop-dijitContentPane,
-.nihilo .dijitTabContainerLeft-dijitContentPane,
-.nihilo .dijitTabContainerRight-dijitContentPane,
-.nihilo .dijitTabContainerBottom-dijitContentPane,
-.nihilo .dijitAccordionContainer-dijitContentPane {
- background-color: #fff;
- padding: 5px;
-}
-.nihilo .dijitSplitContainer-dijitContentPane,
-.nihilo .dijitBorderContainer-dijitContentPane {
- background-color: #fff;
- padding: 5px;
-}
-.nihilo .dijitMenu,
-.nihilo .dijitMenuBar {
- border: 1px solid #d3d3d3;
- margin: 0px;
- padding: 0px;
- background-color: #fff;
-}
-.nihilo .dijitBorderContainer .dijitMenuBar {
- border: 1px #ccc solid;
-}
-.nihilo .dijitMenuItem {
- font-family: sans-serif;
- margin: 0px;
- color: #243C5F;
-}
-.nihilo .dijitMenuBar .dijitMenuItem {
- padding: 4px 5px;
-}
-.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
- font-style: italic;
-}
-.nihilo .dijitMenuItem TD {
- padding:1px;
-}
-.nihilo .dijitMenuPassive .dijitMenuItemHover,
-.nihilo .dijitMenuItemSelected {
- background-color: #ffe284;
- color: #243C5F;
-}
-.nihilo .dijitMenuItemIcon {
- width: 15px;
- height: 15px;
-}
-.nihilo .dijitMenuExpand {
- width:15px;
- height:15px;
- background-image: url(images/spriteRoundedIconsSmall.png);
- background-position: -30px top;
-}
-.dj_ie6 .nihilo .dijitMenuExpand {
- background-image:url(images/spriteRoundedIconsSmall.gif);
-}
-.nihilo .dijitMenuSeparator {
- height: 1px;
-}
-.nihilo .dijitMenuSeparatorTop {
- border-bottom: 1px solid #fff;
-}
-.nihilo .dijitMenuSeparatorBottom {
- border-top: 1px solid #d3d3d3;
-}
-.nihilo .dijitCheckedMenuItemIconChar {
- display: none;
-}
-.nihilo .dijitCheckedMenuItemIcon {
- background-image: url(images/spriteCheckbox.gif);
- background-position: -80px;
-}
-.nihilo .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
- background-position: -64px;
-}
-.nihilo .dijitTabContainer .tabStripRBtn {
- margin-right: 21px;
-}
-.nihilo .dijitTabContainer .tabStripLBtn {
- margin-left: 21px;
-}
-.nihilo .dijitTabContainerBottom .nowrapTabStrip .dijitTab {
- top: 0px;
-}
-.nihilo .dijitTabPaneWrapper {
- background:#fff;
- border:1px solid #ccc;
- margin: 0;
- padding: 0;
-}
-.nihilo .dijitTabInnerDiv {
- padding:0px 3px 0px 0px;
- margin: 0 0 0 4px;
- background: url(images/tabContainerSprite.gif) no-repeat;
- background-position: right -400px;
-}
-.nihilo .dijitTab {
- line-height:normal;
- margin:0 2px 0 0;
- padding:0px;
- background: url(images/tabContainerSprite.gif) no-repeat 0 -300px;
- color: #6d6d6d;
- border-bottom: 1px #ccc solid;
-}
-.nihilo .dijitTabInnerDiv .dijitTabContent {
- padding:3px 3px 3px 4px;
- background: url(images/tabContainerSprite.gif) repeat-x 0 -350px;
- position: relative;
-}
-.nihilo .dijitTabHover {
- color: #243C5F;
- background: url(images/tabContainerSprite.gif) no-repeat 0px -150px;
-}
-.nihilo .dijitTabHover .dijitTabInnerDiv {
- background: url(images/tabContainerSprite.gif) no-repeat right -250px;
-}
-.nihilo .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
- background: url(images/tabContainerSprite.gif) repeat-x 0 -200px;
-}
-.nihilo .dijitTabChecked
-{
-
- background: url(images/tabContainerSprite.gif) no-repeat 0px -0px;
-}
-.nihilo .dijitTabChecked .dijitTabInnerDiv {
- background: url(images/tabContainerSprite.gif) no-repeat right -100px;
-}
-.nihilo .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
- background: url(images/tabContainerSprite.gif) repeat-x 0 -50px;
- color: #243C5F !important;
-}
-.nihilo .dijitTabContainerNested .dijitTabListWrapper {
- height: auto;
-}
-.nihilo .dijitTabContainerTabListNested {
- background: #FDFDFD;
- border: none;
- margin-bottom: 0px;
-}
-.nihilo .dijitTabContainerTabListNested .dijitTab {
- background: none;
- border: none;
- top: 0px;
-}
-.nihilo .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv,
-.nihilo .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
- background: none;
-}
-.nihilo .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent .tabLabel {
- text-decoration: underline;
-}
-.nihilo .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
- text-decoration: underline;
- font-weight: bold;
-}
-.nihilo .dijitTabContainerSpacerNested {
-
- height: 0px;
- border-bottom: 0px;
-}
-.nihilo .dijitTabPaneWrapperNested {
- border: none;
-}
-.nihilo .dijitTabCloseButton {
- background: url(images/spriteRoundedIconsSmall.png) no-repeat -60px top;
- width: 15px;
- height: 15px;
- margin-top: -1px;
-}
-.dj_ie6 .nihilo .dijitTabCloseButton {
- background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px top;
-}
-.nihilo .dijitTabCloseButtonHover {
- background: url(images/spriteRoundedIconsSmall.png) no-repeat -60px -15px;
-}
-.dj_ie6 .nihilo .dijitTabCloseButtonHover {
- background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px -15px;
-}
-.nihilo .dijitTab .tabLabel {
-
- min-height: 15px;
- display: inline-block;
-}
-.dj_ie6 .nihilo .dijitTabButtonIcon {
-
- height: 18px;
- width: 1px;
-}
-.nihilo .dijitTabContainerTop-tabs {
- border-bottom: none;
- padding-bottom: 1px;
- background-position: bottom;
- padding-left: 3px;
-}
-.dj_ie6 .nihilo .dijitTabListContainer-top,
-.dj_ie7 .nihilo .dijitTabListContainer-top {
- z-index: 3;
-}
-.dj_ie6 .nihilo .dijitTabContainerTop-tabs,
-.dj_ie7 .nihilo .dijitTabContainerTop-tabs {
- border-bottom: 1px solid #ccc;
- padding-bottom: 0px;
-}
-.nihilo .dijitTabContainerTopNoStrip {
- padding-top: 3px;
-}
-.nihilo .dijitTabContainerTop-container {
- border-top: none;
-}
-.nihilo .dijitTabContainerTop-tabs .dijitTabChecked {
- border-bottom-color: #f8f8f8;
-}
-.nihilo .dijitTabContainer .dijitTabContainerTopStrip {
- border-bottom: none;
- padding-top: 1px;
- margin-top: 1px;
- background: #f2f2f2;
- border-top: 1px solid #CCC;
- border-right: 1px solid #CCC;
- border-left: 1px solid #CCC;
-}
-.nihilo .dijitTabContainerBottom-tabs {
- border-top: none;
- background-position: top;
- padding-left: 3px;
-}
-.dj_ie6 .nihilo .dijitTabListContainer-bottom,
-.dj_ie7 .nihilo .dijitTabListContainer-bottom {
- z-index: 3;
-}
-.dj_ie6 .nihilo .dijitTabContainerBottom-tabs,
-.dj_ie7 .nihilo .dijitTabContainerBottom-tabs {
- border-top: 1px solid #ccc;
- margin-top: -1px;
-}
-.nihilo .dijitTabContainerBottom-container {
- border-bottom: none;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTab {
- border-bottom: none;
- border-top: 1px solid #ccc;
- background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom left;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked {
- border-top-color: #f8f8f8;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
- padding-top: 3px;
- padding-bottom: 3px;
- background: url(images/tabBottomEnabledC.gif) repeat-x bottom left;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom right;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabHover {
- color: #243C5F;
- background: url(images/tabBottomHoverSpriteLR.gif) no-repeat bottom left;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv {
- background: url(images/tabBottomHoverSpriteLR.gif) no-repeat bottom right;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
- background: url(images/tabBottomHoverC.gif) repeat-x bottom left;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked {
-
- background: url(images/tabBottomActiveSpriteLR.gif) no-repeat bottom left;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
- background: url(images/tabBottomActiveSpriteLR.gif) no-repeat bottom right;
-}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
- background: url(images/tabBottomActiveC.gif) repeat-x bottom left;
-}
-.nihilo .dijitTabContainer .dijitTabContainerBottomStrip {
- border: 1px solid #ccc;
- background: #f2f2f2;
- border-top: none;
- padding-bottom: 2px;
-}
-.nihilo .dijitTabContainerBottom-spacer,
-.nihilo .dijitTabContainerTop-spacer {
- height: 2px;
- border: 1px solid #ccc;
- background: #f8f8f8;
-}
-.nihilo .dijitTabContainerTop-spacer {
- margin-top: -1px;
-}
-.nihilo .dijitTabContainerBottom-spacer {
- margin-bottom: -1px;
-}
-.nihilo .dijitTabContainerRight-tabs {
- border-color: #ccc;
- padding-top: 3px;
-}
-.nihilo .dijitTabContainerRight .dijitTabListWrapper {
- padding-right: 3px;
-}
-.nihilo .dijitTabContainerRight-container {
- border-right: none;
-}
-.nihilo .dijitTabContainerRight-tabs .dijitTab {
- border-bottom: none;
- border-left: 1px solid #ccc;
- border-bottom: 1px solid #dedede !important;
-}
-.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabInnerDiv {
- border-bottom: solid #fff 1px;
-}
-.nihilo .dijitTabContainerRight-tabs .dijitTabChecked {
- border-left-color: #f8f8f8;
-}
-.nihilo .dijitTabContainerRight-tabs .dijitTabChecked {
- background: url(images/tabRightChecked.gif) no-repeat left top !important;
-}
-.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
- border-bottom: solid #efefef 1px;
-}
-.nihilo .dijitTabContainerRight-tabs .dijitTab {
- background: url(images/tabContainerSprite.gif) no-repeat left -350px;
-}
-.nihilo .dijitTabContainerRight-tabs .dijitTabHover .dijitTab {
- background: url(images/tabContainerSprite.gif) no-repeat left -200px;
-}
-.nihilo .dijitTabContainerRightStrip {
- padding-right: 2px;
- border: 1px solid #ccc;
- border-left: none;
- background: #f2f2f2;
-}
-.nihilo .dijitTabContainerLeft-tabs {
- border-color: #ccc;
- padding-top: 3px;
-}
-.nihilo .dijitTabContainerLeft-container {
- border-left: none;
-}
-.nihilo .dijitTabContainerLeft-tabs .dijitTab {
- border-right: 1px solid #ccc;
- border-bottom: 1px solid #dedede;
-}
-.nihilo .dijitTabContainerLeft-tabs .dijitTabChecked {
- border-right: 1px solid #f8f8f8;
-}
-.nihilo .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background: url(images/tabContainerSprite.gif) no-repeat right -350px;
-}
-.nihilo .dijitTabContainerLeft-tabs .dijitTabHover .dijitTabInnerDiv {
- background: url(images/tabContainerSprite.gif) no-repeat right -200px;
-}
-.nihilo .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.nihilo .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
- background: url(images/tabLeftChecked.gif) no-repeat right top;
-}
-.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
- border-bottom: solid #efefef 1px;
-}
-.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- border-bottom: solid #fff 1px;
-}
-.nihilo .dijitTabContainerLeftStrip {
- padding-left: 2px;
- border: 1px solid #ccc;
- border-right: none;
-}
-.nihilo .dijitTabContainerLeftStrip {
- background: #f2f2f2;
-}
-.nihilo .dijitTabContainerLeft-tabs .dijitTab,
-.nihilo .dijitTabContainerRight-tabs .dijitTab {
- margin-right:auto;
- margin-bottom:2px;
-}
-.nihilo .dijitTabContainerLeft-spacer,
-.nihilo .dijitTabContainerRight-spacer {
- width: 2px;
- border: 1px solid #ccc;
- background: #f8f8f8;
-}
-.nihilo .dijitTabContainerRight-spacer {
- border-right: none;
-}
-.nihilo .dijitTabContainerRight-tabs {
- padding-top: 3px;
- height: 100%;
-}
-.nihilo .dijitTabContainerLeft-tabs {
- height: 100%;
-}
-.nihilo .dijitTabContainerLeft-spacer {
- border-left: none;
-}
-.nihilo .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
- border-left: 0px solid #ccc;
- border-top: 0px solid #ccc;
- border-right: 0px solid #ccc;
- padding-top: 0px;
- padding-left: 0px;
-}
-.nihilo .dijitTabContainer .tabStripButton {
- margin-right: 0px;
-}
-.nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
- padding: 5px 0 6px;
-}
-.dj_ie6 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
-.dj_ie7 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
-.dj_opera .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
- padding-bottom: 7px;
-}
-.nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
- padding: 3px 0 5px;
-}
-.dj_ie6 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
-.dj_ie7 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
-.dj_opera .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
- padding-top: 4px;
-}
-.nihilo .dijitTabStripIcon {
- height: 14px;
- width: 14px;
- background: url(images/spriteRoundedIconsSmall.png) no-repeat left top;
-}
-.dj_ie6 .nihilo .dijitTabStripIcon {
- background-image: url(images/spriteRoundedIconsSmall.gif);
-}
-.nihilo .dijitTabStripSlideRightIcon {
- background-position: -30px top;
-}
-.nihilo .dijitTabStripMenuIcon {
- background-position: -15px top;
-}
-.nihilo .dijitTabContainerTopNone {
- padding-top: 0px;
-}
-.nihilo .dijitTabContainer .tabStripButton-top {
- margin-top: 1px;
-}
-.nihilo .dijitTabContainer .tabStripButton-bottom {
- background: transparent url(images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
- border-bottom: medium none;
- border-top: 1px solid #CCCCCC;
-}
-.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
- background: transparent url(images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
-}
-.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
- background: transparent;
-}
-.nihilo .dijitAccordionContainer {
- border-color: #ccc;
- background-color: #fff;
-}
-.nihilo .dijitAccordionTitle {
- background:#fafafa url(images/titleBar.png) repeat-x top left;
- border-top: 1px solid #dedede;
- padding: 5px 4px 6px 8px;
- font-size: 0.9em;
- font-weight: bold;
- color: #6d6d6d;
-}
-.nihilo .dijitAccordionTitleSelected {
- background: #f9f9f9 url(images/accordionItemActive.png) top repeat-x;
- font-weight: bold;
- border-top: 1px solid #dedede;
- border-bottom: 1px solid #dedede;
- padding: 5px 4px 5px 8px;
- color: #243C5F;
-}
-.nihilo .dijitAccordionArrow {
- background:url(images/spriteRoundedIconsSmall.gif) no-repeat -30px top;
- width:15px;
- height:15px;
- margin-top:-1px;
-}
-.nihilo .dijitAccordionTitleSelected .dijitAccordionArrow {
- background:url(images/spriteRoundedIconsSmall.gif) no-repeat -15px top;
- margin-top:-1px;
-}
-.nihilo .dijitAccordionText {
- margin-left: 4px;
- margin-right: 4px;
-}
-.nihilo .dijitSplitContainerSizerH {
- background:url(images/splitContainerSizerV.png) repeat-y #fff;
- border:0;
- border-left:0px solid #d3d3d3;
- border-right:0px solid #d3d3d3;
- width:5px;
-}
-.nihilo .dijitSplitContainerSizerH .thumb {
- background:url(images/splitContainerSizerV-thumb.png) no-repeat;
- left:1px;
- width:2px;
- height:19px;
-}
-.nihilo .dijitSplitContainerSizerV {
- background:url(images/splitContainerSizerH.png) repeat-x #fff;
- border:0;
- border-top:0px solid #d3d3d3;
- border-bottom:0px solid #d3d3d3;
- height:2px;
-}
-.nihilo .dijitSplitContainerSizerV .thumb {
- background:url(images/splitContainerSizerH-thumb.png) no-repeat;
- top:1px;
- width:19px;
- height:5px;
-}
-.nihilo .dijitBorderContainer {
- background-color: #fcfcfc;
- padding: 5px;
-}
-.nihilo .dijitSplitContainer-child,
-.nihilo .dijitBorderContainer-child {
-
- border: 1px #ccc solid;
-}
-.nihilo .dijitBorderContainer-dijitTabContainerTop,
-.nihilo .dijitBorderContainer-dijitTabContainerBottom,
-.nihilo .dijitBorderContainer-dijitTabContainerLeft,
-.nihilo .dijitBorderContainer-dijitTabContainerRight {
-
- border: none;
-}
-.nihilo .dijitBorderContainer-dijitBorderContainer {
-
- border: none;
- padding: 0px;
-}
-.nihilo .dijitSplitterH,
-.nihilo .dijitGutterH {
- background:#FCFCFC;
- border:0;
- border-left:0px solid #d3d3d3;
- border-right:0px solid #d3d3d3;
- height:5px;
-}
-.nihilo .dijitSplitterH .dijitSplitterThumb {
- background:#8BA0BD none;
- height:1px;
- top:2px;
- width:19px;
-}
-.nihilo .dijitSplitterV,
-.nihilo .dijitGutterV {
- background:#FCFCFC;
- border:0;
- border-top:0px solid #d3d3d3;
- border-bottom:0px solid #d3d3d3;
- width:5px;
-}
-.nihilo .dijitSplitterV .dijitSplitterThumb {
- background:#8BA0BD none;
- height:19px;
- left:2px;
- width:1px;
-}
-.nihilo .dijitSplitterActive {
- font-size: 1px;
- background-image: none;
- background-color: #aaa;
- -moz-opacity: 0.6;
- opacity: 0.6;
- filter: Alpha(Opacity=60);
- margin: 0;
-}
-.nihilo .dijitInputContainer INPUT,
-.nihilo .dijitTextBox {
- margin: 0em 0.1em;
-}
-.nihilo .dijitTextBox,
-.nihilo .dijitTextArea {
-
- background:#fff url(images/validationInputBg.png) repeat-x top left;
- #background:#fff url(images/validationInputBg.gif) repeat-x top left;
- border:1px solid #d3d3d3;
-}
-.nihilo .dijitComboBox .dijitButtonNode {
- padding: 0 0.2em !important;
-}
-.nihilo .dijitTextBox .dijitButtonNode {
-
- border-color: #d3d3d3;
-}
-.nihilo .dijitTextBoxFocused,
-.nihilo .dijitTextAreaFocused {
-
- border-color:#b3b3b3;
-}
-.nihilo .dijitTextBoxFocused .dijitButtonNode,
-.nihilo .dijitSpinner .dijitUpArrowButtonActive,
-.nihilo .dijitSpinner .dijitDownArrowButtonActive {
- border-left-color:#d3d3d3;
-}
-.nihilo .dijitSpinnerFocused .dijitDownArrowButton,
-.nihilo .dijitSpinner .dijitUpArrowButtonActive,
-.nihilo .dijitSpinner .dijitDownArrowButtonActive {
- border-top-color:#d3d3d3;
-}
-.nihilo .dijitError {
- border-color:#b3b3b3;
- background-color:#f9f7ba;
- background-image:none;
-}
-.nihilo .dijitErrorFocused {
- background-color:#ff6;
- background-image:none;
-}
-.nihilo .dijitValidationIcon {
-
- width: 16px;
- background: transparent url(images/warning.png) no-repeat center center;
-}
-.nihilo .dijitComboBoxHighlightMatch {
- background-color:#d3d3d3;
-}
-.nihilo .dijitButtonNode {
-
-
- border:1px solid #dedede;
- border-bottom:1px solid #dedede;
- padding: 0.1em 0.2em 0.2em 0.2em;
- background: #fff url(images/buttonEnabled.png) repeat-x top left;
-}
-.nihilo .dijitSelect .dijitButtonContents {
- border-right: none;
-}
-.nihilo .dijitButtonText {
- text-align: center;
- padding: 0 0.3em;
-}
-.nihilo .dijitComboBox .dijitButtonNode {
- border-width: 0px 0px 0px 1px;
-}
-.nihilo .dijitArrowButton {
- color: #111;
-}
-.nihilo .dijitComboButton .dijitDownArrowButton {
- padding-right:4px;
-}
-.nihilo .dijitComboBoxReadOnly,
-.nihilo .dijitSpinnerReadOnly,
-.nihilo .dijitSpinnerReadOnly .dijitButtonNode,
-.nihilo .dijitButtonDisabled .dijitButtonNode,
-.nihilo .dijitToggleButtonDisabled .dijitButtonNode,
-.nihilo .dijitDropDownButtonDisabled .dijitButtonNode,
-.nihilo .dijitComboButtonDisabled .dijitButtonNode,
-.nihilo .dijitComboBoxDisabled,
-.nihilo .dijitSpinnerDisabled,
-.nihilo .dijitSpinnerDisabled .dijitButtonNode {
-
- border-color: #dedede;
- 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 .dijitComboButtonDisabled .dijitButtonText,
-.dj_ie7 .nihilo .dijitComboButtonDisabled .dijitButtonText {
-
- color: #aaa;
-}
-.nihilo .dijitButtonHover .dijitButtonNode,
-.nihilo .dijitButtonNodeHover,
-.nihilo .dijitToggleButtonHover .dijitButtonNode,
-.nihilo .dijitDropDownButtonHover .dijitButtonNode,
-.nihilo .dijitButtonContentsHover,
-.nihilo .dijitDownArrowButtonHover,
-.nihilo .dijitUpArrowButtonHover {
-
-
- color:#243C5F;
- background:#fcfcfc url(images/buttonHover.png) repeat-x top left;
-}
-.nihilo .dijitUpArrowButtonActive,
-.nihilo .dijitDownArrowButtonActive,
-.nihilo .dijitButtonActive .dijitButtonNode,
-.nihilo .dijitToggleButtonActive .dijitButtonNode,
-.nihilo .dijitDropDownButtonActive .dijitButtonNode,
-.nihilo .dijitComboButton .dijitButtonContentsActive,
-.nihilo .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
-
- border-color:#dedede;
- background: #f5f5f5 url(images/buttonActive.png) top left repeat-x;
-}
-.nihilo .dijitArrowButtonInner {
- background-image: url(images/spriteArrows.png);
- background-repeat: no-repeat;
- background-position: 0px center;
- width: 11px;
- height: 11px;
-}
-.nihilo .dijitLeftArrowButton .dijitArrowButtonInner {
- background-position: -11px center;
-}
-.nihilo .dijitUpArrowButton .dijitArrowButtonInner {
- background-position: -22px center;
-}
-.nihilo .dijitRightArrowButton .dijitArrowButtonInner {
- background-position: -33px center;
-}
-.dj_ie6 .nihilo .dijitArrowButtonInner {
- background-image: url(images/spriteArrows.gif);
-}
-.dj_webkit .nihilo .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: -1px;
-}
-.dj_ie .nihilo .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: 1px;
-}
-.nihilo .dijitSpinnerButtonContainer {
- width: auto;
- padding: 0;
-}
-.nihilo .dijitSpinner .dijitArrowButton {
- width: 15px;
-}
-.nihilo .dijitSpinner .dijitSpinnerButtonInner {
- width: 15px;
-}
-.nihilo .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding: 0;
-}
-.nihilo .dijitToggleButton .dijitCheckBox,
-.nihilo .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url(images/spriteCheckbox.gif);
-}
-.nihilo .dijitCheckBox,
-.nihilo .dijitCheckBoxIcon {
- background-image: url(images/spriteCheckbox.gif);
- background-repeat: no-repeat;
- width: 16px;
- height: 16px;
- margin: 0;
- padding: 0;
-}
-.nihilo .dijitCheckBox,
-.nihilo .dijitToggleButton .dijitCheckBoxIcon {
-
- background-position: -16px;
-}
-.nihilo .dijitCheckBoxChecked,
-.nihilo .dijitToggleButtonChecked .dijitCheckBoxIcon {
-
- background-position: 0px;
-}
-.nihilo .dijitCheckBoxDisabled {
-
- background-position: -48px;
-}
-.nihilo .dijitCheckBoxCheckedDisabled {
-
- background-position: -32px;
-}
-.nihilo .dijitCheckBoxHover {
-
- background-position: -80px;
-}
-.nihilo .dijitCheckBoxCheckedHover {
-
- background-position: -64px;
-}
-.nihilo .dijitToggleButton .dijitRadio,
-.nihilo .dijitToggleButton .dijitRadioIcon {
- background-image: url(images/spriteRadio.gif);
-}
-.nihilo .dijitRadio,
-.nihilo .dijitRadioIcon {
- background-image: url(images/spriteRadio.gif);
- background-repeat: no-repeat;
- width: 16px;
- height: 16px;
- margin: 0;
- padding: 0;
-}
-.nihilo .dijitRadio,
-.nihilo .dijitToggleButton .dijitRadioIcon {
-
- background-position: -16px;
-}
-.nihilo .dijitRadioChecked,
-.nihilo .dijitToggleButtonChecked .dijitRadioIcon {
-
- background-position: 0px;
-}
-.nihilo .dijitRadioDisabled {
-
- background-position: -48px;
-}
-.nihilo .dijitRadioCheckedDisabled {
-
- background-position: -32px;
-}
-.nihilo .dijitRadioHover {
-
- background-position: -80px;
-}
-.nihilo .dijitRadioCheckedHover {
-
- background-position: -64px;
-}
-.nihilo .dijitSliderProgressBarH {
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFull.png) repeat-x top left;
-}
-.nihilo .dijitSliderProgressBarV {
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFullVertical.png) repeat-y bottom left;
-}
-.nihilo .dijitSliderFocused .dijitSliderProgressBarH,
-.nihilo .dijitSliderFocused .dijitSliderLeftBumper {
- background-image:url(images/sliderFullFocus.png);
-}
-.nihilo .dijitSliderFocused .dijitSliderProgressBarV,
-.nihilo .dijitSliderFocused .dijitSliderBottomBumper {
- background-image:url(images/sliderFullVerticalFocus.png);
-}
-.nihilo .dijitSliderRemainingBarV {
- border-color: #b4b4b4;
- background: #dcdcdc url(images/sliderEmptyVertical.png) repeat-y bottom left;
-}
-.nihilo .dijitSliderRemainingBarH {
- border-color: #b4b4b4;
- background: #dcdcdc url(images/sliderEmpty.png) repeat-x top left;
-}
-.nihilo .dijitSliderBar {
- border-style: solid;
- outline:1px;
-
-}
-.nihilo .dijitSliderFocused .dijitSliderBar {
- border-color:#727272;
-}
-.nihilo .dijitSliderImageHandleH {
- border:0px;
- width:15px;
- height:18px;
- background:url(images/preciseSliderThumb.png) no-repeat center top;
- #background:url(images/preciseSliderThumb.gif) no-repeat center top;
-}
-.nihilo .dijitSliderFocused .dijitSliderImageHandleH {
- background-image:url(images/preciseSliderThumbFocus.png);
- #background-image:url(images/preciseSliderThumbFocus.gif);
-}
-.nihilo .dijitSliderLeftBumper {
- border-left-width: 1px;
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFull.png) repeat-x top left;
-}
-.nihilo .dijitSliderRightBumper {
- background: #dcdcdc url(images/sliderEmpty.png) repeat-x top left;
- border-color: #b4b4b4;
- border-right-width: 1px;
-}
-.nihilo .dijitSliderImageHandleV {
- border:0px;
- width:20px;
- height:15px;
- background:url(images/sliderThumb.png) no-repeat center center;
- #background:url(images/sliderThumb.gif) no-repeat center center;
-}
-.nihilo .dijitSliderFocused .dijitSliderImageHandleV {
- background-image:url(images/sliderThumbFocus.png);
- #background-image:url(images/sliderThumbFocus.gif);
-}
-.nihilo .dijitSliderBottomBumper {
- border-bottom-width: 1px;
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFullVertical.png) repeat-y bottom left;
-}
-.nihilo .dijitSliderTopBumper {
- background: #dcdcdc url(images/sliderEmptyVertical.png) repeat-y top left;
- border-color: #b4b4b4;
- border-top-width: 1px;
-}
-.nihilo .dijitSliderIncrementIconH,
-.nihilo .dijitSliderIncrementIconV {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -45px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat -45px top;
- width:15px; height:15px;
-}
-.nihilo .dijitSliderIncrementIconH {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat -30px top;
-}
-.nihilo .dijitSliderDecrementIconH,
-.nihilo .dijitSliderDecrementIconV {
- width:15px;
- height:15px;
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -15px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat -15px top;
-}
-.nihilo .dijitSliderDecrementIconH {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat 0px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat 0px top;
-}
-.nihilo .dijitSliderButtonInner {
- visibility:hidden;
-}
-.nihilo .dijitSliderReadOnly *,
-.nihilo .dijitSliderDisabled * {
- border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
- color: #bdbdbd;
-}
-.nihilo .dijitSliderReadOnly .dijitSliderDecrementIconH,
-.nihilo .dijitSliderDisabled .dijitSliderDecrementIconH {
- background-position: 0px -15px;
-}
-.nihilo .dijitSliderReadOnly .dijitSliderIncrementIconH,
-.nihilo .dijitSliderDisabled .dijitSliderIncrementIconH {
- background-position: -30px -15px;
-}
-.nihilo .dijitSliderReadOnly .dijitSliderDecrementIconV,
-.nihilo .dijitSliderDisabled .dijitSliderDecrementIconV {
- background-position: -15px -15px;
-}
-.nihilo .dijitSliderReadOnly .dijitSliderIncrementIconV,
-.nihilo .dijitSliderDisabled .dijitSliderIncrementIconV {
- background-position: -45px -15px;
-}
-.nihilo .dijitSelect .dijitButtonNode {
- padding: 0px;
-}
-.nihilo .dijitSelect .dijitButtonContents {
- padding-top: 1px;
- background:#fff url(images/validationInputBg.png) repeat-x top left;
- #background:#fff url(images/validationInputBg.gif) repeat-x top left;
-}
-.nihilo .dijitSelectHover .dijitButtonContents,
-.nihilo .dijitSelectActive .dijitButtonContents,
-.nihilo .dijitSelectOpened .dijitButtonContents,
-.nihilo .dijitSelectDisabled .dijitButtonContents,
-.nihilo .dijitSelectReadOnly .dijitButtonContents{
- background: transparent none;
-}
-.dj_ie .nihilo .dijitSelect .dijitButtonContents {
- padding-top: 0px;
-}
-.nihilo .dijitSelect .dijitArrowButton {
- padding: 0px 2px;
-}
-.nihilo .dijitSelectDisabled .dijitButtonNode {
- border-color: #dedede;
- background:#fafafa url(images/buttonDisabled.png) top repeat-x;
-}
-.dj_ie .nihilo .dijitSelectDisabled .dijitButtonNode * {
- filter: gray() alpha(opacity=50);
-}
-.nihilo .dijitSelectHover .dijitButtonNode {
- color:#000;
- background:#fcfcfc url(images/buttonHover.png) repeat-x top left;
-}
-.nihilo .dijitSelectActive .dijitButtonNode,
-.nihilo .dijitSelectOpened .dijitButtonNode {
- border-color:#dedede;
- background: #f5f5f5 url(images/buttonActive.png) top left repeat-x;
-}
-.nihilo .dijitSelectMenu td {
- padding: 0em;
-}
-.nihilo .dijitSelectMenu .dijitMenuItemLabel,
-.nihilo .dijitSelectMenu .dijitMenuArrowCell {
- padding: 0.1em 0.2em;
-}
-.nihilo .dijitTreeNode {
- background : url(images/treeI.gif) no-repeat;
- background-position : top left;
- background-repeat : repeat-y;
- zoom: 1;
-}
-.nihilo .dijitTreeIsLast {
- background: url(images/treeI_half.gif) no-repeat;
-}
-.nihilo .dijitTreeRowHover {
-
- background-image: url(images/treeHover.png);
- background-repeat: repeat;
- background-color: transparent !important;
-}
-.nihilo .dijitTreeLabel {
- font-weight: normal;
- margin-left: 3px;
-}
-.nihilo .dijitTreeIsRoot {
- margin-left: 0;
- background-image: none;
-}
-.nihilo .dijitTreeExpando {
- width: 18px;
- height: 18px;
-}
-.nihilo .dijitTreeRow {
-
- padding-bottom: 2px;
-}
-.nihilo .dijitTreeContent {
- min-height: 18px;
- min-width: 18px;
- padding-left:1px;
-}
-.nihilo .dijitTreeExpandoOpened {
- background: url(images/spriteTree.gif) no-repeat -18px top;
-}
-.nihilo .dijitTreeExpandoClosed {
- background-image: url(images/spriteTree.gif);
-}
-.nihilo .dijitTreeExpandoLeaf {
- background: url(images/spriteTree.gif) no-repeat -36px top;
-}
-.nihilo .dijitTreeExpandoLoading {
- background-image: url(images/treeExpand_loading.gif);
-}
-.nihilo .dijitTreeIcon {
- width: 16px;
- height: 16px;
-}
-.nihilo .dijitFolderOpened {
- background: url(images/spriteDivIcons.gif) no-repeat -16px top;
-}
-.nihilo .dijitFolderClosed {
- background: url(images/spriteDivIcons.gif) no-repeat top left;
-}
-.nihilo .dijitLeaf {
- background: url(images/spriteDivIcons.gif) no-repeat -32px top;
-}
-.nihilo .dijitTreeNode .dojoDndItemBefore,
-.nihilo .dijitTreeNode .dojoDndItemAfter {
- border-bottom: none;
- border-top: none;
-}
-.nihilo .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
-
- border-top: 2px solid #369;
-}
-.nihilo .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
-
- border-bottom: 2px solid #369;
-}
-.nihilo .dijitProgressBar {
- margin:2px 0px 2px 0px;
-}
-.nihilo .dijitProgressBarEmpty{
-
- background:#fff url(images/progressBarEmpty.png) repeat-x center center;
- border-color: #f8d582 #f8d582 #f8d582 #f8d582;
-}
-.nihilo .dijitProgressBarTile{
-
- background:#f0f0f0 url(images/progressBarFull.png) repeat-x center center;
-}
-.nihilo .dijitProgressBarFull {
- border-right:1px solid #f8d582;
-}
-.nihilo .dijitProgressBarLabel {
-
- color:#293a4b;
-}
-.nihilo .dijitProgressBarIndeterminate .dijitProgressBarTile {
-
- background:#cad2de url(images/progressBarAnim.gif) repeat-x center center;
-}
-.nihilo .dijitTitlePaneTitle {
- background: #cccccc;
- background:#fff url(images/titleBar.png) repeat-x top left;
- border:1px solid #bfbfbf;
- padding:3px 4px;
- font-size: 0.9em;
- font-weight: bold;
- color: #6d6d6d;
-}
-.nihilo .dijitTitlePaneTitleHover {
- background: #f9f9f9 url(images/accordionItemActive.png) top repeat-x;
-}
-.nihilo .dijitTitlePane .dijitOpen .dijitArrowNode,
-.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
- width:15px;
- height:15px;
-}
-.nihilo .dijitTitlePaneTextNode {
- color: #243C5F;
-}
-.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
- background: url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
-}
-.dj_ie6 .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
- background:url(images/spriteRoundedIconsSmall.gif) no-repeat -30px top;
-}
-.nihilo .dijitTitlePane .dijitOpen .dijitArrowNode {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -15px top;
-}
-.dj_ie6 .nihilo .dijitTitlePane .dijitOpen .dijitArrowNode {
- background:url(images/spriteRoundedIconsSmall.gif) no-repeat -15px top;
-}
-.nihilo .dijitTitlePaneContentOuter {
- background: #ffffff;
- border:1px solid #bfbfbf;
- border-top: 0px;
-}
-.nihilo .dijitTitlePaneContentInner {
- padding:10px;
-}
-.nihilo .dijitTitlePaneTextNode {
- margin-left: 4px;
- margin-right: 4px;
-}
-.nihilo .dijitCalendarIncrementControl {
-
- width:15px;
- height:15px;
- background-image: url(images/spriteRoundedIconsSmall.png);
- background-repeat: no-repeat
-}
-.dj_ie6 .nihilo .dijitCalendarIncrementControl {
- font-size:.1em;
- background-image: url(images/spriteRoundedIconsSmall.gif);
-}
-.nihilo .dijitA11ySideArrow {
- display: none;
-}
-.nihilo .dijitCalendarDecrease {
- background-position: top left;
-}
-.nihilo .dijitCalendarIncrease {
- background-position: -30px top;
-}
-.nihilo table.dijitCalendarContainer {
- font-size: 100%;
- border-spacing: 0;
- border-collapse: separate;
- border: 1px solid #ccc;
- margin: 0;
-}
-.nihilo .dijitCalendarMonthContainer th {
-
- background:#d3d3d3 url(images/titleBar.png) repeat-x top;
- padding-top:.3em;
- padding-bottom:.2em;
- text-align:center;
-}
-.dj_ie6 .nihilo .dijitCalendarMonthContainer th {
- padding-top:.2em;
- padding-bottom:.1em;
-}
-.nihilo .dijitCalendarDayLabelTemplate {
-
- background:#fefefe;
- font-weight:normal;
- padding-top:.15em;
- padding-bottom:.2em;
- border-bottom: 1px solid #eeeeee;
- color:#293a4b;
- text-align:center;
-}
-.nihilo .dijitCalendarBodyContainer {
- border-bottom: 1px solid #eeeeee;
-}
-.nihilo .dijitCalendarMonthLabel {
- color:#293a4b;
- font-weight: bold;
-}
-.nihilo .dijitCalendarDateTemplate {
-
- font-size: 0.9em;
- font-weight: bold;
- text-align: center;
- padding: 0.3em 0.3em 0.05em 0.3em;
- letter-spacing: 1px;
- background-color: #fdfdfd;
- border:#fdfdfd solid 1px !important;
-}
-.dj_ie .nihilo .dijitCalendarDateTemplate {
- padding: 0.1em .33em 0.02em .33em;
-}
-.nihilo .dijitCalendarPreviousMonth,
-.nihilo .dijitCalendarNextMonth {
-
- color:#999999;
- background-color:#f5f5f5 !important;
- border:#f5f5f5 solid 1px !important;
-}
-.nihilo .dijitCalendarCurrentMonth {
-
-}
-.nihilo .dijitCalendarDisabledDate {
- text-decoration:line-through !important;
-}
-.nihilo .dijitCalendarCurrentDate {
-
- text-decoration:underline;
- font-weight:bold;
-}
-.nihilo .dijitCalendarSelectedDate {
-
- background-color:#ffe284 !important;
- color:black !important;
- border:#f7c95c solid 1px !important;
-}
-.nihilo .dijitCalendarYearContainer {
-
- background:white url(images/titleBar.png) repeat-x top;
-}
-.nihilo .dijitCalendarYearLabel {
-
- margin:0;
- padding:0.4em 0 0.25em 0;
- text-align:center;
-}
-.nihilo .dijitCalendarSelectedYear {
-
- color:black;
- padding:0.2em;
- padding-bottom:0.1em;
- background-color:#ffe284 !important;
- border:#f7c95c solid 1px !important;
-}
-.nihilo .dijitCalendarNextYear,
-.nihilo .dijitCalendarPreviousYear {
-
- color:black !important;
- font-weight:normal;
-}
-.nihilo .dijitTimePickerTick,
-.nihilo .dijitTimePickerMarker {
- border-color: #eeeeee;
-}
-.nihilo .dijitTimePickerTick {
- color:white;
-}
-.nihilo .dijitTimePickerMarker {
- background:#d3d3d3 url(images/titleBar.png) repeat-x top;
- color:#293a4b;
- font-weight: bold;
-}
-.nihilo .dijitTimePickerItemSelected {
- color: black;
- background: #ffe284 none;
-}
-.nihilo .dijitTimePickerItemHover {
- background: #d6d6dd none;
- color:black;
-}
-.nihilo .dijitTimePickerItemHover,
-.nihilo .dijitTimePickerItemSelected {
- position: relative;
- z-index: 10;
-}
-.nihilo .dijitTimePickerTick .dijitTimePickerItemInner {
- font-size:0.4em;
-}
-.nihilo .dijitTimePickerItemHover .dijitTimePickerItemInner,
-.nihilo .dijitTimePickerItemSelected .dijitTimePickerItemInner {
- font-size:1em;
-}
-.nihilo .dijitTimePickerMarkerHover {
- border-top: 1px solid #eeeeee;
-}
-.nihilo .dijitTimePickerTickHover,
-.nihilo .dijitTimePickerTickSelected {
- margin-top:-0.3em;
- margin-bottom:-0.3em;
- border-bottom: none;
-}
-.nihilo .dijitToolbar {
- border-bottom: 1px solid #ccc;
- background:#eaeaea url(images/titleBar.png) repeat-x top left;
-}
-.dj_ie6 .nihilo .dijitToolbar {
- height: 10px;
-}
-.nihilo .dijitToolbar .dijitButtonNode,
-.nihilo .dijitToolbar .dijitComboButton .dijitButtonContents,
-.nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButton {
- background: none;
- margin: 0px;
- padding: 0px;
- border: none;
- font-size: 12px;
-}
-.nihilo .dijitToolbar .dijitButton,
-.nihilo .dijitToolbar .dijitToggleButton,
-.nihilo .dijitToolbar .dijitDropDownButton,
-.nihilo .dijitToolbar .dijitComboButton .dijitButtonContents,
-.nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButton {
- background: none;
- padding: 1px;
-}
-.nihilo .dijitToolbar .dijitButtonChecked,
-.nihilo .dijitToolbar .dijitToggleButtonChecked {
- background-color:#ffeeb9;
- border:1px solid #f7c95c;
- padding: 0;
-}
-.nihilo .dijitToolbar .dijitButtonCheckedHover,
-.nihilo .dijitToolbar .dijitToggleButtonCheckedHover
- {
- background-color:#ffe284;
- border:1px solid #f7c95c;
- padding: 0;
-}
-.nihilo .dijitToolbar .dijitButtonHover,
-.nihilo .dijitToolbar .dijitToggleButtonHover,
-.nihilo .dijitToolbar .dijitDropDownButtonHover,
-.nihilo .dijitToolbar .dijitComboButton .dijitButtonContentsHover,
-.nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover {
-
- border: 1px solid #f7c95c;
- padding: 0;
- background-color:#ffe284;
-}
-.nihilo .dijitToolbar label {
- padding: 3px 3px 0 6px;
-}
-.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
-.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
-
- border: 1px #555 dotted !important;
- padding: 0px;
-}
-.nihilo .dijitDialog {
- background: #eee;
- border: 1px solid #d3d3d3;
- -webkit-box-shadow: 0px 5px 10px #adadad;
- padding: 0px;
-}
-.nihilo .dijitDialog .dijitDialogTitle {
-
- font-size: 0.9em;
- color: #3243C5F;
- font-weight: bold;
- padding: 0px 4px;
-}
-.nihilo .dijitDialog .dijitDialogPaneContent {
- background: #ffffff;
- border-top: 1px solid #d3d3d3;
- padding:10px;
-}
-.nihilo .dijitDialogTitleBar {
-
- background: #fafafa url(images/titleBar.png) repeat-x top left;
- padding: 5px 6px 3px 6px;
- outline:0;
-}
-.nihilo .dijitDialogCloseIcon {
-
- background-image: url(images/spriteRoundedIconsSmall.png);
- background-repeat: no-repeat;
- background-position: -60px 0px;
- position: absolute;
- vertical-align: middle;
- right: 6px;
- top: 4px;
- height: 15px;
- width: 15px;
-}
-.dj_ie6 .nihilo .dijitDialogCloseIcon {
- background-image: url(images/spriteRoundedIconsSmall.gif);
-}
-.nihilo .dijitDialogCloseIconHover {
- background-position: -60px -15px;
-}
-.nihilo .dijitTooltip,
-.nihilo .dijitTooltipDialog {
-
- background: transparent;
-}
-.dijitTooltipBelow {
-
- padding-top: 10px;
-}
-.dijitTooltipAbove {
-
- padding-bottom: 10px;
-}
-.nihilo .dijitTooltipContainer {
-
- background-color: #fff;
- border:1px solid #d3d3d3;
- padding:0.45em;
-}
-.nihilo .dijitTooltipConnector {
-
- border:0px;
- z-index: 2;
-}
-.nihilo .dijitTooltipABRight .dijitTooltipConnector {
-
- left: auto !important;
- right: 6px;
-}
-.nihilo .dijitTooltipBelow .dijitTooltipConnector {
-
- top: 0px;
- left: 6px;
- background:url(images/tooltipConnectorUp.png) no-repeat top left;
- width:17px;
- height:11px;
-}
-.dj_ie .nihilo .dijitTooltipBelow .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorUp.gif);
-}
-.nihilo .dijitTooltipAbove .dijitTooltipConnector {
-
- bottom: 0px;
- left: 6px;
- background:url(images/tooltipConnectorDown.png) no-repeat top left;
- width:17px;
- height:11px;
-}
-.dj_ie .nihilo .dijitTooltipAbove .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorDown.gif);
-}
-.dj_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
- bottom: -5px;
-}
-.nihilo .dijitTooltipLeft {
- padding-right: 10px;
-}
-.dj_ie6 .nihilo .dijitTooltipLeft {
- padding-left: 11px;
-}
-.nihilo .dijitTooltipLeft .dijitTooltipConnector {
-
- right: 0px;
- bottom: 3px;
- background:url(images/tooltipConnectorRight.png) no-repeat top left;
- width:11px;
- height:17px;
-}
-.dj_ie .nihilo .dijitTooltipLeft .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorRight.gif);
-}
-.nihilo .dijitTooltipRight {
- padding-left: 10px;
-}
-.nihilo .dijitTooltipRight .dijitTooltipConnector {
-
- left: 0px;
- bottom: 3px;
- background:url(images/tooltipConnectorLeft.png) no-repeat top left;
- width:11px;
- height:17px;
-}
-.dj_ie .nihilo .dijitTooltipRight .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorLeft.gif);
-}
-.nihilo .dijitMenu,
-.nihilo .dijitMenuBar {
- border: 1px solid #d3d3d3;
- margin: 0px;
- padding: 0px;
- background-color: #fff;
-}
-.nihilo .dijitBorderContainer .dijitMenuBar {
- border: 1px #ccc solid;
-}
-.nihilo .dijitMenuItem {
- font-family: sans-serif;
- margin: 0px;
- color: #243C5F;
-}
-.nihilo .dijitMenuBar .dijitMenuItem {
- padding: 4px 5px;
-}
-.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
- font-style: italic;
-}
-.nihilo .dijitMenuItem TD {
- padding:1px;
-}
-.nihilo .dijitMenuPassive .dijitMenuItemHover,
-.nihilo .dijitMenuItemSelected {
- background-color: #ffe284;
- color: #243C5F;
-}
-.nihilo .dijitMenuItemIcon {
- width: 15px;
- height: 15px;
-}
-.nihilo .dijitMenuExpand {
- width:15px;
- height:15px;
- background-image: url(images/spriteRoundedIconsSmall.png);
- background-position: -30px top;
-}
-.dj_ie6 .nihilo .dijitMenuExpand {
- background-image:url(images/spriteRoundedIconsSmall.gif);
-}
-.nihilo .dijitMenuSeparator {
- height: 1px;
-}
-.nihilo .dijitMenuSeparatorTop {
- border-bottom: 1px solid #fff;
-}
-.nihilo .dijitMenuSeparatorBottom {
- border-top: 1px solid #d3d3d3;
-}
-.nihilo .dijitCheckedMenuItemIconChar {
- display: none;
-}
-.nihilo .dijitCheckedMenuItemIcon {
- background-image: url(images/spriteCheckbox.gif);
- background-position: -80px;
-}
-.nihilo .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
- background-position: -64px;
-}
-.nihilo .dijitToolbar .dijitToolbarSeparator {
- background: url(../../icons/images/editorIconsEnabled.png);
-}
-.nihilo .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled.png);
- background-repeat: no-repeat;
- width: 18px;
- height: 18px;
- text-align: center;
-}
-.nihilo .dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled.png);
-}
-.dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled.png);
- background-repeat: no-repeat;
- width: 18px;
- height: 18px;
- text-align: center;
-}
-.dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled.png);
-}
-.dijitEditorIconSep { background-position: 0px; }
-.dijitEditorIconSave { background-position: -18px; }
-.dijitEditorIconPrint { background-position: -36px; }
-.dijitEditorIconCut { background-position: -54px; }
-.dijitEditorIconCopy { background-position: -72px; }
-.dijitEditorIconPaste { background-position: -90px; }
-.dijitEditorIconDelete { background-position: -108px; }
-.dijitEditorIconCancel { background-position: -126px; }
-.dijitEditorIconUndo { background-position: -144px; }
-.dijitEditorIconRedo { background-position: -162px; }
-.dijitEditorIconSelectAll { background-position: -180px; }
-.dijitEditorIconBold { background-position: -198px; }
-.dijitEditorIconItalic { background-position: -216px; }
-.dijitEditorIconUnderline { background-position: -234px; }
-.dijitEditorIconStrikethrough { background-position: -252px; }
-.dijitEditorIconSuperscript { background-position: -270px; }
-.dijitEditorIconSubscript { background-position: -288px; }
-.dijitEditorIconJustifyCenter { background-position: -306px; }
-.dijitEditorIconJustifyFull { background-position: -324px; }
-.dijitEditorIconJustifyLeft { background-position: -342px; }
-.dijitEditorIconJustifyRight { background-position: -360px; }
-.dijitEditorIconIndent { background-position: -378px; }
-.dijitEditorIconOutdent { background-position: -396px; }
-.dijitEditorIconListBulletIndent { background-position: -414px; }
-.dijitEditorIconListBulletOutdent { background-position: -432px; }
-.dijitEditorIconListNumIndent { background-position: -450px; }
-.dijitEditorIconListNumOutdent { background-position: -468px; }
-.dijitEditorIconTabIndent { background-position: -486px; }
-.dijitEditorIconLeftToRight { background-position: -504px; }
-.dijitEditorIconRightToLeft, .dijitEditorIconToggleDir { background-position: -522px; }
-.dijitEditorIconBackColor { background-position: -540px; }
-.dijitEditorIconForeColor { background-position: -558px; }
-.dijitEditorIconHiliteColor { background-position: -576px; }
-.dijitEditorIconNewPage { background-position: -594px; }
-.dijitEditorIconInsertImage { background-position: -612px; }
-.dijitEditorIconInsertTable { background-position: -630px; }
-.dijitEditorIconSpace { background-position: -648px; }
-.dijitEditorIconInsertHorizontalRule { background-position: -666px; }
-.dijitEditorIconInsertOrderedList { background-position: -684px; }
-.dijitEditorIconInsertUnorderedList { background-position: -702px; }
-.dijitEditorIconCreateLink { background-position: -720px; }
-.dijitEditorIconUnlink { background-position: -738px; }
-.dijitEditorIconViewSource { background-position: -756px; }
-.dijitEditorIconRemoveFormat { background-position: -774px; }
-.dijitEditorIconFullScreen { background-position: -792px; }
-.dijitEditorIconWikiword { background-position: -810px; }
-
-.dijitColorPalette {
- border:1px solid #d3d3d3;
- background:#fff;
- -moz-border-radius: 0px !important;
-}
+ NOTES:
+ ---
+ Dialog.css contains css classes for both Dialog and Tooltip!
+ This because currently a dijit.TooltipDialog exist. Until this is resolved
+ you need to include Dialog.css for both dijits
+ ---
+ Toolbar.css contains classes also used in Editor. Until this is resolved
+ you need to include Toolbar.css for both Toolbar and Editor
+ ---
+ Button.css contains classes for combobox,
+
+*/
+
+@import url("../dijit.css");
+@import url("../../icons/commonIcons.css");/*sprite containing common icons to be used by all themes*/
+@import url("Common.css");
+
+@import url("layout/ContentPane.css");
+@import url("layout/TabContainer.css");
+@import url("layout/AccordionContainer.css");
+@import url("layout/SplitContainer.css");
+@import url("layout/BorderContainer.css");
+@import url("form/Common.css");
+@import url("form/Button.css");
+@import url("form/Checkbox.css");
+@import url("form/RadioButton.css");
+@import url("form/Slider.css");
+@import url("form/Select.css");
+@import url("Tree.css");
+@import url("ProgressBar.css");
+@import url("TitlePane.css");
+@import url("Calendar.css");
+@import url("TimePicker.css");
+@import url("Toolbar.css");
+@import url("Dialog.css");
+@import url("Menu.css");
+@import url("Editor.css");
+@import url("../../icons/editorIcons.css"); /* sprite for editor icons to be used by all themes */
+@import url("ColorPalette.css"); \ No newline at end of file
diff --git a/lib/dijit/themes/nihilo/nihilo_rtl.css b/lib/dijit/themes/nihilo/nihilo_rtl.css
index b47f8431b..1e9a6af85 100644
--- a/lib/dijit/themes/nihilo/nihilo_rtl.css
+++ b/lib/dijit/themes/nihilo/nihilo_rtl.css
@@ -1,224 +1,29 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
-.dijitRtl .dijitPlaceHolder {
- left: auto;
- right: 0;
-}
-.dijitMenuItemRtl {
- text-align: right;
-}
-.dj_iequirks .dijitComboButtonRtl BUTTON {
-
- float:left;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitComboBoxRtl .dijitArrowButtonContainer {
-
- border-right-width: 1px !important;
- border-right-style: solid !important;
- border-left-width: 0px !important;
- border-left-style: none !important;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijit_a11y .dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBoxRtl .dijitArrowButtonContainer {
- border-right: 1px solid black !important;
- border-left: 0px none black !important;
-}
-.dijitSpinnerRtl .dijitSpinnerButtonContainer .dijitArrowButton {
- right: 0;
- left: auto;
-}
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitArrowButtonContainer {
- float: left;
-}
-.dijitCalendarRtl .dijitCalendarNextYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarRtl .dijitCalendarPreviousYear {
- margin:0 0 0 0.55em;
-}
-.dijitSliderRtl .dijitSliderImageHandleV {
- left:auto;
-}
-.dijitSliderRtl .dijitSliderImageHandleH {
- left:-50%;
-}
-.dijitSliderRtl .dijitSliderMoveableH {
- right:auto;
- left:0;
-}
-.dijitSliderRtl .dijitRuleContainerV {
- float:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleContainerV {
- text-align:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelV {
- text-align:left;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelH {
- zoom:1;
-}
-.dijitSliderRtl .dijitSliderProgressBarH {
-
- float:right;
- right:0;
- left:auto;
-}
-.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
- background-position:right;
- padding-right:25px;
-}
-.dijitTabRtl .dijitTabCloseButton {
- margin-left: 0px;
- margin-right: 1em;
-}
-.dj_ie .dijitTimePickerRtl .dijitTimePickerItem {
- width:100%;
-}
-.dijitColorPaletteRtl .dijitColorPaletteUnder {
-
- left: auto;
- right: 0;
-}
-.dijitSelectRtl .dijitButtonContents {
- text-align: right;
-}
-.dijitRtl .nihilo .dijitTab {
- margin-right:0;
- margin-left:2px;
-}
-.dijitRtl .nihilo .dijitTabContainer .tabStripButton {
- margin-left: 0;
-}
-.dijitRtl .nihilo .dijitTabContainerTopStrip,
-.dijitRtl .nihilo .dijitTabContainerBottomStrip,
-.dijitRtl .nihilo .dijitTabContainerTop-tabs,
-.dijitRtl .nihilo .dijitTabContainerBottom-tabs {
- padding-left: 0;
- padding-right: 3px;
-}
-.dijitRtl .nihilo .dijitTabInnerDiv {
- padding-left: 3px;
- padding-right: 4px;
-}
-.dijitRtl .nihilo .dijitTabPaneWrapper {
- #zoom: 1;
-}
-.dj_ie-rtl .nihilo .dijitTabContainerLeft-tabs {
- margin-left: 0px !important;
-}
-.dj_ie-rtl .nihilo .dijitTabContainerRight-tabs {
- margin-right: 0px !important;
-}
-.dijitRtl .nihilo .dijitTabContainerLeft-tabs .dijitTab,
-.dijitRtl .nihilo .dijitTabContainerRight-tabs .dijitTab {
- margin-left:0px;
-}
-.dj_ie-rtl .nihilo .dijitTab .dijitTabInnerDiv{
- width : 1%;
-}
-.dijitRtl .nihilo .dijitAccordionArrow {
- background-position: 0px top;
-}
-.dijitRtl .nihilo .dijitAccordionTitleSelected .dijitAccordionArrow {
-
- background-position: -15px top;
-}
-.dijitRtl .nihilo .dijitSliderProgressBarH,
-.dijitRtl .nihilo .dijitSliderRemainingBarH,
-.dijitRtl .nihilo .dijitSliderLeftBumper,
-.dijitRtl .nihilo .dijitSliderRightBumper,
-.dijitRtl .nihilo .dijitSliderTopBumper {
- background-position: top right;
-}
-.dijitRtl .nihilo .dijitSliderProgressBarV,
-.dijitRtl .nihilo .dijitSliderRemainingBarV,
-.dijitRtl .nihilo .dijitSliderBottomBumper {
- background-position: bottom right;
-}
-.dijitRtl .nihilo .dijitSliderLeftBumper {
- border-left-width: 0px;
- border-right-width: 1px;
-}
-.dijitRtl .nihilo .dijitSliderRightBumper {
- border-left-width: 1px;
- border-right-width: 0px;
-}
-.dijitRtl .nihilo .dijitSliderIncrementIconH {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat left top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat left top;
-}
-.dijitRtl .nihilo .dijitSliderDecrementIconH {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat -30px top;
-}
-.dijitRtl .nihilo .dijitComboBox .dijitButtonNode {
- border-width: 0px 0px 0px 1px;
-}
-.dijitRtl .nihilo .dijitSelect .dijitButtonContents {
- border-left: none;
- border-right-width: 1px;
-}
-.dijitRtl .nihilo .dijitTreeNode,
-.dijitRtl .nihilo .dijitTreeExpandoLeaf {
-
- background-image: none;
-}
-.dijitRtl .nihilo .dijitTreeContent {
- padding-left: 0px;
- padding-right: 1px;
-}
-.dijitRtl .nihilo .dijitTreeExpandoOpened {
-
- background: url(images/spriteTree_rtl.gif) no-repeat -18px top;
-}
-.dijitRtl .nihilo .dijitTreeExpandoClosed {
-
- background-image: url(images/spriteTree_rtl.gif);
-}
-.dijitRtl .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: 0px top;
-}
-.dj_ie6-rtl .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: 0px top;
-}
-.dijitRtl .nihilo .dijitCalendarDecrease {
- background-position: -30px top;
-}
-.dijitRtl .nihilo .dijitCalendarIncrease {
- background-position: 0px top;
-}
-.dj_ie6-rtl .nihilo .dijitTimePickerMarkerHover,
-.dj_ie7-rtl .nihilo .dijitTimePickerMarkerHover {
- border-top: 0px;
-}
-.dijitRtl .nihilo .dijitDialogTitleBar .dijitDialogCloseIcon {
- right: auto;
- left: 5px;
-}
-.dijitRtl .nihilo .dijitMenuItem .dijitMenuItemIcon {
- padding-left: 3px;
- padding-right: 0px;
-}
-.dijitRtl .nihilo .dijitMenuItem .dijitMenuExpand {
- background-position: 0px top;
-}
-.dijitRtl .nihilo .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitRtl .nihilo .dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitEditorRtl .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitToolbarRtl .dijitToolbarSeparator {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
+ NOTES:
+ ---
+ Dialog.css contains css classes for both Dialog and Tooltip!
+ This because currently a dijit.TooltipDialog exist. Until this is resolved
+ you need to include Dialog.css for both dijits
+ ---
+ Toolbar.css contains classes also used in Editor. Until this is resolved
+ you need to include Toolbar.css for both Toolbar and Editor
+ ---
+ Button.css contains classes for combobox,
+
+*/
+
+@import url("../dijit_rtl.css");
+@import url("layout/TabContainer_rtl.css");
+@import url("layout/AccordionContainer_rtl.css");
+@import url("form/Slider_rtl.css");
+@import url("form/Button_rtl.css");
+@import url("Tree_rtl.css");
+@import url("TitlePane_rtl.css");
+@import url("Calendar_rtl.css");
+@import url("TimePicker_rtl.css");
+@import url("Dialog_rtl.css");
+@import url("Menu_rtl.css");
+@import url("Editor_rtl.css");
+@import url("../../icons/editorIcons_rtl.css");/* RTL sprite for editor icons to be used by all themes*/ \ No newline at end of file
diff --git a/lib/dijit/themes/soria/Calendar.css b/lib/dijit/themes/soria/Calendar.css
index b2576c0e0..78572dab0 100644
--- a/lib/dijit/themes/soria/Calendar.css
+++ b/lib/dijit/themes/soria/Calendar.css
@@ -1,6 +1,7 @@
+/* Calendar*/
.soria .dijitCalendarIncrementControl {
-
+ /* next/prev month buttons */
width:15px;
height:15px;
background-image: url("images/spriteRoundedIconsSmall.png");
@@ -10,15 +11,18 @@
font-size:.1em;
background-image: url("images/spriteRoundedIconsSmall.gif");
}
+
.soria .dijitA11ySideArrow {
display: none;
}
+
.soria .dijitCalendarDecrease {
background-position: top left;
}
.soria .dijitCalendarIncrease {
background-position: -30px top;
}
+
.soria table.dijitCalendarContainer {
font-size: 100%;
border-spacing: 0;
@@ -26,8 +30,9 @@
border: 1px solid #b1badf;
margin: 0;
}
+
.soria .dijitCalendarMonthContainer th {
-
+ /* month header cell */
background:#bed7f0 url("images/titleBar.png") repeat-x top;
padding-top:.3em;
padding-bottom:.2em;
@@ -37,8 +42,9 @@
padding-top:.2em;
padding-bottom:.1em;
}
+
.soria .dijitCalendarDayLabelTemplate {
-
+ /* day of week labels */
background:#bed7f0;
font-weight:normal;
padding-top:.15em;
@@ -47,15 +53,19 @@
color:#293a4b;
text-align:center;
}
+
.soria .dijitCalendarBodyContainer {
border-bottom: 1px solid #eeeeee;
}
+
.soria .dijitCalendarMonthLabel {
color:#293a4b;
font-weight: bold;
+ padding: 0 4px;
}
+
.soria .dijitCalendarDateTemplate {
-
+ /* style for each day cell */
font-size: 0.9em;
font-weight: bold;
text-align: center;
@@ -64,54 +74,86 @@
background-color: #fff;
border:#fff solid 1px !important;
}
+
.dj_ie .soria .dijitCalendarDateTemplate {
padding: 0.1em .33em 0.02em .33em;
}
+
.soria .dijitCalendarPreviousMonth,
.soria .dijitCalendarNextMonth {
-
+ /* days that are part of the previous or next month */
color:#999999;
background-color:#fdfdfd !important;
border:#fdfdfd solid 1px !important;
}
+
.soria .dijitCalendarCurrentMonth {
-
+ /* days that are part of this month */
}
+
.soria .dijitCalendarDisabledDate {
text-decoration:line-through !important;
}
+
.soria .dijitCalendarCurrentDate {
-
+ /* cell for today's date */
text-decoration:underline;
font-weight:bold;
}
+
.soria .dijitCalendarSelectedDate {
-
+ /* cell for the selected date */
background-color:#b9cbf1 !important;
color:black !important;
border:#4b5aaa solid 1px !important;
}
+
+
.soria .dijitCalendarYearContainer {
-
+ /* footer of the table that contains the year display/selector */
background:white url("images/titleBar.png") repeat-x top;
}
+
.soria .dijitCalendarYearLabel {
-
+ /* container for all of 3 year labels */
margin:0;
padding:0.4em 0 0.25em 0;
text-align:center;
}
+
.soria .dijitCalendarSelectedYear {
-
+ /* label for selected year */
color:black;
padding:0.2em;
padding-bottom:0.1em;
background-color:#b9cbf1 !important;
border:#4b5aaa solid 1px !important;
}
+
.soria .dijitCalendarNextYear,
.soria .dijitCalendarPreviousYear {
-
+ /* label for next/prev years */
color:black !important;
font-weight:normal;
}
+
+/* Styling for month DropDownButton */
+
+.soria .dijitCalendar .dijitDropDownButton {
+ margin: 0;
+}
+.soria .dijitCalendar .dijitButtonText {
+ padding: 0;
+}
+.soria .dijitCalendar .dijitDropDownButton .dijitButtonNode {
+ background-color: transparent;
+ background-image: none;
+ padding: 0;
+}
+
+/* Styling for month drop down list */
+
+.soria .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
+ background-color: #d9e6f9;
+ color: #243C5F;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/Calendar_rtl.css b/lib/dijit/themes/soria/Calendar_rtl.css
index bcfa495d8..c2350b4ed 100644
--- a/lib/dijit/themes/soria/Calendar_rtl.css
+++ b/lib/dijit/themes/soria/Calendar_rtl.css
@@ -1,7 +1,9 @@
+/* Calendar */
.dijitRtl .soria .dijitCalendarDecrease {
background-position: -30px top;
}
+
.dijitRtl .soria .dijitCalendarIncrease {
- background-position: 0px top;
+ background-position: 0 top;
}
diff --git a/lib/dijit/themes/soria/ColorPalette.css b/lib/dijit/themes/soria/ColorPalette.css
index 5a51275d9..85d6dd819 100644
--- a/lib/dijit/themes/soria/ColorPalette.css
+++ b/lib/dijit/themes/soria/ColorPalette.css
@@ -1,5 +1,5 @@
.dijitColorPalette {
border:1px solid #cbcbcb;
background:#fff;
- -moz-border-radius: 0px !important;
-}
+ -moz-border-radius: 0 !important;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/Common.css b/lib/dijit/themes/soria/Common.css
index 362a867f1..d5a7c9df6 100644
--- a/lib/dijit/themes/soria/Common.css
+++ b/lib/dijit/themes/soria/Common.css
@@ -1,13 +1,17 @@
-
+/* DnD avatar-specific settings */
+/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
.soria .dojoDndItemBefore {
border-top: 2px solid #369;
}
+
.soria .dojoDndItemAfter {
border-bottom: 2px solid #369;
}
+
.soria .dojoDndItemOver {
cursor:pointer;
}
+
.soria table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
.soria .dojoDndAvatar td { border: none; }
.soria .dojoDndAvatar tr { border: none; }
diff --git a/lib/dijit/themes/soria/Dialog.css b/lib/dijit/themes/soria/Dialog.css
index b4a185115..1e0503a0b 100644
--- a/lib/dijit/themes/soria/Dialog.css
+++ b/lib/dijit/themes/soria/Dialog.css
@@ -1,33 +1,39 @@
+/* Dialog */
.soria .dijitDialog {
background: #eee;
border: 1px solid #cbcbcb;
- -webkit-box-shadow: 0px 5px 10px #adadad;
- padding: 0px;
+ -webkit-box-shadow: 0 5px 10px #adadad;
+ padding: 0;
}
+
.soria .dijitDialog .dijitDialogTitle {
-
+ /* typography and styling of the dialog title */
font-weight: bold;
- padding: 0px 4px;
+ padding: 0 4px;
font-size: 0.9em;
- color: #3243C5F;
+ color: #243C5F;
}
+
.soria .dijitDialog .dijitDialogPaneContent {
background: #ffffff;
border-top: 1px solid #b1badf;
padding:10px;
+
}
+
.soria .dijitDialogTitleBar {
-
+ /* outer container for the titlebar of the dialog */
background: #fafafa url("images/titleBar.png") repeat-x top left;
padding: 5px 6px 3px 6px;
- outline:0;
+ outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
}
+
.soria .dijitDialogCloseIcon {
-
+ /* the default close icon for the dialog */
background-image: url("images/spriteRoundedIconsSmallBl.png");
background-repeat: no-repeat;
- background-position: -60px 0px;
+ background-position: -60px 0;
position: absolute;
vertical-align: middle;
right: 6px;
@@ -41,49 +47,69 @@
.soria .dijitDialogCloseIconHover {
background-position: -60px -15px;
}
+
+/* Tooltip and TooltipDialog */
+
.soria .dijitTooltip,
.soria .dijitTooltipDialog {
-
- background: transparent;
+ /* the outermost dom node, holding the connector and container */
+ background: transparent; /* make the area on the sides of the arrow transparent */
}
+
.dijitTooltipBelow {
-
+ /* leave room for arrow above content */
padding-top: 10px;
}
+
.dijitTooltipAbove {
-
+ /* leave room for arrow below content */
padding-bottom: 10px;
}
+
.soria .dijitTooltipContainer {
-
+ /*
+ The part with the text.
+
+ NOTE:
+ FF doesn't clip images used as CSS bgs if you specify a border
+ radius. If you use a solid color, it does. Webkit gets it right.
+ Sigh.
+ background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
+ */
background-color: #fff;
border:1px solid #cbcbcb;
padding:0.45em;
}
+
.soria .dijitTooltipConnector {
-
- border:0px;
+ /* the arrow piece */
+ border:0;
z-index: 2;
}
+
.soria .dijitTooltipABRight .dijitTooltipConnector {
-
+ /* above or below tooltip, but the arrow appears on the right,
+ and the right edges of target and tooltip are aligned rather than the left */
left: auto !important;
right: 6px;
}
+
.soria .dijitTooltipBelow .dijitTooltipConnector {
-
- top: 0px;
+ /* the arrow piece for tooltips below an element */
+ top: 0;
left: 6px;
background:url("images/tooltipConnectorUp.png") no-repeat top left;
width:17px;
height:11px;
}
+
.dj_ie .soria .dijitTooltipBelow .dijitTooltipConnector {
background-image: url("images/tooltipConnectorUp.gif");
}
+
.soria .dijitTooltipAbove .dijitTooltipConnector {
-
- bottom: 0px;
+ /* the arrow piece for tooltips above an element */
+ bottom: 0;
left: 6px;
background:url("images/tooltipConnectorDown.png") no-repeat top left;
width:17px;
@@ -98,16 +124,13 @@
.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
bottom: -5px;
}
+
.soria .dijitTooltipLeft {
padding-right: 10px;
}
-.dj_ie6 .soria .dijitTooltipLeft {
- padding-left: 11px;
-}
.soria .dijitTooltipLeft .dijitTooltipConnector {
-
- right: 0px;
- bottom: 3px;
+ /* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+ right: 0;
background:url("images/tooltipConnectorRight.png") no-repeat top left;
width:11px;
height:17px;
@@ -115,13 +138,13 @@
.dj_ie .soria .dijitTooltipLeft .dijitTooltipConnector {
background-image: url("images/tooltipConnectorRight.gif");
}
+
.soria .dijitTooltipRight {
padding-left: 10px;
}
.soria .dijitTooltipRight .dijitTooltipConnector {
-
- left: 0px;
- bottom: 3px;
+ /* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+ left: 0;
background:url("images/tooltipConnectorLeft.png") no-repeat top left;
width:11px;
height:17px;
@@ -129,3 +152,4 @@
.dj_ie .soria .dijitTooltipRight .dijitTooltipConnector {
background-image: url("images/tooltipConnectorLeft.gif");
}
+
diff --git a/lib/dijit/themes/soria/Dialog_rtl.css b/lib/dijit/themes/soria/Dialog_rtl.css
index 41db9ce02..838700af5 100644
--- a/lib/dijit/themes/soria/Dialog_rtl.css
+++ b/lib/dijit/themes/soria/Dialog_rtl.css
@@ -1,4 +1,4 @@
-
+/* Dialog */
.dijitRtl .soria .dijitDialogTitleBar .dijitDialogCloseIcon {
right: auto;
left: 5px;
diff --git a/lib/dijit/themes/soria/Editor.css b/lib/dijit/themes/soria/Editor.css
index c30665986..d2dd29303 100644
--- a/lib/dijit/themes/soria/Editor.css
+++ b/lib/dijit/themes/soria/Editor.css
@@ -1,13 +1,17 @@
.soria .dijitToolbar .dijitToolbarSeparator {
- background: url('../../icons/images/editorIconsEnabled.png');
+ background: url('../../icons/images/editorIconsEnabled.png'); /* separator in editor icons sprite image - enabled state */
}
+
+/**** ICONS *****/
+
.soria .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsEnabled.png');
+ background-image: url('../../icons/images/editorIconsEnabled.png'); /* editor icons sprite image - enabled state */
background-repeat: no-repeat;
width: 18px;
height: 18px;
text-align: center;
}
.soria .dijitDisabled .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsDisabled.png');
+ background-image: url('../../icons/images/editorIconsDisabled.png'); /* editor icons sprite image - disabled state */
}
+
diff --git a/lib/dijit/themes/soria/Editor_rtl.css b/lib/dijit/themes/soria/Editor_rtl.css
index 4499e5232..a1f76e8c4 100644
--- a/lib/dijit/themes/soria/Editor_rtl.css
+++ b/lib/dijit/themes/soria/Editor_rtl.css
@@ -1,7 +1,7 @@
-
+/* Editor */
.dijitRtl .soria .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsEnabled_rtl.png');
+ background-image: url('../../icons/images/editorIconsEnabled_rtl.png'); /* editor icons sprite image - enabled state */
}
.dijitRtl .soria .dijitDisabled .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsDisabled_rtl.png');
+ background-image: url('../../icons/images/editorIconsDisabled_rtl.png'); /* editor icons sprite image - disabled state */
}
diff --git a/lib/dijit/themes/soria/Menu.css b/lib/dijit/themes/soria/Menu.css
index 9d6b97a0e..4d9d06811 100644
--- a/lib/dijit/themes/soria/Menu.css
+++ b/lib/dijit/themes/soria/Menu.css
@@ -1,37 +1,44 @@
+/* Menu */
.soria .dijitMenu,
.soria .dijitMenuBar {
border: 1px solid #cbcbcb;
- margin: 0px;
- padding: 0px;
+ margin: 0;
+ padding: 0;
background-color: #fff;
}
+
.soria .dijitBorderContainer .dijitMenuBar {
border:1px solid #B1BADF;
}
+
.soria .dijitMenuItem {
font-family: sans-serif;
- margin: 0px;
+ margin: 0;
color: #243C5F;
}
.soria .dijitMenuBar .dijitMenuItem {
padding: 4px 5px;
}
+
.soria .dijitMenuPreviousButton, .soria .dijitMenuNextButton {
font-style: italic;
}
.soria .dijitMenuItem TD {
padding:1px;
}
+
.soria .dijitMenuPassive .dijitMenuItemHover,
.soria .dijitMenuItemSelected {
- background-color: #d9e6f9;
+ background-color: #d9e6f9; /* #95a0b0; #555555; #aaaaaa; #646464; #60a1ea; #848484; */
color: #243C5F;
}
+
.soria .dijitMenuItemIcon {
width: 15px;
height: 15px;
}
+
.soria .dijitMenuExpand {
width:15px;
height:15px;
@@ -41,22 +48,30 @@
.dj_ie6 .soria .dijitMenuExpand {
background-image: url('images/spriteRoundedIconsSmall.gif');
}
+
.soria .dijitMenuSeparator {
height: 1px;
}
+
+/* separator can be two pixels -- set border of either one to 0 to have only one */
.soria .dijitMenuSeparatorTop {
- border-bottom: 1px solid #fff;
+ border-bottom: 1px solid #fff; /*97adcb; */
}
+
.soria .dijitMenuSeparatorBottom {
border-top: 1px solid #8ba0bd;
}
+
+/* the checked menu item */
.soria .dijitCheckedMenuItemIconChar {
display: none;
}
+
.soria .dijitCheckedMenuItemIcon {
background-image: url('images/spriteCheckbox.gif');
background-position: -80px;
}
+
.soria .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
background-position: -64px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/Menu_rtl.css b/lib/dijit/themes/soria/Menu_rtl.css
index 6fa9a6a6a..0e0148394 100644
--- a/lib/dijit/themes/soria/Menu_rtl.css
+++ b/lib/dijit/themes/soria/Menu_rtl.css
@@ -1,8 +1,10 @@
+/* Menu */
.dijitRtl .soria .dijitMenuItem .dijitMenuItemIcon {
padding-left: 3px;
- padding-right: 0px;
+ padding-right: 0;
}
+
.dijitRtl .soria .dijitMenuItem .dijitMenuExpand {
background-position: left top;
}
diff --git a/lib/dijit/themes/soria/ProgressBar.css b/lib/dijit/themes/soria/ProgressBar.css
index 566d0488c..b2f6d1fbe 100644
--- a/lib/dijit/themes/soria/ProgressBar.css
+++ b/lib/dijit/themes/soria/ProgressBar.css
@@ -1,24 +1,33 @@
+/****
+ dijit.ProgressBar
+ ****/
+
.soria .dijitProgressBar {
- margin:2px 0px 2px 0px;
+ margin:2px 0 2px 0;
}
+
.soria .dijitProgressBarEmpty{
-
+ /* outer container and background of the bar that's not finished yet*/
background:#fff url("images/progressBarEmpty.png") repeat-x center center;
border-color: #8ba0bd;
}
+
.soria .dijitProgressBarTile{
-
+ /* inner container for finished portion when in 'tile' (image) mode */
background:#f0f0f0 url("images/progressBarFull.png") repeat-x center center;
}
+
.soria .dijitProgressBarFull {
border-right:1px solid #8ba0bd;
}
+
.soria .dijitProgressBarLabel {
-
+ /* Set to a color that contrasts with both the "Empty" and "Full" parts. */
color:#293a4b;
}
+
.soria .dijitProgressBarIndeterminate .dijitProgressBarTile {
-
+ /* use an animated gif for the progress bar in 'indeterminate' mode */
background:#cad2de url("images/progressBarAnim.gif") repeat-x center center;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/TimePicker.css b/lib/dijit/themes/soria/TimePicker.css
index 761aac944..757d746d8 100644
--- a/lib/dijit/themes/soria/TimePicker.css
+++ b/lib/dijit/themes/soria/TimePicker.css
@@ -1,39 +1,48 @@
-
+/* Time Picker */
.soria .dijitTimePickerTick,
.soria .dijitTimePickerMarker {
border-color: #b1badf;
}
+
.soria .dijitTimePickerTick {
color:white;
}
+
.soria .dijitTimePickerMarker {
background:#bed7f0 url("images/titleBar.png") repeat-x top;
color:#293a4b;
font-weight: bold;
}
+
.soria .dijitTimePickerItemSelected {
color: black;
background: #b9cbf1 none;
}
+
.soria .dijitTimePickerItemHover {
background: #60a1ea none;
color:white;
}
+
.soria .dijitTimePickerItemHover,
.soria .dijitTimePickerItemSelected {
position: relative;
z-index: 10;
}
+
.soria .dijitTimePickerTick .dijitTimePickerItemInner {
font-size:0.4em;
}
+
.soria .dijitTimePickerItemHover .dijitTimePickerItemInner,
.soria .dijitTimePickerItemSelected .dijitTimePickerItemInner {
font-size:1em;
}
+
.soria .dijitTimePickerMarkerHover {
border-top: 1px solid #94b9ef;
}
+
.soria .dijitTimePickerTickHover,
.soria .dijitTimePickerTickSelected {
margin-top:-0.3em;
diff --git a/lib/dijit/themes/soria/TimePicker_rtl.css b/lib/dijit/themes/soria/TimePicker_rtl.css
index 39835b00f..a802ba6b6 100644
--- a/lib/dijit/themes/soria/TimePicker_rtl.css
+++ b/lib/dijit/themes/soria/TimePicker_rtl.css
@@ -1,4 +1,4 @@
.dj_ie6-rtl .soria .dijitTimePickerMarkerHover,
.dj_ie7-rtl .soria .dijitTimePickerMarkerHover {
- border-top: 0px;
+ border-top: 0; /* IE6/7 bug causes mouseover/out event storm */
}
diff --git a/lib/dijit/themes/soria/TitlePane.css b/lib/dijit/themes/soria/TitlePane.css
index a1676796a..7e1042e2a 100644
--- a/lib/dijit/themes/soria/TitlePane.css
+++ b/lib/dijit/themes/soria/TitlePane.css
@@ -1,3 +1,7 @@
+/**
+ * dijit.TitlePane
+ *
+ */
.soria .dijitTitlePaneTitle {
background: #cccccc;
@@ -11,17 +15,21 @@
.soria .dijitTitlePaneTitleHover {
background: #f9f9f9 url("images/accordionItemActive.png") top repeat-x;
}
+
.soria .dijitTitlePaneTitle * {
vertical-align: middle;
}
+
.soria .dijitTitlePane .dijitOpen .dijitArrowNode,
.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
width:15px;
height:15px;
}
+
.soria .dijitTitlePaneTextNode {
color: #243C5F;
}
+
.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
background: url('images/spriteRoundedIconsSmall.png') no-repeat -30px top;
}
@@ -34,15 +42,17 @@
.dj_ie6 .soria .dijitTitlePane .dijitOpen .dijitArrowNode {
background:url('images/spriteRoundedIconsSmall.gif') no-repeat -15px top;
}
+
.soria .dijitTitlePaneContentOuter {
background: #ffffff;
border: 1px solid #bfbfbf;
- border-top: 0px;
+ border-top: 0;
}
.soria .dijitTitlePaneContentInner {
padding:10px;
}
+
.soria .dijitTitlePaneTextNode {
margin-left: 4px;
margin-right: 4px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/TitlePane_rtl.css b/lib/dijit/themes/soria/TitlePane_rtl.css
index 1ac12452f..8a1b73d4e 100644
--- a/lib/dijit/themes/soria/TitlePane_rtl.css
+++ b/lib/dijit/themes/soria/TitlePane_rtl.css
@@ -1,6 +1,6 @@
.dijitRtl .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: 0px top;
+ background-position: 0 top;
}
.dj_ie6-rtl .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: 0px top;
-}
+ background-position: 0 top;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/Toolbar.css b/lib/dijit/themes/soria/Toolbar.css
index 4eb55a4e1..8af426a11 100644
--- a/lib/dijit/themes/soria/Toolbar.css
+++ b/lib/dijit/themes/soria/Toolbar.css
@@ -2,55 +2,64 @@
border-bottom: 1px solid #ccc;
background:#eaeaea url("images/titleBar.png") repeat-x top left;
}
+
+/* setting a min-height on ditor toolbar */
.dj_ie6 .soria .dijitToolbar {
height: 10px;
}
+
.soria .dijitToolbar .dijitButtonNode,
.soria .dijitToolbar .dijitComboButton .dijitButtonContents,
.soria .dijitToolbar .dijitComboButton .dijitDownArrowButton {
background: none;
- margin: 0px;
- padding: 0px;
+ margin: 0;
+ padding: 0;
border: none;
font-size: 12px;
}
+
.soria .dijitToolbar .dijitButton,
.soria .dijitToolbar .dijitToggleButton,
.soria .dijitToolbar .dijitDropDownButton,
.soria .dijitToolbar .dijitComboButton .dijitButtonContents,
.soria .dijitToolbar .dijitComboButton .dijitDownArrowButton {
background: none;
- padding: 1px;
+ padding: 1px; /* on hover etc., margin replaced w/border */
}
+
.soria .dijitToolbar .dijitButtonChecked,
.soria .dijitToolbar .dijitToggleButtonChecked {
background-color:#d8e5f8;
border:1px solid #316ac5;
- padding: 0px;
+ padding: 0;
}
+
.soria .dijitToolbar .dijitButtonCheckedHover,
.soria .dijitToolbar .dijitToggleButtonCheckedHover
{
background-color:#9abbea;
border:1px solid #316ac5;
- padding: 0px;
+ padding: 0;
}
+
.soria .dijitToolbar .dijitButtonHover,
.soria .dijitToolbar .dijitToggleButtonHover,
.soria .dijitToolbar .dijitDropDownButtonHover,
.soria .dijitToolbar .dijitComboButton .dijitButtonContentsHover,
.soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover {
-
+ /* TODO: change this from Hover to Selected so that button is still highlighted while drop down is being used */
border: 1px solid #316ac5;
- padding: 0px;
+ padding: 0;
background-color:#9abbea;
}
+
.soria .dijitToolbar label {
padding: 3px 3px 0 6px;
}
+
.dj_ie .soria .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
.dj_ie .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
-
+ /* focus border doesn't appear on <td> for IE, so need to add it manually */
border: 1px #777 dotted !important;
- padding: 0px;
+ padding: 0;
}
diff --git a/lib/dijit/themes/soria/Tree.css b/lib/dijit/themes/soria/Tree.css
index 60934d414..d8edb67df 100644
--- a/lib/dijit/themes/soria/Tree.css
+++ b/lib/dijit/themes/soria/Tree.css
@@ -1,78 +1,105 @@
+/* Tree */
.soria .dijitTreeNode {
background : url('images/treeI.gif') no-repeat;
background-position : top left;
background-repeat : repeat-y;
- zoom: 1;
+ zoom: 1;
}
+
.soria .dijitTreeRowHover {
-
+ /* using a transparent png so that we can still see grid lines, which are (unfortunately) behind the dijitRowNode that we are hovering over */
background-image: url(images/treeHover.png);
background-repeat: repeat;
background-color: transparent !important;
}
+
+
+/* left vertical line (grid) for all nodes */
.soria .dijitTreeIsLast {
background: url('images/treeI_half.gif') no-repeat;
}
+
.soria .dijitTreeLabel {
font-weight: normal;
margin-left: 3px;
}
+
.soria .dijitTreeIsRoot {
margin-left: 0;
background-image: none;
}
+
.soria .dijitTreeExpando {
width: 18px;
height: 18px;
}
+
.soria .dijitTreeRow {
-
+ /* so insert line shows up on IE when dropping after a target element */
padding-bottom: 2px;
}
+
.soria .dijitTreeContent {
min-height: 18px;
min-width: 18px;
padding-left:1px;
}
+
.soria .dijitTreeRowSelected .dijitTreeLabel{
background:#b8cbec;
}
+
.soria .dijitTreeExpandoOpened {
background: url('images/spriteTree.gif') no-repeat -18px top;
}
+
.soria .dijitTreeExpandoClosed {
background-image: url('images/spriteTree.gif');
}
+
.soria .dijitTreeExpandoLeaf {
background: url('images/spriteTree.gif') no-repeat -36px top;
}
+
.soria .dijitTreeExpandoLoading {
background-image: url('images/treeExpand_loading.gif');
}
+
.soria .dijitTreeIcon {
width: 16px;
height: 16px;
}
+
.soria .dijitFolderOpened {
background: url('images/spriteDivIcons.gif') no-repeat -16px top;
}
+
.soria .dijitFolderClosed {
background: url('images/spriteDivIcons.gif') no-repeat top left;
}
+
.soria .dijitLeaf {
background: url('images/spriteDivIcons.gif') no-repeat -32px top;
}
+
+/* Drag and Drop on TreeNodes
+ * Put insert line on dijitTreeContent node so it's aligned w/
+ * (ie, indented equally with) target element, even
+ * though dijitTreeRowNode is the actual "drag object"
+ */
.soria .dijitTreeNode .dojoDndItemBefore,
.soria .dijitTreeNode .dojoDndItemAfter {
border-bottom: none;
border-top: none;
}
+
.soria .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
-
+ /* copied from Common.css */
border-top: 2px solid #369;
}
+
.soria .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
-
+ /* copied from Common.css */
border-bottom: 2px solid #369;
}
diff --git a/lib/dijit/themes/soria/Tree_rtl.css b/lib/dijit/themes/soria/Tree_rtl.css
index 41dd308b4..44daf3aa8 100644
--- a/lib/dijit/themes/soria/Tree_rtl.css
+++ b/lib/dijit/themes/soria/Tree_rtl.css
@@ -1,18 +1,22 @@
+/* Tree */
.dijitRtl .soria .dijitTreeNode,
.dijitRtl .soria .dijitTreeExpandoLeaf {
-
+ /* disable grid lines for Tree in RTL mode, too hard to support */
background-image: none;
}
+
.dijitRtl .soria .dijitTreeContent {
- padding-left: 0px;
+ padding-left: 0;
padding-right: 1px;
}
+
.dijitRtl .soria .dijitTreeExpandoOpened {
-
+ /* todo: icon contains grid line but grid lines disabled above */
background: url('images/spriteTree_rtl.gif') no-repeat -18px top;
}
+
.dijitRtl .soria .dijitTreeExpandoClosed {
-
+ /* todo: icon contains grid line but grid lines disabled above */
background-image: url('images/spriteTree_rtl.gif');
}
diff --git a/lib/dijit/themes/soria/form/Button.css b/lib/dijit/themes/soria/form/Button.css
index 9bf643709..6b813a6dd 100644
--- a/lib/dijit/themes/soria/form/Button.css
+++ b/lib/dijit/themes/soria/form/Button.css
@@ -1,6 +1,14 @@
+/*****
+ dijit.form.Button
+ dijit.form.DropDownButton
+ dijit.form.ComboButton
+ dijit.form.ComboBox (partial)
+ dijit.form.Spinner (partial) (TODO: create NumberSpinner.css file like claro has)
+ *****/
+
.soria .dijitButtonNode {
-
+ /* enabled state - inner */
border: 1px solid #8ba0bd;
border-bottom:1px solid #657c9c;
padding: 0.1em 0.2em 0.2em 0.2em;
@@ -9,16 +17,20 @@
.soria .dijitSelect .dijitButtonContents {
border-right: none;
}
+
.soria .dijitButtonText {
text-align: center;
padding: 0 0.3em;
}
+
.soria .dijitArrowButton {
color: #111;
}
+
.soria .dijitComboButton .dijitDownArrowButton {
padding-right:4px;
}
+
.soria .dijitTextBoxReadOnly,
.soria .dijitTextBoxReadOnly .dijitButtonNode,
.soria .dijitButtonDisabled .dijitButtonNode,
@@ -27,7 +39,7 @@
.soria .dijitComboButtonDisabled .dijitButtonNode,
.soria .dijitTextBoxDisabled,
.soria .dijitTextBoxDisabled .dijitButtonNode {
-
+ /* disabled state - inner */
border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
opacity: 0.60;
@@ -36,7 +48,7 @@
.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 */
color: #aaa;
}
.soria .dijitButtonHover .dijitButtonNode,
@@ -46,29 +58,34 @@
.soria .dijitButtonContentsHover,
.soria .dijitUpArrowButtonHover,
.soria .dijitDownArrowButtonHover {
-
-
+ /* hover state - inner */
+ /* TODO: change from Hover to Selected so that button is still highlighted while drop down is being used */
color:#243C5F;
background:#acc5e2 url("../images/buttonHover.png") repeat-x top left;
}
+
.soria .dijitButtonActive .dijitButtonNode,
.soria .dijitToggleButtonActive .dijitButtonNode,
.soria .dijitDropDownButtonActive .dijitButtonNode,
.soria .dijitComboButtonActive .dijitButtonContents,
.soria .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
-
+ /* active state - inner (for when you are pressing a normal button, or
+ * when a radio-type button is in a depressed state
+ */
border-color:#657c9c;
background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
}
.soria .dijitUpArrowButtonActive,
.soria .dijitDownArrowButtonActive {
-
+ /* same as above except don't adjust border color (it's controlled by the containing Spinner/ComboBox) */
background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
}
+
+
.soria .dijitArrowButtonInner {
background-image: url("../images/spriteArrows.png");
background-repeat: no-repeat;
- background-position: 0px center;
+ background-position: 0 center;
width: 11px;
height: 11px;
}
@@ -88,7 +105,7 @@
background-image: url("../images/spriteArrows.gif");
}
.dj_ie .soria .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: 1px;
+ margin-top: 1px; /* image has too many blank pixels on top */
}
.soria .dijitSpinnerButtonContainer {
width: auto;
diff --git a/lib/dijit/themes/soria/form/Button_rtl.css b/lib/dijit/themes/soria/form/Button_rtl.css
index 50a5c5e0b..e2f3728f3 100644
--- a/lib/dijit/themes/soria/form/Button_rtl.css
+++ b/lib/dijit/themes/soria/form/Button_rtl.css
@@ -1,5 +1,5 @@
.dijitRtl .soria .dijitComboBox .dijitButtonNode {
- border-width: 0px 0px 0px 1px;
+ border-width: 0 0 0 1px;
}
.dijitRtl .soria .dijitSelect .dijitButtonContents {
border-left: none;
diff --git a/lib/dijit/themes/soria/form/Checkbox.css b/lib/dijit/themes/soria/form/Checkbox.css
index 8227dcb74..5a72bfc06 100644
--- a/lib/dijit/themes/soria/form/Checkbox.css
+++ b/lib/dijit/themes/soria/form/Checkbox.css
@@ -1,40 +1,67 @@
+/*
+ * CheckBox and Radio Widgets,
+ * and the CSS to embed a checkbox or radio icon inside a ToggleButton.
+ *
+ * Order of images in the default sprite (from L to R, checkbox and radio in same image):
+ * checkbox normal - checked
+ * - unchecked
+ * disabled - checked
+ * - unchecked
+ * hover - checked
+ * - unchecked
+ *
+ * radio normal - checked
+ * - unchecked
+ * disabled - checked
+ * - unchecked
+ * hover - checked
+ * - unchecked
+*/
+
.soria .dijitToggleButton .dijitCheckBox,
.soria .dijitToggleButton .dijitCheckBoxIcon {
background-image: url('../images/spriteCheckbox.gif');
}
+
.soria .dijitCheckBox,
-.soria .dijitCheckBoxIcon {
- background-image: url('../images/spriteCheckbox.gif');
+.soria .dijitCheckBoxIcon { /* inside a toggle button */
+ background-image: url('../images/spriteCheckbox.gif'); /* checkbox sprite image */
background-repeat: no-repeat;
width: 16px;
height: 16px;
margin: 0;
padding: 0;
}
+
.soria .dijitCheckBox,
.soria .dijitToggleButton .dijitCheckBoxIcon {
-
+ /* unchecked */
background-position: -16px;
}
+
.soria .dijitCheckBoxChecked,
.soria .dijitToggleButtonChecked .dijitCheckBoxIcon {
-
- background-position: 0px;
+ /* checked */
+ background-position: 0;
}
+
.soria .dijitCheckBoxDisabled {
-
+ /* disabled */
background-position: -48px;
}
+
.soria .dijitCheckBoxCheckedDisabled {
-
+ /* disabled but checked */
background-position: -32px;
}
+
.soria .dijitCheckBoxHover {
-
+ /* hovering over an unchecked enabled checkbox */
background-position: -80px;
}
+
.soria .dijitCheckBoxCheckedHover {
-
+ /* hovering over a checked enabled checkbox */
background-position: -64px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/form/Common.css b/lib/dijit/themes/soria/form/Common.css
index 0fe92d2a1..8e3688e82 100644
--- a/lib/dijit/themes/soria/form/Common.css
+++ b/lib/dijit/themes/soria/form/Common.css
@@ -1,25 +1,42 @@
+/****
+ dijit.form.TextBox
+ dijit.form.ValidationTextBox
+ dijit.form.SerializableTextBox
+ dijit.form.RangeBoundTextBox
+ dijit.form.NumberTextBox
+ dijit.form.CurrencyTextBox
+ dijit.form.NumberSpinner
+ dijit.form.ComboBox (partial)
+ ****/
+
.soria .dijitInputContainer INPUT,
.soria .dijitTextBox {
- margin: 0em 0.1em;
+ margin: 0 0.1em;
}
+
.soria .dijitTextBox,
.soria .dijitTextArea {
-
+ /* For all except dijit.form.NumberSpinner: the actual input element.
+ For TextBox, ComboBox, Spinner: the table that contains the input.
+ Otherwise the actual input element.
+ */
background:#fff url("../images/validationInputBg.png") repeat-x top left;
#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
border:1px solid #8ba0bd;
}
+
.soria .dijitComboBox .dijitButtonNode {
padding: 0 0.2em;
}
.soria .dijitTextBox .dijitButtonNode {
-
+ /* line between the input area and the drop down button */
border-color: #8ba0bd;
}
+
.soria .dijitTextBoxFocused,
.soria .dijitTextAreaFocused {
-
+ /* input field when focused (ie: typing affects it) */
border-color:#406b9b;
}
.soria .dijitTextBoxFocused .dijitButtonNode,
@@ -32,20 +49,26 @@
.soria .dijitSpinner .dijitDownArrowButtonActive {
border-top-color:#8ba0bd;
}
+
.soria .dijitError {
border-color:#f3d118;
background-color:#f9f7ba;
background-image:none;
}
+
.soria .dijitErrorFocused {
background-color:#ff6;
background-image:none;
}
+
+/* Validation errors */
.soria .dijitValidationIcon {
-
+ /* prevent height change when widget goes from valid to invalid state */
width: 16px;
background: transparent url('../images/warning.png') no-repeat center center;
}
+
+/* The highlight is shown in the ComboBox menu. */
.soria .dijitComboBoxHighlightMatch {
background-color:#f9f7ba;
}
diff --git a/lib/dijit/themes/soria/form/RadioButton.css b/lib/dijit/themes/soria/form/RadioButton.css
index 543694e28..1ea27bf65 100644
--- a/lib/dijit/themes/soria/form/RadioButton.css
+++ b/lib/dijit/themes/soria/form/RadioButton.css
@@ -1,40 +1,66 @@
+/*
+ * CheckBox and Radio Widgets,
+ * and the CSS to embed a checkbox or radio icon inside a ToggleButton.
+ *
+ * Order of images in the default sprite (from L to R, checkbox and radio in same image):
+ * checkbox normal - checked
+ * - unchecked
+ * disabled - checked
+ * - unchecked
+ * hover - checked
+ * - unchecked
+ *
+ * radio normal - checked
+ * - unchecked
+ * disabled - checked
+ * - unchecked
+ * hover - checked
+ * - unchecked
+*/
.soria .dijitToggleButton .dijitRadio,
.soria .dijitToggleButton .dijitRadioIcon {
background-image: url('../images/spriteRadio.gif');
}
+
.soria .dijitRadio,
-.soria .dijitRadioIcon {
- background-image: url('../images/spriteRadio.gif');
+.soria .dijitRadioIcon { /* inside a toggle button */
+ background-image: url('../images/spriteRadio.gif'); /* checkbox sprite image */
background-repeat: no-repeat;
width: 16px;
height: 16px;
margin: 0;
padding: 0;
}
+
.soria .dijitRadio,
.soria .dijitToggleButton .dijitRadioIcon {
-
+ /* unselected */
background-position: -16px;
}
+
.soria .dijitRadioChecked,
.soria .dijitToggleButtonChecked .dijitRadioIcon {
-
- background-position: 0px;
+ /* selected */
+ background-position: 0;
}
+
.soria .dijitRadioDisabled {
-
+ /* unselected and disabled */
background-position: -48px;
}
+
.soria .dijitRadioCheckedDisabled {
-
+ /* selected but disabled */
background-position: -32px;
}
+
.soria .dijitRadioHover {
-
+ /* hovering over an unselected enabled radio button */
background-position: -80px;
}
+
.soria .dijitRadioCheckedHover {
-
+ /* hovering over a selected enabled radio button */
background-position: -64px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/form/Select.css b/lib/dijit/themes/soria/form/Select.css
index eb85ceaeb..18567720e 100644
--- a/lib/dijit/themes/soria/form/Select.css
+++ b/lib/dijit/themes/soria/form/Select.css
@@ -1,6 +1,8 @@
.soria .dijitSelect .dijitButtonNode {
- padding: 0px;
+ padding: 0;
}
+
+/* Make unselected "look" more like a text box and less like a button */
.soria .dijitSelect .dijitButtonContents {
padding-top: 1px;
background:#fff url("../images/validationInputBg.png") repeat-x top left;
@@ -14,11 +16,14 @@
background: transparent none;
}
.dj_ie .soria .dijitSelect .dijitButtonContents {
- padding-top: 0px;
+ padding-top: 0;
}
+
.soria .dijitSelect .dijitArrowButton {
- padding: 0px 2px;
+ padding: 0 2px;
}
+
+/* Mirror DropDownButton */
.soria .dijitSelectDisabled .dijitButtonNode {
border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
@@ -26,19 +31,24 @@
.dj_ie .soria .dijitSelectDisabled .dijitButtonNode * {
filter: gray() alpha(opacity=50);
}
+
.soria .dijitSelectHover .dijitButtonNode {
color:#000;
background:#acc5e2 url("../images/buttonHover.png") repeat-x top left;
}
+
.soria .dijitSelectActive .dijitButtonNode,
.soria .dijitSelectOpened .dijitButtonNode {
border-color:#657c9c;
background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
}
+
+/* Make the menu look more combobox-like */
.soria .dijitSelectMenu td {
- padding: 0em;
+ padding: 0;
}
.soria .dijitSelectMenu .dijitMenuItemLabel,
.soria .dijitSelectMenu .dijitMenuArrowCell {
padding: 0.1em 0.2em;
}
+
diff --git a/lib/dijit/themes/soria/form/Slider.css b/lib/dijit/themes/soria/form/Slider.css
index 72e48b678..3a68f4631 100644
--- a/lib/dijit/themes/soria/form/Slider.css
+++ b/lib/dijit/themes/soria/form/Slider.css
@@ -1,38 +1,49 @@
+/****
+ SLIDER
+****/
+
.soria .dijitSliderProgressBarH {
border-color: #b1badf;
background: #c0c2c5 url("../images/sliderFull.png") repeat-x top left;
}
+
.soria .dijitSliderProgressBarV {
border-color: #b1badf;
background: #c0c2c5 url("../images/sliderFullVertical.png") repeat-y bottom left;
}
+
.soria .dijitSliderFocused .dijitSliderProgressBarH,
.soria .dijitSliderFocused .dijitSliderLeftBumper {
background-image:url("../images/sliderFullFocus.png");
}
+
.soria .dijitSliderFocused .dijitSliderProgressBarV,
.soria .dijitSliderFocused .dijitSliderBottomBumper {
background-image:url("../images/sliderFullVerticalFocus.png");
}
+
.soria .dijitSliderRemainingBarV {
border-color: #b4b4b4;
background: #dcdcdc url("../images/sliderEmptyVertical.png") repeat-y bottom left;
}
+
.soria .dijitSliderRemainingBarH {
border-color: #b4b4b4;
background: #dcdcdc url("../images/sliderEmpty.png") repeat-x top left;
}
+
.soria .dijitSliderBar {
border-style: solid;
outline:1px;
-
+ /* border-color: #b4b4b4; */
}
.soria .dijitSliderFocused .dijitSliderBar {
border-color:#8ba0bd;
}
+
.soria .dijitSliderImageHandleH {
- border:0px;
+ border:0;
width:15px;
height:18px;
background:url("../images/preciseSliderThumb.png") no-repeat center top;
@@ -41,40 +52,48 @@
background-image:url("../images/preciseSliderThumbFocus.png");
#background-image:url("../images/preciseSliderThumbFocus.gif");
}
+
.dj_ie6 .soria .dijitSliderImageHandleH {
background-image:url("../images/preciseSliderThumb.gif");
}
+
.soria .dijitSliderLeftBumper {
border-left-width: 1px;
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFull.png") repeat-x top left;
}
+
.soria .dijitSliderRightBumper {
background: #dcdcdc url("../images/sliderEmpty.png") repeat-x top left;
border-color: #b4b4b4;
border-right-width: 1px;
}
+
.soria .dijitSliderImageHandleV {
- border:0px;
+ border:0;
width:20px;
height:15px;
background:url("../images/sliderThumb.png") no-repeat center center;
#background:url("../images/sliderThumb.gif") no-repeat center center;
}
+
.soria .dijitSliderFocused .dijitSliderImageHandleV {
background-image:url("../images/sliderThumbFocus.png");
#background-image:url("../images/sliderThumbFocus.gif");
}
+
.soria .dijitSliderBottomBumper {
border-bottom-width: 1px;
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFullVertical.png") repeat-y bottom left;
}
+
.soria .dijitSliderTopBumper {
background: #dcdcdc url("../images/sliderEmptyVertical.png") repeat-y top left;
border-color: #b4b4b4;
border-top-width: 1px;
}
+
.soria .dijitSliderIncrementIconH,
.soria .dijitSliderIncrementIconV {
background:url('../images/spriteRoundedIconsSmall.png') no-repeat -45px top;
@@ -85,6 +104,7 @@
background:url('../images/spriteRoundedIconsSmall.png') no-repeat -30px top;
#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat -30px top;
}
+
.soria .dijitSliderDecrementIconH,
.soria .dijitSliderDecrementIconV {
width:15px;
@@ -93,12 +113,14 @@
#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat -15px top;
}
.soria .dijitSliderDecrementIconH {
- background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top;
- #background:url('../images/spriteRoundedIconsSmall.gif') no-repeat 0px top;
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0 top;
+ #background:url('../images/spriteRoundedIconsSmall.gif') no-repeat 0 top;
}
+
.soria .dijitSliderButtonInner {
visibility:hidden;
}
+
.soria .dijitSliderReadOnly *,
.soria .dijitSliderDisabled * {
border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
@@ -106,7 +128,7 @@
}
.soria .dijitSliderReadOnly .dijitSliderDecrementIconH,
.soria .dijitSliderDisabled .dijitSliderDecrementIconH {
- background-position: 0px -15px;
+ background-position: 0 -15px;
}
.soria .dijitSliderReadOnly .dijitSliderIncrementIconH,
.soria .dijitSliderDisabled .dijitSliderIncrementIconH {
@@ -119,4 +141,4 @@
.soria .dijitSliderReadOnly .dijitSliderIncrementIconV,
.soria .dijitSliderDisabled .dijitSliderIncrementIconV {
background-position: -45px -15px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/form/Slider_rtl.css b/lib/dijit/themes/soria/form/Slider_rtl.css
index c1d8de322..d9b67c504 100644
--- a/lib/dijit/themes/soria/form/Slider_rtl.css
+++ b/lib/dijit/themes/soria/form/Slider_rtl.css
@@ -1,4 +1,6 @@
+/* Slider */
+
.dijitRtl .soria .dijitSliderProgressBarH,
.dijitRtl .soria .dijitSliderRemainingBarH,
.dijitRtl .soria .dijitSliderLeftBumper,
@@ -6,23 +8,28 @@
.dijitRtl .soria .dijitSliderTopBumper {
background-position: top right;
}
+
.dijitRtl .soria .dijitSliderProgressBarV,
.dijitRtl .soria .dijitSliderRemainingBarV,
.dijitRtl .soria .dijitSliderBottomBumper {
background-position: bottom right;
}
+
.dijitRtl .soria .dijitSliderLeftBumper {
- border-left-width: 0px;
+ border-left-width: 0;
border-right-width: 1px;
}
+
.dijitRtl .soria .dijitSliderRightBumper {
border-left-width: 1px;
- border-right-width: 0px;
+ border-right-width: 0;
}
+
.dijitRtl .soria .dijitSliderIncrementIconH {
background:url('../images/spriteRoundedIconsSmall.png') no-repeat left top;
#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat left top;
}
+
.dijitRtl .soria .dijitSliderDecrementIconH {
background:url('../images/spriteRoundedIconsSmall.png') no-repeat -30px top;
#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat -30px top;
diff --git a/lib/dijit/themes/soria/form/TimeTextBox.css b/lib/dijit/themes/soria/form/TimeTextBox.css
index d450925b4..bf67b66d0 100644
--- a/lib/dijit/themes/soria/form/TimeTextBox.css
+++ b/lib/dijit/themes/soria/form/TimeTextBox.css
@@ -1 +1 @@
-@CHARSET "UTF-8";
+@CHARSET "UTF-8"; \ No newline at end of file
diff --git a/lib/dijit/themes/soria/layout/AccordionContainer.css b/lib/dijit/themes/soria/layout/AccordionContainer.css
index b65187f6b..3e2d22d57 100644
--- a/lib/dijit/themes/soria/layout/AccordionContainer.css
+++ b/lib/dijit/themes/soria/layout/AccordionContainer.css
@@ -1,8 +1,15 @@
+/**
+ * dijit.layout.Accordioncontainer
+ *
+ */
.soria .dijitAccordionContainer {
border-color: #b1badf;
background-color: #fff;
}
+
+/* common */
+
.soria .dijitAccordionTitle {
background:#fafafa url("../images/titleBar.png") repeat-x top left;
border-top: 1px solid #b9bbdd;
@@ -11,6 +18,7 @@
font-weight: bold;
color: #373941;
}
+
.soria .dijitAccordionTitleSelected {
background: #f9f9f9 url("../images/accordionItemActive.png") top repeat-x;
font-weight: bold;
@@ -19,17 +27,20 @@
padding: 5px 4px 5px 8px;
color: #243C5F;
}
+
.soria .dijitAccordionArrow {
background:url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -30px top;
width:15px;
height:15px;
margin-top:-1px;
}
+
.soria .dijitAccordionTitleSelected .dijitAccordionArrow {
background:url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -15px top;
margin-top:-1px;
}
+
.soria .dijitAccordionText {
margin-left: 4px;
margin-right: 4px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/layout/AccordionContainer_rtl.css b/lib/dijit/themes/soria/layout/AccordionContainer_rtl.css
index c9f07e067..c6bb820f3 100644
--- a/lib/dijit/themes/soria/layout/AccordionContainer_rtl.css
+++ b/lib/dijit/themes/soria/layout/AccordionContainer_rtl.css
@@ -1,7 +1,8 @@
.dijitRtl .soria .dijitAccordionArrow {
- background-position: 0px top;
+ background-position: 0 top;
}
+
.dijitRtl .soria .dijitAccordionTitleSelected .dijitAccordionArrow {
-
+ /* same rule as LTR mode, just listed to override previous rule in this file */
background-position: -15px top;
}
diff --git a/lib/dijit/themes/soria/layout/BorderContainer.css b/lib/dijit/themes/soria/layout/BorderContainer.css
index aec147ae6..63f2bf365 100644
--- a/lib/dijit/themes/soria/layout/BorderContainer.css
+++ b/lib/dijit/themes/soria/layout/BorderContainer.css
@@ -1,53 +1,71 @@
+/**
+ * dijit.layout.BorderContainer
+ *
+ */
.soria .dijitBorderContainer {
background-color: #e1ebfb;
padding: 5px;
}
+
.soria .dijitSplitContainer-child,
.soria .dijitBorderContainer-child {
-
+ /* By default put borders on all children of BorderContainer,
+ * to give illusion of borders on the splitters themselves.
+ */
border: 1px #b1badf solid;
}
+
.soria .dijitBorderContainer-dijitTabContainerTop,
.soria .dijitBorderContainer-dijitTabContainerBottom,
.soria .dijitBorderContainer-dijitTabContainerLeft,
.soria .dijitBorderContainer-dijitTabContainerRight {
-
+ /* except that TabContainer defines borders on it's sub-nodes (tablist and dijitTabPaneWrapper),
+ * so no border on domNode
+ */
border: none;
}
+
.soria .dijitBorderContainer-dijitBorderContainer {
-
+ /* also, make nested BorderContainers look like a single big widget with lots of splitters */
border: none;
- padding: 0px;
+ padding: 0;
}
+
+
.soria .dijitSplitterH,
.soria .dijitGutterH {
background: #E1EBFB;
border:0;
- border-left:0px solid #d3d3d3;
- border-right:0px solid #d3d3d3;
+ border-left:0 solid #d3d3d3;
+ border-right:0 solid #d3d3d3;
height:5px;
}
+
.soria .dijitSplitterH .dijitSplitterThumb {
background:#B0B0B0 none;
height:1px;
top:2px;
width:19px;
}
+
.soria .dijitSplitterV,
.soria .dijitGutterV {
background: #E1EBFB;
border:0;
- border-top:0px solid #d3d3d3;
- border-bottom:0px solid #d3d3d3;
+ border-top:0 solid #d3d3d3;
+ border-bottom:0 solid #d3d3d3;
width:5px;
}
+
.soria .dijitSplitterV .dijitSplitterThumb {
background:#B0B0B0 none;
height:19px;
left:2px;
width:1px;
}
+
+/* active splitter */
.soria .dijitSplitterActive {
font-size: 1px;
background-image: none;
@@ -56,4 +74,4 @@
opacity: 0.6;
filter: Alpha(Opacity=60);
margin: 0;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/layout/ContentPane.css b/lib/dijit/themes/soria/layout/ContentPane.css
index 9308d50ee..32398dc08 100644
--- a/lib/dijit/themes/soria/layout/ContentPane.css
+++ b/lib/dijit/themes/soria/layout/ContentPane.css
@@ -1,7 +1,10 @@
+/* ContentPane */
.soria .dijitContentPane {
- padding: 0px;
+ padding: 0;
}
+
+/* nested layouts */
.soria .dijitTabContainerTop-dijitContentPane,
.soria .dijitTabContainerLeft-dijitContentPane,
.soria .dijitTabContainerBottom-dijitContentPane,
@@ -10,8 +13,9 @@
background-color: #fff;
padding: 5px;
}
+
.soria .dijitSplitContainer-dijitContentPane,
.soria .dijitBorderContainer-dijitContentPane {
- background-color: #fff;
+ background-color: #fff; /* override background-color setting on parent .dijitBorderContainer */
padding: 5px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/layout/SplitContainer.css b/lib/dijit/themes/soria/layout/SplitContainer.css
index 87f065752..bf7ca1625 100644
--- a/lib/dijit/themes/soria/layout/SplitContainer.css
+++ b/lib/dijit/themes/soria/layout/SplitContainer.css
@@ -1,27 +1,34 @@
+/**
+ * dijit.layout.SplitContainer
+ *
+ */
.soria .dijitSplitContainerSizerH {
background:url("../images/splitContainerSizerV.png") repeat-y #cddef4;
border:0;
- border-left:0px solid #436496;
- border-right:0px solid #436496;
+ border-left:0 solid #436496;
+ border-right:0 solid #436496;
width:5px;
}
+
.soria .dijitSplitContainerSizerH .thumb {
background:url("../images/splitContainerSizerV-thumb.png") no-repeat #ccc;
left:1px;
width:2px;
height:19px;
}
+
.soria .dijitSplitContainerSizerV {
background:url("../images/splitContainerSizerH.png") repeat-x #cddef4;
border:0;
- border-top:0px solid #436496;
- border-bottom:0px solid #436496;
+ border-top:0 solid #436496;
+ border-bottom:0 solid #436496;
height:2px;
}
+
.soria .dijitSplitContainerSizerV .thumb {
background:url("../images/splitContainerSizerH-thumb.png") no-repeat #ccc;
top:1px;
width:19px;
height:5px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/layout/TabContainer.css b/lib/dijit/themes/soria/layout/TabContainer.css
index 0cf156dec..b96d16955 100644
--- a/lib/dijit/themes/soria/layout/TabContainer.css
+++ b/lib/dijit/themes/soria/layout/TabContainer.css
@@ -1,3 +1,12 @@
+/**
+ * dijit.layout.TabContainer
+ *
+ * To style TabContainer with rounded corners
+ * you can use these classes: .dijitTab (left), .dijitTabContent (center), dijitTabInnerDiv (right)
+ * For tabs aligned to top you can style a stripe div right underneath the tabs using .dijitTabStripe
+ */
+
+/* Classes for all types of tabs (top/bottom/left/right) */
.soria .dijitTabContainer .tabStripRBtn {
margin-right: 21px;
@@ -5,63 +14,84 @@
.soria .dijitTabContainer .tabStripLBtn {
margin-left: 21px;
}
+
.soria .nowrapTabStrip .dijitTab {
top: 2px;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTab {
top: -1px;
bottom: 2px;
}
+
+/* Tabs, shared classes */
.soria .dijitTabPaneWrapper {
background:#fff;
border:1px solid #B1BADF;
margin: 0;
- padding-left: 0px;
+ padding-left: 0;
}
+
.soria .dijitTabInnerDiv {
- padding:0px 3px 0px 0px;
+ padding:0 3px 0 0;
margin: 0 0 0 4px;
background: url("../images/tabContainerSprite.gif") no-repeat;
background-position: right -400px;
}
+
.soria .dijitTab {
line-height:normal;
- margin:0 2px 0 0;
- padding:0px;
+ margin:0 2px 0 0; /* space between one tab and the next in top/bottom mode */
+ padding:0;
background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
color: #243C5F;
border-bottom: 1px #B1BADF solid;
}
+
.soria .dijitTabInnerDiv .dijitTabContent {
padding:4px 3px 2px 4px;
background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
position: relative;
}
+
+
+
.soria .dijitTabListWrapper {
z-index: 10;
}
+
+/* hovered tab */
.soria .dijitTabHover {
color: #243C5F;
- background: url("../images/tabContainerSprite.gif") no-repeat 0px -150px;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0 -150px;
}
+
.soria .dijitTabHover .dijitTabInnerDiv {
background: url("../images/tabContainerSprite.gif") no-repeat right -250px;
}
+
.soria .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabContainerSprite.gif") repeat-x 0 -200px;
}
+
+/* checked tab*/
.soria .dijitTabChecked
{
-
- background: url("../images/tabContainerSprite.gif") no-repeat 0px -0px;
+ /* the selected tab (with or without hover) */
+ background: url("../images/tabContainerSprite.gif") no-repeat 0 -0;
}
+
.soria .dijitTabChecked .dijitTabInnerDiv {
background: url("../images/tabContainerSprite.gif") no-repeat right -100px;
}
+
.soria .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
color: #243C5F !important;
}
+
+/* Nested Tabs */
+
.soria .dijitTabContainerTabListNested {
background: #F0F4FC;
background: #D9E9F9;
@@ -70,7 +100,7 @@
.soria .dijitTabContainerTabListNested .dijitTab {
background: none;
border: none;
- top: 0px;
+ top: 0; /* override top:1px setting of top-level tabs */
}
.soria .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv,
.soria .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
@@ -84,12 +114,15 @@
font-weight: bold;
}
.soria .dijitTabContainerSpacerNested .dijitTabSpacer {
-
- height: 0px;
+ /* thinner line between tab (labels) and content */
+ height: 0;
}
.soria .dijitTabPaneWrapperNested {
- border: none;
+ border: none; /* prevent double border */
}
+
+
+/* Close Button */
.soria .dijitTabCloseButton {
width: 15px;
height: 15px;
@@ -99,146 +132,192 @@
.dj_ie6 .soria .dijitTabCloseButton {
background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px top;
}
+
.soria .dijitTabCloseButtonHover {
background: url("../images/spriteRoundedIconsSmall.png") no-repeat -60px -15px;
}
.dj_ie6 .soria .dijitTabCloseButtonHover {
background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px -15px;
}
-.soria .dijitTab .tabLabel {
-
- min-height: 15px;
- display: inline-block;
-}
-.dj_ie6 .soria .dijitTabButtonIcon {
-
- height: 18px;
- width: 1px;
-}
+
+/* ================================ */
+/* top tabs */
.soria .dijitTabContainerTop-tabs {
border-color: #B1BADF;
padding-left: 3px;
}
+
.soria .dijitTabContainerTopNoStrip {
padding-top: 3px;
}
+
+/* top container */
.soria .dijitTabContainerTop-container {
border-top: none;
}
+
.soria .dijitTabContainerTop .dijitTabListWrapper {
border-bottom: none;
}
+
+/*non-checked tabs */
.soria .dijitTabContainerTop-tabs .dijitTab {
top: 1px;
}
+
+/* checked tabs */
.soria .dijitTabContainerTop-tabs .dijitTabChecked {
border-bottom-color: #94b4e6;
}
+
+/* strip */
.soria .dijitTabContainerTopStrip {
border: 1px solid #B1BADF;
margin-top: 1px;
padding-top: 1px;
background: #F0F4FC;
}
+
.soria .dijitTabContainerTopStrip .dijitTabContainerTop-tabs {
padding-left: 3px;
}
+
+
.soria .dijitTabContainerNested .dijitTabListWrapper {
height: auto;
}
+
+/* ================================ */
+/* bottom tabs */
.soria .dijitTabContainerBottom-tabs {
margin-top: -1px;
padding-left: 3px;
border-top: 1px solid #B1BADF;
}
+
.soria .dijitTabContainerBottom .dijitTabListWrapper {
border-top: none;
padding-top: 1px;
padding-bottom: 1px;
float: left;
}
+
+/* bottom container */
.soria .dijitTabContainerBottom-container {
border-bottom: none;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTab {
border-bottom: none;
border-top: 1px solid #B1BADF;
background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
}
+
+/* checked tabs */
.soria .dijitTabContainerBottom-tabs .dijitTabChecked {
border-top-color:#94b4e6;
}
+
+
.soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
padding-top: 3px;
padding-bottom: 3px;
background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom right;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTabHover {
color: #243C5F;
background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom left;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv {
background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom right;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabBottomHoverC.gif") repeat-x bottom left;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTabChecked {
-
+ /* the selected tab (with or without hover) */
background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom left;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom right;
}
+
.soria .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
}
+
+/* strip */
.soria .dijitTabContainerBottomStrip {
padding-bottom: 2px;
border: 1px solid #B1BADF;
}
+
.soria .dijitTabContainerBottomStrip {
background: #F0F4FC;
}
+
+/* top/bottom strip */
.soria .dijitTabContainerBottom-spacer,
.soria .dijitTabContainerTop-spacer {
height: 2px;
border: 1px solid #8ba0bd;
background: #94b4e6;
}
+
.soria .dijitTabContainerTop-spacer {
border-top: none;
}
+
.soria .dijitTabContainerBottom-spacer {
border-bottom: none;
}
+
+/* ================================ */
+/* right tabs */
.soria .dijitTabContainerRight-tabs {
height: 100%;
border-color: #ccc;
padding-top: 3px;
}
+
+/* right container */
.soria .dijitTabContainerRight-container {
border-right: none;
}
+
.soria .dijitTabContainerRight-tabs .dijitTab {
border-bottom: none;
border-left: 1px solid #B1BADF;
border-bottom: 1px solid #B1BADF !important;
}
+
+
+/* some odd ie bug when borders dissapear when setting a bottom margin, this sortof helps */
.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv,
.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv {
border-bottom: solid #B1BADF 1px;
margin-bottom: -1px;
}
+
+/* checked tabs */
.soria .dijitTabContainerRight-tabs .dijitTabChecked {
border-left-color: #94b4e6;
}
+
.soria .dijitTabContainerRight-tabs .dijitTabChecked {
background: url("../images/tabRightChecked.gif") no-repeat left top !important;
}
+
+/* some odd ie bug when borders dissapear when setting a bottom margin, this sortof helps */
.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
@@ -246,33 +325,45 @@
border-bottom: solid #94b4e6 1px;
margin-bottom: -1px;
}
+
.soria .dijitTabContainerRight-tabs .dijitTab {
background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
}
.soria .dijitTabContainerRight-tabs .dijitTabHover .dijitTab {
background: url("../images/tabContainerSprite.gif") no-repeat left -200px;
}
+
+/* strip */
.soria .dijitTabContainerRightStrip {
padding-right: 2px;
border: 1px solid #B1BADF;
background: #F0F4FC;
border-left: none;
}
+
+/* ================================ */
+/* left tabs */
.soria .dijitTabContainerLeft-tabs {
border-color: #ccc;
padding-top: 3px;
height: 100%;
}
+
+/* left conatiner */
.soria .dijitTabContainerLeft-container {
border-left: none;
}
+
.soria .dijitTabContainerLeft-tabs .dijitTab {
border-right: 1px solid #B1BADF;
border-bottom: 1px solid #B1BADF;
}
+
+/* checked tabs */
.soria .dijitTabContainerLeft-tabs .dijitTabChecked {
border-right: 1px solid #94b4e6;
}
+
.soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
background: url("../images/tabContainerSprite.gif") no-repeat right -350px;
}
@@ -283,11 +374,13 @@
.soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
background: url("../images/tabLeftChecked.gif") no-repeat right top;
}
+
.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
border-bottom: solid #B1BADF 1px;
margin-bottom: -1px;
}
+
.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
@@ -295,78 +388,105 @@
border-bottom: solid #94b4e6 1px;
margin-bottom: -1px;
}
+
+/* strip */
.soria .dijitTabContainerLeftStrip {
padding-left: 2px;
border: 1px solid #B1BADF;
background: #F0F4FC;
border-right: none;
}
+
+/* ================================ */
+/* left/right tabs */
.soria .dijitTabContainerLeft-tabs .dijitTab,
.soria .dijitTabContainerRight-tabs .dijitTab {
margin-right:auto;
- margin-bottom:2px;
+ margin-bottom:2px; /* space between one tab and the next in left/right mode */
}
+
+/* left/right tabstrip */
.soria .dijitTabContainerLeft-spacer,
.soria .dijitTabContainerRight-spacer {
width: 2px;
border: 1px solid #8ba0bd;
background: #94b4e6;
}
+
.soria .dijitTabContainerLeft-spacer {
border-left: none;
}
.soria .dijitTabContainerRight-spacer {
border-right: none;
}
+/* ================================ */
+
+/* this resets the tabcontainer stripe when within a contentpane */
.soria .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
- border-left: 0px solid #ccc;
- border-top: 0px solid #ccc;
- border-right: 0px solid #ccc;
- padding-top: 0px;
- padding-left: 0px;
+ border-left: 0 solid #ccc;
+ border-top: 0 solid #ccc;
+ border-right: 0 solid #ccc;
+ padding-top: 0;
+ padding-left: 0;
}
+
+
+/* ================================ */
+
+/* Menu and slider control styles */
.soria .dijitTabContainer .tabStripButton {
margin-right: 0;
}
.soria .dijitTabContainer .tabStripButton-top {
margin-top: 1px;
}
+
.soria .tabStripButton .dijitTabContent{
padding: 6px 0 5px 0;
}
+
.dj_ie6 .soria .tabStripButton .dijitTabContent,
.dj_ie7 .soria .tabStripButton .dijitTabContent {
padding-top: 7px;
}
+
.soria .tabStrip-disabled .tabStripButton .dijitTabContent {
padding: 5px 0 3px 0;
}
+
.dj_ie6 .soria .tabStrip-disabled .tabStripButton .dijitTabContent,
.dj_ie7 .soria .tabStrip-disabled .tabStripButton .dijitTabContent {
padding-top: 6px;
}
+
.soria .dijitTabContainer .tabStripButton-bottom {
background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
border-bottom: medium none;
border-top: 1px solid #B1BADF;
}
+
.soria .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
}
+
.soria .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
background: transparent;
}
+
.soria .dijitTabStripIcon {
height: 14px;
width: 14px;
background: url(../images/spriteRoundedIconsSmall.png) no-repeat left top ;
}
+
.dj_ie6 .soria .dijitTabStripIcon {
background-image: url(../images/spriteRoundedIconsSmall.gif);
}
+
.soria .dijitTabStripSlideRightIcon {
background-position: -30px top;
}
+
.soria .dijitTabStripMenuIcon {
background-position: -15px top;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/layout/TabContainer_rtl.css b/lib/dijit/themes/soria/layout/TabContainer_rtl.css
index 863849813..eba3963b9 100644
--- a/lib/dijit/themes/soria/layout/TabContainer_rtl.css
+++ b/lib/dijit/themes/soria/layout/TabContainer_rtl.css
@@ -1,10 +1,13 @@
.dijitRtl .soria .dijitTab {
margin-right:0;
- margin-left:2px;
+ margin-left:2px; /* space between one tab and the next in top/bottom mode */
}
+
+/* tab strips */
.dijitRtl .soria .dijitTabContainer .tabStripButton {
margin-left: 0;
}
+
.dijitRtl .soria .dijitTabContainerTopStrip,
.dijitRtl .soria .dijitTabContainerBottomStrip,
.dijitRtl .soria .dijitTabContainerTop-tabs,
@@ -12,23 +15,29 @@
padding-left: 0;
padding-right: 3px;
}
+
.dijitRtl .soria .dijitTabInnerDiv {
padding-left: 3px;
padding-right: 4px;
}
+
.dijitRtl .soria .dijitTabPaneWrapper {
#zoom: 1;
}
+
.dj_ie-rtl .soria .dijitTabContainerLeft-tabs {
- margin-left: 0px !important;
+ margin-left: 0 !important;
}
+
.dj_ie-rtl .soria .dijitTabContainerRight-tabs {
- margin-right: 0px !important;
+ margin-right: 0 !important;
}
+
.dijitRtl .soria .dijitTabContainerLeft-tabs .dijitTab,
.dijitRtl .soria .dijitTabContainerRight-tabs .dijitTab {
- margin-left:0px;
+ margin-left:0;
}
+
.dj_ie-rtl .soria .dijitTab .dijitTabInnerDiv{
width : 1%;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/soria.css b/lib/dijit/themes/soria/soria.css
index e7f4ac6ab..36471d03a 100644
--- a/lib/dijit/themes/soria/soria.css
+++ b/lib/dijit/themes/soria/soria.css
@@ -1,3345 +1,41 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
-.dijitReset {
-
- margin:0;
- border:0;
- padding:0;
- line-height:normal;
- font: inherit;
- color: inherit;
-}
-.dijit_a11y .dijitReset {
- -moz-appearance: none;
-}
-.dijitInline {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
- border:0;
- padding:0;
- vertical-align:middle;
- #vertical-align: auto;
-}
-.dijitHidden {
-
- display: none !important;
-}
-.dijitVisible {
-
- display: block !important;
- position: relative;
-}
-.dijitInputContainer {
-
- #zoom: 1;
- overflow: hidden;
- float: none !important;
- position:relative;
-}
-.dj_ie INPUT.dijitTextBox,
-.dj_ie .dijitTextBox INPUT {
- font-size: 100%;
-}
-.dijitTextBox .dijitSpinnerButtonContainer,
-.dijitTextBox .dijitArrowButtonContainer,
-.dijitTextBox .dijitValidationContainer {
- float: right;
- text-align: center;
-}
-.dijitTextBox INPUT.dijitInputField {
-
- padding-left: 0 !important;
- padding-right: 0 !important;
-}
-.dijitTextBox .dijitValidationContainer {
- display: none;
-}
-.dijitInlineTable {
-
- display:inline-table;
- display:inline-block;
- #zoom: 1;
- #display:inline;
- box-sizing: content-box; -moz-box-sizing: content-box;
- border:0;
- padding:0;
-}
-.dijitTeeny {
- font-size:1px;
- line-height:1px;
-}
-.dijitOffScreen {
- position: absolute;
- visibility: hidden;
- left: 50%;
- top: -10000px;
-}
-.dijitPopup {
- position: absolute;
- background-color: transparent;
- margin: 0;
- border: 0;
- padding: 0;
-}
-.dijit_a11y .dijitPopup,
-.dijit_ally .dijitPopup DIV,
-.dijit_a11y .dijitPopup TABLE,
-.dijit_a11y .dijitTooltipContainer {
- background-color: white !important;
-}
-.dijitPositionOnly {
-
- padding: 0 !important;
- border: 0 !important;
- background-color: transparent !important;
- background-image: none !important;
- height: auto !important;
- width: auto !important;
-}
-.dijitNonPositionOnly {
-
- float: none !important;
- position: static !important;
- margin: 0 0 0 0 !important;
- vertical-align: middle !important;
-}
-.dijitBackgroundIframe {
-
- position: absolute;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- border: 0;
- padding: 0;
- margin: 0;
-}
-.dijitDisplayNone {
-
- display:none !important;
-}
-.dijitContainer {
-
- overflow: hidden;
-}
-.dijit_a11y * {
- background-image:none !important;
-}
-.dijit_a11y .dijitIcon,
-.dijit_a11y DIV.dijitArrowButtonInner,
-.dijit_a11y SPAN.dijitArrowButtonInner,
-.dijit_a11y IMG.dijitArrowButtonInner,
-.dijit_a11y .dijitCalendarIncrementControl {
-
- display: none;
-}
-.dijitSpinner DIV.dijitArrowButtonInner {
- display: block;
-}
-.dijit_a11y .dijitA11ySideArrow {
- display: inline !important;
- cursor: pointer;
-}
-.dijit_a11y .dijitCalendarDateLabel {
- padding: 1px;
-}
-.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
- border-style: dotted !important;
- border-width: 1px;
- padding: 0px;
-}
-.dijit_a11y .dijitCalendarDateTemplate {
- padding-bottom: 0.1em !important;
-}
-.dijit_a11y .dijit * {
- background:white !important;
- color:black !important;
-}
-.dijit_a11y .dijitButtonNode {
- border-color: black!important;
- border-style: outset!important;
- border-width: medium!important;
-}
-.dijit_a11y .dijitTextBoxReadOnly .dijitInputField,
-.dijit_a11y .dijitTextBoxReadOnly .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
-.dijitButtonNode * {
- vertical-align: middle;
-}
-.dijitButtonNode .dijitArrowButtonInner {
-
- background: no-repeat center;
- width: 12px;
- height: 12px;
- direction: ltr;
-}
-.dijitLeft {
-
- background-position:left top;
- background-repeat:no-repeat;
-}
-.dijitStretch {
-
- white-space:nowrap;
- background-repeat:repeat-x;
-}
-.dijitRight {
-
- #display:inline;
- background-position:right top;
- background-repeat:no-repeat;
-}
-.dijitToggleButton,
-.dijitButton,
-.dijitDropDownButton,
-.dijitComboButton {
-
- margin: 0.2em;
-}
-.dijitButtonContents {
- display: block;
-}
-td.dijitButtonContents {
- display: table-cell;
-}
-.dijitButtonNode IMG {
-
- vertical-align:middle;
-
-}
-TABLE.dijitComboButton {
-
- border-collapse: collapse;
- border:0;
- padding:0;
- margin:0;
-}
-.dijitToolbar .dijitComboButton {
-
- border-collapse: separate;
-}
-.dijitToolbar .dijitToggleButton,
-.dijitToolbar .dijitButton,
-.dijitToolbar .dijitDropDownButton,
-.dijitToolbar .dijitComboButton {
- margin: 0;
-}
-.dijitToolbar .dijitButtonContents {
-
- padding: 1px 2px;
-}
-.dj_ie .dijitComboButton {
-
- margin-bottom: -3px;
-}
-.dj_webkit .dijitToolbar .dijitDropDownButton {
- padding-left: 0.3em;
-}
-.dj_gecko .dijitToolbar .dijitButtonNode::-moz-focus-inner {
- padding:0;
-}
-.dijitButtonNode {
-
- border:1px solid gray;
- margin:0;
- line-height:normal;
- vertical-align: middle;
- #vertical-align: auto;
- text-align:center;
- white-space: nowrap;
-}
-.dj_webkit .dijitSpinner .dijitSpinnerButtonContainer {
-
- line-height:inherit;
-}
-.dijitTextBox .dijitButtonNode {
- border-width: 0;
-}
-.dijitButtonNode,
-.dijitButtonNode * {
- cursor: pointer;
-}
-.dj_ie .dijitButtonNode {
-
- zoom: 1;
-}
-.dj_ie .dijitButtonNode button {
-
- overflow: visible;
-}
-DIV.dijitArrowButton {
- float: right;
-}
-.dijitTextBox {
- border: solid black 1px;
- #overflow: hidden;
- width: 15em;
- vertical-align: middle;
- #vertical-align: auto;
-}
-.dijitTextBoxReadOnly,
-.dijitTextBoxDisabled {
- color: gray;
-}
-.dj_webkit .dijitTextBoxDisabled INPUT {
- color: #eee;
-}
-.dj_webkit TEXTAREA.dijitTextAreaDisabled {
- color: #333;
-}
-.dj_gecko .dijitTextBoxReadOnly INPUT,
-.dj_gecko .dijitTextBoxDisabled INPUT {
- -moz-user-input: none;
-}
-.dijitPlaceHolder {
-
- color: #AAAAAA;
- font-style: italic;
- position: absolute;
- top: 0;
- left: 0;
- #filter: "";
-}
-.dijitTimeTextBox {
- width: 8em;
-}
-.dijitTextBox INPUT:focus {
- outline: none;
-}
-.dijitTextBoxFocused {
- outline: auto 5px -webkit-focus-ring-color;
-}
-.dijitTextBox INPUT {
- float: left;
-}
-.dijitInputInner {
-
- border:0 !important;
- vertical-align:middle !important;
- background-color:transparent !important;
- width:100% !important;
-
- padding-left: 0 !important;
- padding-right: 0 !important;
- margin-left: 0 !important;
- margin-right: 0 !important;
-}
-.dijit_a11y .dijitTextBox INPUT {
- margin: 0 !important;
-}
-.dijitTextBoxError INPUT.dijitValidationInner,
-.dijitTextBox INPUT.dijitArrowButtonInner {
-
- text-indent: -1em !important;
- direction: ltr !important;
- text-align: left !important;
- height: auto !important;
- #text-indent: 0 !important;
- #letter-spacing: -5em !important;
- #text-align: right !important;
-}
-.dj_ie .dijitTextBox INPUT,
-.dj_ie INPUT.dijitTextBox {
- overflow-y: visible;
- line-height: normal;
-}
-.dj_ie7 .dijitTextBox INPUT.dijitValidationInner,
-.dj_ie7 .dijitTextBox INPUT.dijitArrowButtonInner {
- line-height: 86%;
-}
-.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%;
-}
-.dijit_a11y INPUT.dijitValidationInner,
-.dijit_a11y INPUT.dijitArrowButtonInner {
-
- text-indent: 0 !important;
- width: 1em !important;
- #text-align: left !important;
-}
-.dijitTextBoxError .dijitValidationContainer {
- display: inline;
- cursor: default;
-}
-.dijitSpinner .dijitSpinnerButtonContainer,
-.dijitComboBox .dijitArrowButtonContainer {
-
- border-width: 0 0 0 1px !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
-
- border-width: 0;
-}
-.dj_ie .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
- clear: both;
-}
-.dijit_a11y .dijitTextBox .dijitValidationContainer,
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBox .dijitArrowButtonContainer {
-
- border: solid black !important;
- border-width: 0 0 0 1px !important;
-}
-.dj_ie .dijitToolbar .dijitComboBox {
-
- vertical-align: middle;
-}
-.dijitTextBox .dijitSpinnerButtonContainer {
- width: 1em;
- position: relative !important;
- overflow: hidden;
-}
-.dijitSpinner .dijitSpinnerButtonInner {
- width:1em;
- visibility:hidden !important;
- overflow-x:hidden;
-}
-.dijitComboBox .dijitButtonNode,
-.dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 0;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border: 0 none !important;
-}
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner,
-.dijit_a11y .dijitSpinnerButtonContainer INPUT {
- width: 1em !important;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner {
- margin: 0 auto !important;
-}
-.dj_ie .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.3em !important;
- padding-right: 0.3em !important;
- margin-left: 0.3em !important;
- margin-right: 0.3em !important;
- width: 1.4em !important;
-}
-.dj_ie7 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.0em !important;
- padding-right: 0.0em !important;
- width: 1em !important;
-}
-.dj_ie6 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- margin-left: 0.1em !important;
- margin-right: 0.1em !important;
- width: 1em !important;
-}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- margin-left: 0 !important;
- margin-right: 0 !important;
- width: 2em !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
-
- padding: 0;
- position: absolute !important;
- right: 0;
- float: none;
- height: 50%;
- width: 100%;
- bottom: auto;
- left: 0;
- right: auto;
-}
-.dj_iequirks .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: auto;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitArrowButton {
- overflow: visible !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitDownArrowButton {
- top: 50%;
- border-top-width: 1px !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitUpArrowButton {
- #bottom: 50%;
- top: 0;
-}
-.dijitSpinner .dijitArrowButtonInner {
- margin: auto;
- overflow-x: hidden;
- height: 100% !important;
-}
-.dj_iequirks .dijitSpinner .dijitArrowButtonInner {
- height: auto !important;
-}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- -moz-transform: scale(0.5);
- -moz-transform-origin: center top;
- -webkit-transform: scale(0.5);
- -webkit-transform-origin: center top;
- -o-transform: scale(0.5);
- -o-transform-origin: center top;
- transform: scale(0.5);
- transform-origin: left top;
- padding-top: 0;
- padding-bottom: 0;
- padding-left: 0 !important;
- padding-right: 0 !important;
- width: 100%;
-}
-.dj_ie .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- zoom: 50%;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButtonInner {
- overflow: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 100%;
-}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 1em;
-}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- visibility: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- vertical-align:top;
- visibility: visible;
-}
-.dijit_a11y .dijitSpinnerButtonContainer {
- width: 1em;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 1px 0px 0px 0px;
- border-style: solid !important;
-}
-.dijitCheckBox,
-.dijitRadio,
-.dijitCheckBoxInput {
- padding: 0;
- border: 0;
- width: 16px;
- height: 16px;
- background-position:center center;
- background-repeat:no-repeat;
- overflow: hidden;
-}
-.dijitCheckBox INPUT,
-.dijitRadio INPUT {
- margin: 0;
- padding: 0;
- display: block;
-}
-.dijitCheckBoxInput {
-
- opacity: 0.01;
-}
-.dj_ie .dijitCheckBoxInput {
- filter: alpha(opacity=0);
-}
-.dijit_a11y .dijitCheckBox,
-.dijit_a11y .dijitRadio {
-
- width: auto !important;
- height: auto !important;
-}
-.dijit_a11y .dijitCheckBoxInput {
- opacity: 1;
- filter: none;
- width: auto;
- height: auto;
-}
-.dijitProgressBarEmpty {
-
- position:relative;overflow:hidden;
- border:1px solid black;
- z-index:0;
-}
-.dijitProgressBarFull {
-
- position:absolute;
- overflow:hidden;
- z-index:-1;
- top:0;
- width:100%;
-}
-.dj_ie6 .dijitProgressBarFull {
- height:1.6em;
-}
-.dijitProgressBarTile {
-
- position:absolute;
- overflow:hidden;
- top:0;
- left:0;
- bottom:0;
- right:0;
- margin:0;
- padding:0;
- width:auto;
- height:auto;
- background-color:#aaa;
- background-attachment: fixed;
-}
-.dijit_a11y .dijitProgressBarTile {
-
- border-width:2px;
- border-style:solid;
- background-color:transparent !important;
-}
-.dj_ie6 .dijitProgressBarTile {
-
- position:static;
-
- height:1.6em;
-}
-.dijitProgressBarIndeterminate .dijitProgressBarLabel {
- visibility:hidden;
-}
-.dijitProgressBarIndeterminate .dijitProgressBarTile {
-
-}
-.dijitProgressBarIndeterminateHighContrastImage {
- display:none;
-}
-.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
- display:block;
- position:absolute;
- top:0;
- bottom:0;
- margin:0;
- padding:0;
- width:100%;
- height:auto;
-}
-.dijitProgressBarLabel {
- display:block;
- position:static;
- width:100%;
- text-align:center;
- background-color:transparent !important;
-}
-.dijitTooltip {
- position: absolute;
- z-index: 2000;
- display: block;
-
- left: 50%;
- top: -10000px;
- overflow: visible;
-}
-.dijitTooltipContainer {
- border: solid black 2px;
- background: #b8b5b5;
- color: black;
- font-size: small;
-}
-.dijitTooltipFocusNode {
- padding: 2px 2px 2px 2px;
-}
-.dijitTooltipConnector {
- position: absolute;
-}
-.dijit_a11y .dijitTooltipConnector {
- display: none;
-}
-.dijitTooltipData {
- display:none;
-}
-.dijitLayoutContainer {
- position: relative;
- display: block;
- overflow: hidden;
-}
-body .dijitAlignTop,
-body .dijitAlignBottom,
-body .dijitAlignLeft,
-body .dijitAlignRight {
- position: absolute;
- overflow: hidden;
-}
-body .dijitAlignClient { position: absolute; }
-.dijitBorderContainer, .dijitBorderContainerNoGutter {
- position:relative;
- overflow: hidden;
-}
-.dijitBorderContainerPane,
-.dijitBorderContainerNoGutterPane {
- position: absolute !important;
- z-index: 2;
-}
-.dijitBorderContainer > .dijitTextArea {
-
- resize: none;
-}
-.dijitGutter {
-
- position: absolute;
- font-size: 1px;
-}
-.dijitSplitter {
- position: absolute;
- overflow: hidden;
- z-index: 10;
- background-color: #fff;
- border-color: gray;
- border-style: solid;
- border-width: 0;
-}
-.dj_ie .dijitSplitter {
- z-index: 1;
-}
-.dijitSplitterActive {
- z-index: 11 !important;
-}
-.dijitSplitterCover {
- position:absolute;
- z-index:-1;
- top:0;
- left:0;
- width:100%;
- height:100%;
-}
-.dijitSplitterCoverActive {
- z-index:3 !important;
-}
-.dj_ie .dijitSplitterCover {
- background: white;
- filter: alpha(opacity=0);
-}
-.dijitSplitterH {
- height: 7px;
- border-top:1px;
- border-bottom:1px;
- cursor: ns-resize;
-}
-.dijitSplitterV {
- width: 7px;
- border-left:1px;
- border-right:1px;
- cursor: ew-resize;
-}
-.dijitSplitContainer {
- position: relative;
- overflow: hidden;
- display: block;
-}
-.dj_ff3 .dijit_a11y div.dijitSplitter:focus {
- outline-style:dotted;
- outline-width: 2px;
-}
-.dijitSplitPane {
- position: absolute;
-}
-.dijitSplitContainerSizerH,
-.dijitSplitContainerSizerV {
- position:absolute;
- font-size: 1px;
- cursor: move;
- cursor: w-resize;
- background-color: ThreeDFace;
- border: 1px solid;
- border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
- margin: 0;
-}
-.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
- overflow:hidden;
- position:absolute;
- top:49%;
-}
-.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
- position:absolute;
- left:49%;
-}
-.dijitSplitterShadow,
-.dijitSplitContainerVirtualSizerH,
-.dijitSplitContainerVirtualSizerV {
- font-size: 1px;
- background-color: ThreeDShadow;
- -moz-opacity: 0.5;
- opacity: 0.5;
- filter: Alpha(Opacity=50);
- margin: 0;
-}
-.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
- cursor: w-resize;
-}
-.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
- cursor: n-resize;
-}
-.dijit_a11y .dijitSplitterH {
- border-top:1px solid #d3d3d3 !important;
- border-bottom:1px solid #d3d3d3 !important;
-}
-.dijit_a11y .dijitSplitterV {
- border-left:1px solid #d3d3d3 !important;
- border-right:1px solid #d3d3d3 !important;
-}
-.dijitContentPane {
- display: block;
- overflow: auto;
-}
-.dijitContentPaneSingleChild {
-
- overflow: hidden;
-}
-.dijitTitlePane {
- display: block;
- overflow: hidden;
-}
-.dijitTitlePaneTitle {
- cursor: pointer;
-}
-.dijitFixedOpen {
-
- cursor: default;
-}
-.dijitTitlePaneTitle * {
- vertical-align: middle;
-}
-.dijitTitlePane .dijitArrowNodeInner {
-
- display: none;
-}
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
-
- display:inline !important;
- font-family: monospace;
-}
-.dijit_a11y .dijitTitlePane .dijitArrowNode {
-
- display:none;
-}
-.dj_ie6 .dijitTitlePaneContentOuter,
-.dj_ie6 .dijitTitlePane .dijitTitlePaneTitle {
-
- zoom: 1;
-}
-.dijitColorPalette {
- border: 1px solid #999;
- background: #fff;
- position: relative;
-}
-img.dijitColorPaletteUnder {
-
- border-style: none;
- position: absolute;
- left: 0;
- top: 0;
-}
-.dijitColorPalette .dijitPaletteTable {
-
- padding: 2px 3px 3px 3px;
- position: relative;
- overflow: hidden;
- outline: 0;
- border-collapse: separate;
-}
-.dj_ie6 .dijitColorPalette .dijitPaletteTable,
-.dj_ie7 .dijitColorPalette .dijitPaletteTable,
-.dj_iequirks .dijitColorPalette .dijitPaletteTable {
-
- padding: 0;
- margin: 2px 3px 3px 3px;
-}
-.dijitColorPalette .dijitPaletteCell {
-
- height: 20px;
- width: 20px;
- font-size: 1px;
- vertical-align: middle;
- text-align: center;
-}
-.dijitColorPalette .dijitPaletteImg {
-
- width: 16px;
- height: 14px;
- border: 1px solid #999;
- cursor: default;
- vertical-align: middle;
-}
-.dj_iequirks .dijitColorPalette .dijitPaletteImg {
- margin: 1px;
-}
-.dijitPaletteTable td {
- padding: 0px;
-}
-.dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
-
- border: 1px solid #000;
-}
-.dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
-.dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
- border: 2px solid #000;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteTable,
-.dijit_a11y .dijitColorPalette .dijitPaletteTable * {
-
- background-color: transparent !important;
-}
-.dj_gecko .dijit_a11y .dijitColorPalette .dijitPaletteCellFocused .dijitPaletteImg {
- border: 3px dotted #000;
- margin: -1px;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
- border: 2px solid #000 !important;
-}
-.dijitAccordionContainer {
- border:1px solid #b7b7b7;
- border-top:0 !important;
-}
-.dijitAccordionTitle {
- cursor: pointer;
-}
-.dijitAccordionTitleSelected {
- cursor: default;
-}
-.dijitAccordionTitle .arrowTextUp,
-.dijitAccordionTitle .arrowTextDown {
- display: none;
- font-size: 0.65em;
- font-weight: normal !important;
-}
-.dijit_a11y .dijitAccordionTitle .arrowTextUp,
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextDown {
- display: inline;
-}
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextUp {
- display: none;
-}
-.dj_ie6 .dijitAccordionTitle,
-.dj_iequirks .dijitAccordionTitle {
-
- zoom: 1;
-}
-.dijitCalendarContainer {
- width: auto;
-}
-.dijitCalendarContainer th, .dijitCalendarContainer td {
- padding: 0;
-}
-.dijitCalendarNextYear {
- margin:0 0 0 0.55em;
-}
-.dijitCalendarPreviousYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarIncrementControl {
- vertical-align: middle;
-}
-.dijitCalendarIncrementControl,
-.dijitCalendarDateTemplate,
-.dijitCalendarMonthLabel,
-.dijitCalendarPreviousYear,
-.dijitCalendarNextYear {
- cursor: pointer;
-}
-.dijitCalendarDisabledDate {
- color: gray;
- text-decoration: line-through;
- cursor: default;
-}
-.dijitSpacer {
-
- position: relative;
- height: 1px;
- overflow: hidden;
- visibility: hidden;
-}
-.dijitMenu {
- border:1px solid black;
- background-color:white;
-}
-.dijitMenuTable {
- border-collapse:collapse;
- border-width:0;
- background-color:white;
-}
-.dj_webkit .dijitMenuTable td[colspan="2"]{
- border-right:hidden;
-}
-.dijitMenuItem {
- text-align: left;
- white-space: nowrap;
- padding:.1em .2em;
- cursor:pointer;
-}
-.dijitMenuPassive .dijitMenuItemHover,
-.dijitMenuItemSelected {
-
- background-color:black;
- color:white;
-}
-.dijitMenuItemIcon, .dijitMenuExpand {
- background-repeat: no-repeat;
-}
-.dijitMenuItemDisabled * {
-
- opacity:0.5;
- cursor:default;
-}
-.dj_ie .dijit_a11y .dijitMenuItemDisabled,
-.dj_ie .dijit_a11y .dijitMenuItemDisabled td,
-.dj_ie .dijitMenuItemDisabled *,
-.dj_ie .dijitMenuItemDisabled td {
- color:gray !important;
- filter: alpha(opacity=35);
-}
-.dijitMenuItemLabel {
- position: relative;
- vertical-align: middle;
-}
-.dijit_a11y .dijitMenuItemSelected {
- border: 1px dotted black !important;
-}
-.dj_ff3 .dijit_a11y .dijitMenuItem td {
- padding: none !important;
- background:none !important;
-}
-.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
- border-width: 1px;
- border-style: solid;
-}
-.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
- position:static;
-}
-.dijitMenuExpandA11y {
- display: none;
-}
-.dijit_a11y .dijitMenuExpandA11y {
- display: inline;
-}
-.dijitMenuSeparator td {
- border: 0;
- padding: 0;
-}
-.dijitMenuSeparatorTop {
- height: 50%;
- margin: 0;
- margin-top:3px;
- font-size: 1px;
-}
-.dijitMenuSeparatorBottom {
- height: 50%;
- margin: 0;
- margin-bottom:3px;
- font-size: 1px;
-}
-.dijitCheckedMenuItemIconChar {
- vertical-align: middle;
- visibility:hidden;
-}
-.dijitCheckedMenuItemChecked .dijitCheckedMenuItemIconChar {
- visibility: visible;
-}
-.dijit_a11y .dijitCheckedMenuItemIconChar {
- display:inline !important;
-}
-.dijit_a11y .dijitCheckedMenuItemIcon {
- display: none;
-}
-.dj_ie .dijit_a11y .dijitMenuBar .dijitMenuItem {
-
- margin: 0px;
-}
-.dijitStackController .dijitToggleButtonChecked * {
- cursor: default;
-}
-.dijitTabContainerNoLayout {
- width: 100%;
-}
-.dijitTabContainerBottom-tabs,
-.dijitTabContainerTop-tabs,
-.dijitTabContainerLeft-tabs,
-.dijitTabContainerRight-tabs {
- overflow: visible !important;
-}
-.dijitTabContainerBottom-container,
-.dijitTabContainerTop-container,
-.dijitTabContainerLeft-container,
-.dijitTabContainerRight-container {
- z-index:0;
- overflow: hidden;
- border: 1px solid black;
-}
-.nowrapTabStrip {
- width: 50000px;
- display: block;
- position: relative;
-}
-.dijitTabListWrapper {
- overflow: hidden;
-}
-.dijit_a11y .tabStripButton img {
-
- display: none;
-}
-.dijitTabContainerTop-tabs {
- border-bottom: 1px solid black;
-}
-.dijitTabContainerTop-container {
- border-top: 0px;
-}
-.dijitTabContainerLeft-tabs {
- border-right: 1px solid black;
- float: left;
-}
-.dijitTabContainerLeft-container {
- border-left: 0px;
-}
-.dijitTabContainerBottom-tabs {
- border-top: 1px solid black;
-}
-.dijitTabContainerBottom-container {
- border-bottom: 0px;
-}
-.dijitTabContainerRight-tabs {
- border-left: 1px solid black;
- float: left;
-}
-.dijitTabContainerRight-container {
- border-right: 0px;
-}
-DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
- cursor: auto;
-}
-.dijitTab {
- position:relative;
- cursor:pointer;
- white-space:nowrap;
- z-index:3;
-}
-.dijitTab * {
-
- vertical-align: middle;
-}
-.dijitTabChecked {
- cursor: default;
-}
-.dijitTabContainerTop-tabs .dijitTab {
- top: 1px;
-}
-.dijitTabContainerBottom-tabs .dijitTab {
- top: -1px;
-}
-.dijitTabContainerLeft-tabs .dijitTab {
- left: 1px;
-}
-.dijitTabContainerRight-tabs .dijitTab {
- left: -1px;
-}
-.dijitTabContainerTop-tabs .dijitTab,
-.dijitTabContainerBottom-tabs .dijitTab {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
-}
-.dijitTabInnerDiv {
- position:relative;
-}
-.tabStripButton {
- z-index: 12;
-}
-.dijitTabButtonDisabled .tabStripButton {
- display: none;
-}
-.dijitTabCloseButton {
- margin-left: 1em;
-}
-.dijitTabCloseText {
- display:none;
-}
-.dijit_a11y .dijitTabCloseButton {
- background-image: none !important;
- width: auto !important;
- height: auto !important;
- border: thin dotted;
-}
-.dijit_a11y .dijitTabCloseButtonHover {
- border:thin solid;
-}
-.dijit_a11y .dijitTabCloseText {
- display: inline;
-}
-.dijit_a11y .dijitTabChecked {
-
- border-style:dashed !important;
-}
-.dijit_a11y .dijitTabInnerDiv {
- border-left:none !important;
- }
-.dijitTabPane,
-.dijitStackContainer-child,
-.dijitAccordionContainer-child {
-
- border: none !important;
-}
-.dijitInlineEditBoxDisplayMode {
- border: 1px solid transparent;
- cursor: text;
-}
-.dijit_a11y .dijitInlineEditBoxDisplayMode,
-.dj_ie6 .dijitInlineEditBoxDisplayMode {
-
- border: none;
-}
-.dijitInlineEditBoxDisplayModeHover,
-.dijit_a11y .dijitInlineEditBoxDisplayModeHover,
-.dj_ie6 .dijitInlineEditBoxDisplayModeHover {
-
- background-color: #e2ebf2;
- border: solid 1px black;
-}
-.dijitInlineEditBoxDisplayModeDisabled {
- cursor: default;
-}
-.dijitTreeIndent {
-
- width: 19px;
-}
-.dijitTreeRow, .dijitTreeContent {
- white-space: nowrap;
-}
-.dijitTreeRow img {
-
- vertical-align: middle;
-}
-.dijitTreeContent {
- cursor: default;
-}
-.dijitExpandoText {
- display: none;
-}
-.dijit_a11y .dijitExpandoText {
- display: inline;
- padding-left: 10px;
- padding-right: 10px;
- font-family: monospace;
- border-style: solid;
- border-width: thin;
- cursor: pointer;
-}
-.dijitTreeLabel {
- margin: 0px 4px;
-}
-.dijitDialog {
- position: absolute;
- z-index: 999;
- overflow: hidden;
-}
-.dijitDialogTitleBar {
- cursor: move;
-}
-.dijitDialogFixed .dijitDialogTitleBar {
- cursor:default;
-}
-.dijitDialogCloseIcon {
- cursor: pointer;
-}
-.dijitDialogUnderlayWrapper {
- position: absolute;
- left: 0;
- top: 0;
- z-index: 998;
- display: none;
- background: transparent !important;
-}
-.dijitDialogUnderlay {
- background: #eee;
- opacity: 0.5;
-}
-.dj_ie .dijitDialogUnderlay {
- filter: alpha(opacity=50);
-}
-.dijit_a11y .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitDialog {
- opacity: 1 !important;
- background-color: white !important;
-}
-.dijitDialog .closeText {
- display:none;
-
- position:absolute;
-}
-.dijit_a11y .dijitDialog .closeText {
- display:inline;
-}
-.dijitSliderMoveable {
- z-index:99;
- position:absolute !important;
- display:block;
- vertical-align:middle;
-}
-.dijitSliderMoveableH {
- right:0;
-}
-.dijitSliderMoveableV {
- right:50%;
-}
-.dijit_a11y DIV.dijitSliderImageHandle,
-.dijitSliderImageHandle {
- margin:0;
- padding:0;
- position:relative !important;
- border:8px solid gray;
- width:0;
- height:0;
- cursor: pointer;
-}
-.dj_iequirks .dijit_a11y .dijitSliderImageHandle {
- font-size: 0;
-}
-.dj_ie7 .dijitSliderImageHandle {
- overflow: hidden;
-}
-.dj_ie7 .dijit_a11y .dijitSliderImageHandle {
- overflow: visible;
-}
-.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
- border:4px solid #000;
- height:8px;
- width:8px;
-}
-.dijitSliderImageHandleV {
- top:-8px;
- right: -50%;
-}
-.dijitSliderImageHandleH {
- left:50%;
- top:-5px;
- vertical-align:top;
-}
-.dijitSliderBar {
- border-style:solid;
- border-color:black;
- cursor: pointer;
-}
-.dijitSliderBarContainerV {
- position:relative;
- height:100%;
- z-index:1;
-}
-.dijitSliderBarContainerH {
- position:relative;
- z-index:1;
-}
-.dijitSliderBarH {
- height:4px;
- border-width:1px 0;
-}
-.dijitSliderBarV {
- width:4px;
- border-width:0 1px;
-}
-.dijitSliderProgressBar {
- background-color:red;
- z-index:1;
-}
-.dijitSliderProgressBarV {
- position:static !important;
- height:0%;
- vertical-align:top;
- text-align:left;
-}
-.dijitSliderProgressBarH {
- position:absolute !important;
- width:0%;
- vertical-align:middle;
- overflow:visible;
-}
-.dijitSliderRemainingBar {
- overflow:hidden;
- background-color:transparent;
- z-index:1;
-}
-.dijitSliderRemainingBarV {
- height:100%;
- text-align:left;
-}
-.dijitSliderRemainingBarH {
- width:100% !important;
-}
-.dijitSliderBumper {
- overflow:hidden;
- z-index:1;
-}
-.dijitSliderBumperV {
- width:4px;
- height:8px;
- border-width:0 1px;
-}
-.dijitSliderBumperH {
- width:8px;
- height:4px;
- border-width:1px 0;
-}
-.dijitSliderBottomBumper,
-.dijitSliderLeftBumper {
- background-color:red;
-}
-.dijitSliderTopBumper,
-.dijitSliderRightBumper {
- background-color:transparent;
-}
-.dijitSliderDecoration {
- text-align:center;
-}
-.dijitSliderV TD {
- position: relative;
-}
-.dijitSliderDecorationH {
- width: 100%;
-}
-.dijitSliderDecorationV {
- height: 100%;
-}
-.dijitSliderButton {
- font-family:monospace;
- margin:0;
- padding:0;
- display:block;
-}
-.dijit_a11y .dijitSliderButtonInner {
- visibility:visible !important;
-}
-.dijitSliderButtonContainer {
- text-align:center;
- height:0;
-}
-.dijitSliderButtonContainer * {
- cursor: pointer;
-}
-.dijitSlider .dijitButtonNode {
- padding:0;
- display:block;
-}
-.dijitRuleContainer {
- position:relative;
- overflow:visible;
-}
-.dijitRuleContainerV {
- height:100%;
- line-height:0;
- float:left;
- text-align:left;
-}
-.dj_opera .dijitRuleContainerV {
- line-height:2%;
-}
-.dj_ie .dijitRuleContainerV {
- line-height:normal;
-}
-.dj_gecko .dijitRuleContainerV {
- margin:0 0 1px 0;
-}
-.dijitRuleMark {
- position:absolute;
- border:1px solid black;
- line-height:0;
- height:100%;
-}
-.dijitRuleMarkH {
- width:0;
- border-top-width:0 !important;
- border-bottom-width:0 !important;
- border-left-width:0 !important;
-}
-.dijitRuleLabelContainer {
- position:absolute;
-}
-.dijitRuleLabelContainerH {
- text-align:center;
- display:inline-block;
-}
-.dijitRuleLabelH {
- position:relative;
- left:-50%;
-}
-.dijitRuleLabelV {
-
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
-}
-.dijitRuleMarkV {
- height:0;
- border-right-width:0 !important;
- border-bottom-width:0 !important;
- border-left-width:0 !important;
- width:100%;
- left:0;
-}
-.dj_ie .dijitRuleLabelContainerV {
- margin-top:-.55em;
-}
-.dijit_a11y .dijitSliderReadOnly,
-.dijit_a11y .dijitSliderDisabled {
- opacity:0.6;
-}
-.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
-.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
- filter: alpha(opacity=40);
-}
-.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
- font-family: monospace;
- font-size: 1em;
- line-height: 1em;
- height: auto;
- width: auto;
- margin: 0px 4px;
-}
-.dijit_a11y .dijitButtonContents .dijitButtonText,
-.dijit_a11y .dijitTab .tabLabel {
- display: inline !important;
-}
-.dijitTextArea {
- width:100%;
- overflow-y: auto;
-}
-.dijitTextArea[cols] {
- width:auto;
-}
-.dj_ie .dijitTextAreaCols {
- width:auto;
-}
-.dijitToolbarSeparator {
- height: 18px;
- width: 5px;
- padding: 0 1px;
- margin: 0;
-}
-.dijitIEFixedToolbar {
- position:absolute;
-
- top: expression(eval((document.documentElement||document.body).scrollTop));
-}
-.dijitEditor {
- display: block;
-}
-.dijitEditorDisabled,
-.dijitEditorReadOnly {
- color: gray;
-}
-.dijitTimePickerItemInner {
- text-align:center;
- border:0;
- padding:2px 8px 2px 8px;
-}
-.dijitTimePickerTick,
-.dijitTimePickerMarker {
- border-bottom:1px solid gray;
-}
-.dijitTimePicker .dijitDownArrowButton {
- border-top: none !important;
-}
-.dijitTimePickerTick {
- color:#CCC;
-}
-.dijitTimePickerMarker {
- color:black;
- background-color:#CCC;
-}
-.dijitTimePickerItemSelected {
- font-weight:bold;
- color:#333;
- background-color:#b7cdee;
-}
-.dijitTimePickerItemHover {
- background-color:gray;
- color:white;
- cursor:pointer;
-}
-.dijit_a11y .dijitTimePickerItemSelected .dijitTimePickerItemInner {
- border: solid 4px black;
-}
-.dijit_a11y .dijitTimePickerItemHover .dijitTimePickerItemInner {
- border: dashed 4px black;
-}
-.dijitToggleButtonIconChar {
-
- display:none !important;
-}
-.dijit_a11y .dijitToggleButton .dijitToggleButtonIconChar {
- display:inline !important;
- visibility:hidden;
-}
-.dj_ie6 .dijitToggleButtonIconChar, .dj_ie6 .tabStripButton .dijitButtonText {
- font-family: "Arial Unicode MS";
-}
-.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
- display: inline !important;
- visibility:visible !important;
-}
-.dijitArrowButtonChar {
- display:none !important;
-}
-.dijit_a11y .dijitArrowButtonChar {
- display:inline !important;
-}
-.dijit_a11y .dijitDropDownButton .dijitArrowButtonInner,
-.dijit_a11y .dijitComboButton .dijitArrowButtonInner {
- display:none !important;
-}
-.dijitSelect {
- margin: 0.2em;
- border-collapse: collapse;
-}
-.dj_ie .dijitSelect,
-.dj_ie7 .dijitSelect,
-.dj_iequirks .dijitSelect {
- vertical-align: middle;
-}
-.dj_ie8 .dijitSelect .dijitButtonText {
- vertical-align: top;
-}
-.dijitToolbar .dijitSelect {
- margin: 0;
-}
-.dj_webkit .dijitToolbar .dijitSelect {
- padding-left: 0.3em;
-}
-.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
-.dijitSelect .dijitButtonContents {
- padding: 0px;
- background: transparent none;
- white-space: nowrap;
- text-align: left;
-}
-.dijitSelectFixedWidth .dijitButtonContents {
- width: 100%;
-}
-.dijitSelectMenu .dijitMenuItemIcon {
-
- display:none;
-}
-.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
-.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
-
- position: static;
-}
-.dijitSelectLabel *
-{
- vertical-align: baseline;
-}
-.dijitSelectSelectedOption * {
- font-weight: bold;
-}
-.dijitSelectMenu {
- border-width: 1px;
-}
-.dijitSelectMenu .dijitMenuTable {
- margin: 0px;
- background-color: transparent;
-}
-.dijitForceStatic {
- position: static !important;
-}
-.dijitReadOnly *,
-.dijitDisabled *,
-.dijitReadOnly,
-.dijitDisabled {
-
- cursor: default;
-}
-.dijitIconSave,
-.dijitIconPrint,
-.dijitIconCut,
-.dijitIconCopy,
-.dijitIconClear,
-.dijitIconDelete,
-.dijitIconUndo,
-.dijitIconEdit,
-.dijitIconNewTask,
-.dijitIconEditTask,
-.dijitIconEditProperty,
-.dijitIconTask,
-.dijitIconFilter,
-.dijitIconConfigure,
-.dijitIconSearch,
-.dijitIconApplication,
-.dijitIconBookmark,
-.dijitIconChart,
-.dijitIconConnector,
-.dijitIconDatabase,
-.dijitIconDocuments,
-.dijitIconMail,
-.dijitLeaf,
-.dijitIconFile,
-.dijitIconFunction,
-.dijitIconKey,
-.dijitIconPackage,
-.dijitIconSample,
-.dijitIconTable,
-.dijitIconUsers,
-.dijitFolderClosed,
-.dijitIconFolderClosed,
-.dijitFolderOpened,
-.dijitIconFolderOpen,
-.dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActEnabled.png);
- width: 16px;
- height: 16px;
-}
-.dj_ie6 .dijitIconSave,
-.dj_ie6 .dijitIconPrint,
-.dj_ie6 .dijitIconCut,
-.dj_ie6 .dijitIconCopy,
-.dj_ie6 .dijitIconClear,
-.dj_ie6 .dijitIconDelete,
-.dj_ie6 .dijitIconUndo,
-.dj_ie6 .dijitIconEdit,
-.dj_ie6 .dijitIconNewTask,
-.dj_ie6 .dijitIconEditTask,
-.dj_ie6 .dijitIconEditProperty,
-.dj_ie6 .dijitIconTask,
-.dj_ie6 .dijitIconFilter,
-.dj_ie6 .dijitIconConfigure,
-.dj_ie6 .dijitIconSearch,
-.dj_ie6 .dijitIconApplication,
-.dj_ie6 .dijitIconBookmark,
-.dj_ie6 .dijitIconChart,
-.dj_ie6 .dijitIconConnector,
-.dj_ie6 .dijitIconDatabase,
-.dj_ie6 .dijitIconDocuments,
-.dj_ie6 .dijitIconMail,
-.dj_ie6 .dijitLeaf,
-.dj_ie6 .dijitIconFile,
-.dj_ie6 .dijitIconFunction,
-.dj_ie6 .dijitIconKey,
-.dj_ie6 .dijitIconPackage,
-.dj_ie6 .dijitIconSample,
-.dj_ie6 .dijitIconTable,
-.dj_ie6 .dijitIconUsers,
-.dj_ie6 .dijitFolderClosed,
-.dj_ie6 .dijitIconFolderClosed,
-.dj_ie6 .dijitFolderOpened,
-.dj_ie6 .dijitIconFolderOpen,
-.dj_ie6 .dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActEnabled8bit.png);
-}
-.dijitDisabled .dijitIconSave,
-.dijitDisabled .dijitIconPrint,
-.dijitDisabled .dijitIconCut,
-.dijitDisabled .dijitIconCopy,
-.dijitDisabled .dijitIconClear,
-.dijitDisabled .dijitIconDelete,
-.dijitDisabled .dijitIconUndo,
-.dijitDisabled .dijitIconEdit,
-.dijitDisabled .dijitIconNewTask,
-.dijitDisabled .dijitIconEditTask,
-.dijitDisabled .dijitIconEditProperty,
-.dijitDisabled .dijitIconTask,
-.dijitDisabled .dijitIconFilter,
-.dijitDisabled .dijitIconConfigure,
-.dijitDisabled .dijitIconSearch,
-.dijitDisabled .dijitIconApplication,
-.dijitDisabled .dijitIconBookmark,
-.dijitDisabled .dijitIconChart,
-.dijitDisabled .dijitIconConnector,
-.dijitDisabled .dijitIconDatabase,
-.dijitDisabled .dijitIconDocuments,
-.dijitDisabled .dijitIconMail,
-.dijitDisabled .dijitLeaf,
-.dijitDisabled .dijitIconFile,
-.dijitDisabled .dijitIconFunction,
-.dijitDisabled .dijitIconKey,
-.dijitDisabled .dijitIconPackage,
-.dijitDisabled .dijitIconSample,
-.dijitDisabled .dijitIconTable,
-.dijitDisabled .dijitIconUsers,
-.dijitDisabled .dijitFolderClosed,
-.dijitDisabled .dijitIconFolderClosed,
-.dijitDisabled .dijitFolderOpened,
-.dijitDisabled .dijitIconFolderOpen,
-.dijitDisabled .dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActDisabled.png);
-}
-.dijitIconSave { background-position: 0px; }
-.dijitIconPrint { background-position: -16px; }
-.dijitIconCut { background-position: -32px; }
-.dijitIconCopy { background-position: -48px; }
-.dijitIconClear { background-position: -64px; }
-.dijitIconDelete { background-position: -80px; }
-.dijitIconUndo { background-position: -96px; }
-.dijitIconEdit { background-position: -112px; }
-.dijitIconNewTask { background-position: -128px; }
-.dijitIconEditTask { background-position: -144px; }
-.dijitIconEditProperty { background-position: -166px; }
-.dijitIconTask { background-position: -176px; }
-.dijitIconFilter { background-position: -192px; }
-.dijitIconConfigure { background-position: -208px; }
-.dijitIconSearch { background-position: -224px; }
-.dijitIconError { background-position: -496px; }
-.dijitIconApplication { background-position: -240px; }
-.dijitIconBookmark { background-position: -256px; }
-.dijitIconChart { background-position: -272px; }
-.dijitIconConnector { background-position: -288px; }
-.dijitIconDatabase { background-position: -304px; }
-.dijitIconDocuments { background-position: -320px; }
-.dijitIconMail { background-position: -336px; }
-.dijitIconFile, .dijitLeaf { background-position: -352px; }
-.dijitIconFunction { background-position: -368px; }
-.dijitIconKey { background-position: -384px; }
-.dijitIconPackage{ background-position: -400px; }
-.dijitIconSample { background-position: -416px; }
-.dijitIconTable { background-position: -432px; }
-.dijitIconUsers { background-position: -448px; }
-.dijitIconFolderClosed, .dijitFolderClosed { background-position: -464px; }
-.dijitIconFolderOpen, .dijitFolderOpened { background-position: -480px; }
-.soria .dojoDndItemBefore {
- border-top: 2px solid #369;
-}
-.soria .dojoDndItemAfter {
- border-bottom: 2px solid #369;
-}
-.soria .dojoDndItemOver {
- cursor:pointer;
-}
-.soria table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
-.soria .dojoDndAvatar td { border: none; }
-.soria .dojoDndAvatar tr { border: none; }
-.soria .dojoDndAvatarHeader td { height: 20px; padding: 0 0 0 21px; }
-.soria .dojoDndAvatarItem td { padding: 2px;}
-.soria.dojoDndMove .dojoDndAvatarHeader {background-color: #f58383; background-image: url(images/dndNoMove.png); background-repeat: no-repeat; background-position: 2px center;}
-.soria.dojoDndCopy .dojoDndAvatarHeader {background-color: #f58383; background-image: url(images/dndNoCopy.png); background-repeat: no-repeat; background-position: 2px center;}
-.soria.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader {background-color: #97e68d; background-image: url(images/dndMove.png); background-repeat: no-repeat; background-position: 2px center;}
-.soria.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader {background-color: #97e68d; background-image: url(images/dndCopy.png); background-repeat: no-repeat; background-position: 2px center;}
-.soria .dijitContentPane {
- padding: 0px;
-}
-.soria .dijitTabContainerTop-dijitContentPane,
-.soria .dijitTabContainerLeft-dijitContentPane,
-.soria .dijitTabContainerBottom-dijitContentPane,
-.soria .dijitTabContainerRight-dijitContentPane,
-.soria .dijitAccordionContainer-dijitContentPane {
- background-color: #fff;
- padding: 5px;
-}
-.soria .dijitSplitContainer-dijitContentPane,
-.soria .dijitBorderContainer-dijitContentPane {
- background-color: #fff;
- padding: 5px;
-}
- .soria .dijitTabContainer .tabStripRBtn {
- margin-right: 21px;
-}
- .soria .dijitTabContainer .tabStripLBtn {
- margin-left: 21px;
-}
- .soria .nowrapTabStrip .dijitTab {
- top: 2px;
-}
- .soria .dijitTabContainerBottom-tabs .dijitTab {
- top: -1px;
- bottom: 2px;
-}
-.soria .dijitTabPaneWrapper {
- background:#fff;
- border:1px solid #B1BADF;
- margin: 0;
- padding-left: 0px;
-}
-.soria .dijitTabInnerDiv {
- padding:0px 3px 0px 0px;
- margin: 0 0 0 4px;
- background: url(images/tabContainerSprite.gif) no-repeat;
- background-position: right -400px;
-}
-.soria .dijitTab {
- line-height:normal;
- margin:0 2px 0 0;
- padding:0px;
- background: url(images/tabContainerSprite.gif) no-repeat 0 -300px;
- color: #243C5F;
- border-bottom: 1px #B1BADF solid;
-}
-.soria .dijitTabInnerDiv .dijitTabContent {
- padding:4px 3px 2px 4px;
- background: url(images/tabContainerSprite.gif) repeat-x 0 -350px;
- position: relative;
-}
-.soria .dijitTabListWrapper {
- z-index: 10;
-}
-.soria .dijitTabHover {
- color: #243C5F;
- background: url(images/tabContainerSprite.gif) no-repeat 0px -150px;
-}
-.soria .dijitTabHover .dijitTabInnerDiv {
- background: url(images/tabContainerSprite.gif) no-repeat right -250px;
-}
-.soria .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
- background: url(images/tabContainerSprite.gif) repeat-x 0 -200px;
-}
-.soria .dijitTabChecked
-{
-
- background: url(images/tabContainerSprite.gif) no-repeat 0px -0px;
-}
-.soria .dijitTabChecked .dijitTabInnerDiv {
- background: url(images/tabContainerSprite.gif) no-repeat right -100px;
-}
-.soria .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
- background: url(images/tabContainerSprite.gif) repeat-x 0 -50px;
- color: #243C5F !important;
-}
-.soria .dijitTabContainerTabListNested {
- background: #F0F4FC;
- background: #D9E9F9;
- border: none;
-}
-.soria .dijitTabContainerTabListNested .dijitTab {
- background: none;
- border: none;
- top: 0px;
-}
-.soria .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv,
-.soria .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
- background: none;
-}
-.soria .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent .tabLabel {
- text-decoration: underline;
-}
-.soria .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
- text-decoration: underline;
- font-weight: bold;
-}
-.soria .dijitTabContainerSpacerNested .dijitTabSpacer {
-
- height: 0px;
-}
-.soria .dijitTabPaneWrapperNested {
- border: none;
-}
-.soria .dijitTabCloseButton {
- width: 15px;
- height: 15px;
- background: url(images/spriteRoundedIconsSmall.png) no-repeat -60px top;
- margin-top: -1px;
-}
-.dj_ie6 .soria .dijitTabCloseButton {
- background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px top;
-}
-.soria .dijitTabCloseButtonHover {
- background: url(images/spriteRoundedIconsSmall.png) no-repeat -60px -15px;
-}
-.dj_ie6 .soria .dijitTabCloseButtonHover {
- background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px -15px;
-}
-.soria .dijitTab .tabLabel {
-
- min-height: 15px;
- display: inline-block;
-}
-.dj_ie6 .soria .dijitTabButtonIcon {
-
- height: 18px;
- width: 1px;
-}
-.soria .dijitTabContainerTop-tabs {
- border-color: #B1BADF;
- padding-left: 3px;
-}
-.soria .dijitTabContainerTopNoStrip {
- padding-top: 3px;
-}
-.soria .dijitTabContainerTop-container {
- border-top: none;
-}
-.soria .dijitTabContainerTop .dijitTabListWrapper {
- border-bottom: none;
-}
-.soria .dijitTabContainerTop-tabs .dijitTab {
- top: 1px;
-}
-.soria .dijitTabContainerTop-tabs .dijitTabChecked {
- border-bottom-color: #94b4e6;
-}
-.soria .dijitTabContainerTopStrip {
- border: 1px solid #B1BADF;
- margin-top: 1px;
- padding-top: 1px;
- background: #F0F4FC;
-}
-.soria .dijitTabContainerTopStrip .dijitTabContainerTop-tabs {
- padding-left: 3px;
-}
-.soria .dijitTabContainerNested .dijitTabListWrapper {
- height: auto;
-}
-.soria .dijitTabContainerBottom-tabs {
- margin-top: -1px;
- padding-left: 3px;
- border-top: 1px solid #B1BADF;
-}
-.soria .dijitTabContainerBottom .dijitTabListWrapper {
- border-top: none;
- padding-top: 1px;
- padding-bottom: 1px;
- float: left;
-}
-.soria .dijitTabContainerBottom-container {
- border-bottom: none;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTab {
- border-bottom: none;
- border-top: 1px solid #B1BADF;
- background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom left;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabChecked {
- border-top-color:#94b4e6;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
- padding-top: 3px;
- padding-bottom: 3px;
- background: url(images/tabBottomEnabledC.gif) repeat-x bottom left;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom right;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabHover {
- color: #243C5F;
- background: url(images/tabBottomHoverSpriteLR.gif) no-repeat bottom left;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv {
- background: url(images/tabBottomHoverSpriteLR.gif) no-repeat bottom right;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
- background: url(images/tabBottomHoverC.gif) repeat-x bottom left;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabChecked {
-
- background: url(images/tabBottomActiveSpriteLR.gif) no-repeat bottom left;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
- background: url(images/tabBottomActiveSpriteLR.gif) no-repeat bottom right;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
- background: url(images/tabBottomActiveC.gif) repeat-x bottom left;
-}
-.soria .dijitTabContainerBottomStrip {
- padding-bottom: 2px;
- border: 1px solid #B1BADF;
-}
-.soria .dijitTabContainerBottomStrip {
- background: #F0F4FC;
-}
-.soria .dijitTabContainerBottom-spacer,
-.soria .dijitTabContainerTop-spacer {
- height: 2px;
- border: 1px solid #8ba0bd;
- background: #94b4e6;
-}
-.soria .dijitTabContainerTop-spacer {
- border-top: none;
-}
-.soria .dijitTabContainerBottom-spacer {
- border-bottom: none;
-}
-.soria .dijitTabContainerRight-tabs {
- height: 100%;
- border-color: #ccc;
- padding-top: 3px;
-}
-.soria .dijitTabContainerRight-container {
- border-right: none;
-}
-.soria .dijitTabContainerRight-tabs .dijitTab {
- border-bottom: none;
- border-left: 1px solid #B1BADF;
- border-bottom: 1px solid #B1BADF !important;
-}
-.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv {
- border-bottom: solid #B1BADF 1px;
- margin-bottom: -1px;
-}
-.soria .dijitTabContainerRight-tabs .dijitTabChecked {
- border-left-color: #94b4e6;
-}
-.soria .dijitTabContainerRight-tabs .dijitTabChecked {
- background: url(images/tabRightChecked.gif) no-repeat left top !important;
-}
-.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
- border-bottom: solid #94b4e6 1px;
- margin-bottom: -1px;
-}
-.soria .dijitTabContainerRight-tabs .dijitTab {
- background: url(images/tabContainerSprite.gif) no-repeat left -350px;
-}
-.soria .dijitTabContainerRight-tabs .dijitTabHover .dijitTab {
- background: url(images/tabContainerSprite.gif) no-repeat left -200px;
-}
-.soria .dijitTabContainerRightStrip {
- padding-right: 2px;
- border: 1px solid #B1BADF;
- background: #F0F4FC;
- border-left: none;
-}
-.soria .dijitTabContainerLeft-tabs {
- border-color: #ccc;
- padding-top: 3px;
- height: 100%;
-}
-.soria .dijitTabContainerLeft-container {
- border-left: none;
-}
-.soria .dijitTabContainerLeft-tabs .dijitTab {
- border-right: 1px solid #B1BADF;
- border-bottom: 1px solid #B1BADF;
-}
-.soria .dijitTabContainerLeft-tabs .dijitTabChecked {
- border-right: 1px solid #94b4e6;
-}
-.soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background: url(images/tabContainerSprite.gif) no-repeat right -350px;
-}
-.soria .dijitTabContainerLeft-tabs .dijitTabHover .dijitTabInnerDiv {
- background: url(images/tabContainerSprite.gif) no-repeat right -200px;
-}
-.soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
- background: url(images/tabLeftChecked.gif) no-repeat right top;
-}
-.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- border-bottom: solid #B1BADF 1px;
- margin-bottom: -1px;
-}
-.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
- border-bottom: solid #94b4e6 1px;
- margin-bottom: -1px;
-}
-.soria .dijitTabContainerLeftStrip {
- padding-left: 2px;
- border: 1px solid #B1BADF;
- background: #F0F4FC;
- border-right: none;
-}
-.soria .dijitTabContainerLeft-tabs .dijitTab,
-.soria .dijitTabContainerRight-tabs .dijitTab {
- margin-right:auto;
- margin-bottom:2px;
-}
-.soria .dijitTabContainerLeft-spacer,
-.soria .dijitTabContainerRight-spacer {
- width: 2px;
- border: 1px solid #8ba0bd;
- background: #94b4e6;
-}
-.soria .dijitTabContainerLeft-spacer {
- border-left: none;
-}
-.soria .dijitTabContainerRight-spacer {
- border-right: none;
-}
-.soria .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
- border-left: 0px solid #ccc;
- border-top: 0px solid #ccc;
- border-right: 0px solid #ccc;
- padding-top: 0px;
- padding-left: 0px;
-}
-.soria .dijitTabContainer .tabStripButton {
- margin-right: 0;
-}
-.soria .dijitTabContainer .tabStripButton-top {
- margin-top: 1px;
-}
-.soria .tabStripButton .dijitTabContent{
- padding: 6px 0 5px 0;
-}
-.dj_ie6 .soria .tabStripButton .dijitTabContent,
-.dj_ie7 .soria .tabStripButton .dijitTabContent {
- padding-top: 7px;
-}
-.soria .tabStrip-disabled .tabStripButton .dijitTabContent {
- padding: 5px 0 3px 0;
-}
-.dj_ie6 .soria .tabStrip-disabled .tabStripButton .dijitTabContent,
-.dj_ie7 .soria .tabStrip-disabled .tabStripButton .dijitTabContent {
- padding-top: 6px;
-}
-.soria .dijitTabContainer .tabStripButton-bottom {
- background: transparent url(images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
- border-bottom: medium none;
- border-top: 1px solid #B1BADF;
-}
-.soria .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
- background: transparent url(images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
-}
-.soria .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
- background: transparent;
-}
-.soria .dijitTabStripIcon {
- height: 14px;
- width: 14px;
- background: url(images/spriteRoundedIconsSmall.png) no-repeat left top ;
-}
-.dj_ie6 .soria .dijitTabStripIcon {
- background-image: url(images/spriteRoundedIconsSmall.gif);
-}
-.soria .dijitTabStripSlideRightIcon {
- background-position: -30px top;
-}
-.soria .dijitTabStripMenuIcon {
- background-position: -15px top;
-}
-.soria .dijitAccordionContainer {
- border-color: #b1badf;
- background-color: #fff;
-}
-.soria .dijitAccordionTitle {
- background:#fafafa url(images/titleBar.png) repeat-x top left;
- border-top: 1px solid #b9bbdd;
- padding: 5px 4px 6px 8px;
- font-size: 0.9em;
- font-weight: bold;
- color: #373941;
-}
-.soria .dijitAccordionTitleSelected {
- background: #f9f9f9 url(images/accordionItemActive.png) top repeat-x;
- font-weight: bold;
- border-top: 1px solid #b9bbdd;
- border-bottom: 1px solid #b9bbdd;
- padding: 5px 4px 5px 8px;
- color: #243C5F;
-}
-.soria .dijitAccordionArrow {
- background:url(images/spriteRoundedIconsSmallBl.gif) no-repeat -30px top;
- width:15px;
- height:15px;
- margin-top:-1px;
-}
-.soria .dijitAccordionTitleSelected .dijitAccordionArrow {
- background:url(images/spriteRoundedIconsSmallBl.gif) no-repeat -15px top;
- margin-top:-1px;
-}
-.soria .dijitAccordionText {
- margin-left: 4px;
- margin-right: 4px;
-}
-.soria .dijitSplitContainerSizerH {
- background:url(images/splitContainerSizerV.png) repeat-y #cddef4;
- border:0;
- border-left:0px solid #436496;
- border-right:0px solid #436496;
- width:5px;
-}
-.soria .dijitSplitContainerSizerH .thumb {
- background:url(images/splitContainerSizerV-thumb.png) no-repeat #ccc;
- left:1px;
- width:2px;
- height:19px;
-}
-.soria .dijitSplitContainerSizerV {
- background:url(images/splitContainerSizerH.png) repeat-x #cddef4;
- border:0;
- border-top:0px solid #436496;
- border-bottom:0px solid #436496;
- height:2px;
-}
-.soria .dijitSplitContainerSizerV .thumb {
- background:url(images/splitContainerSizerH-thumb.png) no-repeat #ccc;
- top:1px;
- width:19px;
- height:5px;
-}
-.soria .dijitBorderContainer {
- background-color: #e1ebfb;
- padding: 5px;
-}
-.soria .dijitSplitContainer-child,
-.soria .dijitBorderContainer-child {
-
- border: 1px #b1badf solid;
-}
-.soria .dijitBorderContainer-dijitTabContainerTop,
-.soria .dijitBorderContainer-dijitTabContainerBottom,
-.soria .dijitBorderContainer-dijitTabContainerLeft,
-.soria .dijitBorderContainer-dijitTabContainerRight {
-
- border: none;
-}
-.soria .dijitBorderContainer-dijitBorderContainer {
-
- border: none;
- padding: 0px;
-}
-.soria .dijitSplitterH,
-.soria .dijitGutterH {
- background: #E1EBFB;
- border:0;
- border-left:0px solid #d3d3d3;
- border-right:0px solid #d3d3d3;
- height:5px;
-}
-.soria .dijitSplitterH .dijitSplitterThumb {
- background:#B0B0B0 none;
- height:1px;
- top:2px;
- width:19px;
-}
-.soria .dijitSplitterV,
-.soria .dijitGutterV {
- background: #E1EBFB;
- border:0;
- border-top:0px solid #d3d3d3;
- border-bottom:0px solid #d3d3d3;
- width:5px;
-}
-.soria .dijitSplitterV .dijitSplitterThumb {
- background:#B0B0B0 none;
- height:19px;
- left:2px;
- width:1px;
-}
-.soria .dijitSplitterActive {
- font-size: 1px;
- background-image: none;
- background-color: #aaa;
- -moz-opacity: 0.6;
- opacity: 0.6;
- filter: Alpha(Opacity=60);
- margin: 0;
-}
-.soria .dijitInputContainer INPUT,
-.soria .dijitTextBox {
- margin: 0em 0.1em;
-}
-.soria .dijitTextBox,
-.soria .dijitTextArea {
-
- background:#fff url(images/validationInputBg.png) repeat-x top left;
- #background:#fff url(images/validationInputBg.gif) repeat-x top left;
- border:1px solid #8ba0bd;
-}
-.soria .dijitComboBox .dijitButtonNode {
- padding: 0 0.2em;
-}
-.soria .dijitTextBox .dijitButtonNode {
-
- border-color: #8ba0bd;
-}
-.soria .dijitTextBoxFocused,
-.soria .dijitTextAreaFocused {
-
- border-color:#406b9b;
-}
-.soria .dijitTextBoxFocused .dijitButtonNode,
-.soria .dijitSpinner .dijitUpArrowButtonActive,
-.soria .dijitSpinner .dijitDownArrowButtonActive {
- border-left-color:#8ba0bd;
-}
-.soria .dijitSpinnerFocused .dijitDownArrowButton,
-.soria .dijitSpinner .dijitUpArrowButtonActive,
-.soria .dijitSpinner .dijitDownArrowButtonActive {
- border-top-color:#8ba0bd;
-}
-.soria .dijitError {
- border-color:#f3d118;
- background-color:#f9f7ba;
- background-image:none;
-}
-.soria .dijitErrorFocused {
- background-color:#ff6;
- background-image:none;
-}
-.soria .dijitValidationIcon {
-
- width: 16px;
- background: transparent url(images/warning.png) no-repeat center center;
-}
-.soria .dijitComboBoxHighlightMatch {
- background-color:#f9f7ba;
-}
-.soria .dijitButtonNode {
-
- border: 1px solid #8ba0bd;
- border-bottom:1px solid #657c9c;
- padding: 0.1em 0.2em 0.2em 0.2em;
- background: #bcd5f0 url(images/buttonEnabled.png) repeat-x top left;
-}
-.soria .dijitSelect .dijitButtonContents {
- border-right: none;
-}
-.soria .dijitButtonText {
- text-align: center;
- padding: 0 0.3em;
-}
-.soria .dijitArrowButton {
- color: #111;
-}
-.soria .dijitComboButton .dijitDownArrowButton {
- padding-right:4px;
-}
-.soria .dijitTextBoxReadOnly,
-.soria .dijitTextBoxReadOnly .dijitButtonNode,
-.soria .dijitButtonDisabled .dijitButtonNode,
-.soria .dijitToggleButtonDisabled .dijitButtonNode,
-.soria .dijitDropDownButtonDisabled .dijitButtonNode,
-.soria .dijitComboButtonDisabled .dijitButtonNode,
-.soria .dijitTextBoxDisabled,
-.soria .dijitTextBoxDisabled .dijitButtonNode {
-
- border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
- 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 .dijitComboButtonDisabled .dijitButtonText,
-.dj_ie7 .soria .dijitComboButtonDisabled .dijitButtonText {
-
- color: #aaa;
-}
-.soria .dijitButtonHover .dijitButtonNode,
-.soria .dijitButtonNodeHover,
-.soria .dijitToggleButtonHover .dijitButtonNode,
-.soria .dijitDropDownButtonHover .dijitButtonNode,
-.soria .dijitButtonContentsHover,
-.soria .dijitUpArrowButtonHover,
-.soria .dijitDownArrowButtonHover {
-
-
- color:#243C5F;
- background:#acc5e2 url(images/buttonHover.png) repeat-x top left;
-}
-.soria .dijitButtonActive .dijitButtonNode,
-.soria .dijitToggleButtonActive .dijitButtonNode,
-.soria .dijitDropDownButtonActive .dijitButtonNode,
-.soria .dijitComboButtonActive .dijitButtonContents,
-.soria .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
-
- border-color:#657c9c;
- background: #91b4e5 url(images/buttonActive.png) top left repeat-x;
-}
-.soria .dijitUpArrowButtonActive,
-.soria .dijitDownArrowButtonActive {
-
- background: #91b4e5 url(images/buttonActive.png) top left repeat-x;
-}
-.soria .dijitArrowButtonInner {
- background-image: url(images/spriteArrows.png);
- background-repeat: no-repeat;
- background-position: 0px center;
- width: 11px;
- height: 11px;
-}
-.soria .dijitComboBox .dijitArrowButtonInner {
- background-position: 0 center;
-}
-.soria .dijitLeftArrowButton .dijitArrowButtonInner {
- background-position: -11px center;
-}
-.soria .dijitUpArrowButton .dijitArrowButtonInner {
- background-position: -22px center;
-}
-.soria .dijitRightArrowButton .dijitArrowButtonInner {
- background-position: -33px center;
-}
-.dj_ie6 .soria .dijitArrowButtonInner {
- background-image: url(images/spriteArrows.gif);
-}
-.dj_ie .soria .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: 1px;
-}
-.soria .dijitSpinnerButtonContainer {
- width: auto;
- padding: 0;
-}
-.soria .dijitSpinner .dijitArrowButton {
- width: 15px;
-}
-.soria .dijitSpinner .dijitSpinnerButtonInner {
- width: 15px;
-}
-.soria .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding: 0;
-}
-.soria .dijitToggleButton .dijitCheckBox,
-.soria .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url(images/spriteCheckbox.gif);
-}
-.soria .dijitCheckBox,
-.soria .dijitCheckBoxIcon {
- background-image: url(images/spriteCheckbox.gif);
- background-repeat: no-repeat;
- width: 16px;
- height: 16px;
- margin: 0;
- padding: 0;
-}
-.soria .dijitCheckBox,
-.soria .dijitToggleButton .dijitCheckBoxIcon {
-
- background-position: -16px;
-}
-.soria .dijitCheckBoxChecked,
-.soria .dijitToggleButtonChecked .dijitCheckBoxIcon {
-
- background-position: 0px;
-}
-.soria .dijitCheckBoxDisabled {
-
- background-position: -48px;
-}
-.soria .dijitCheckBoxCheckedDisabled {
-
- background-position: -32px;
-}
-.soria .dijitCheckBoxHover {
-
- background-position: -80px;
-}
-.soria .dijitCheckBoxCheckedHover {
-
- background-position: -64px;
-}
-.soria .dijitToggleButton .dijitRadio,
-.soria .dijitToggleButton .dijitRadioIcon {
- background-image: url(images/spriteRadio.gif);
-}
-.soria .dijitRadio,
-.soria .dijitRadioIcon {
- background-image: url(images/spriteRadio.gif);
- background-repeat: no-repeat;
- width: 16px;
- height: 16px;
- margin: 0;
- padding: 0;
-}
-.soria .dijitRadio,
-.soria .dijitToggleButton .dijitRadioIcon {
-
- background-position: -16px;
-}
-.soria .dijitRadioChecked,
-.soria .dijitToggleButtonChecked .dijitRadioIcon {
-
- background-position: 0px;
-}
-.soria .dijitRadioDisabled {
-
- background-position: -48px;
-}
-.soria .dijitRadioCheckedDisabled {
-
- background-position: -32px;
-}
-.soria .dijitRadioHover {
-
- background-position: -80px;
-}
-.soria .dijitRadioCheckedHover {
-
- background-position: -64px;
-}
-.soria .dijitSliderProgressBarH {
- border-color: #b1badf;
- background: #c0c2c5 url(images/sliderFull.png) repeat-x top left;
-}
-.soria .dijitSliderProgressBarV {
- border-color: #b1badf;
- background: #c0c2c5 url(images/sliderFullVertical.png) repeat-y bottom left;
-}
-.soria .dijitSliderFocused .dijitSliderProgressBarH,
-.soria .dijitSliderFocused .dijitSliderLeftBumper {
- background-image:url(images/sliderFullFocus.png);
-}
-.soria .dijitSliderFocused .dijitSliderProgressBarV,
-.soria .dijitSliderFocused .dijitSliderBottomBumper {
- background-image:url(images/sliderFullVerticalFocus.png);
-}
-.soria .dijitSliderRemainingBarV {
- border-color: #b4b4b4;
- background: #dcdcdc url(images/sliderEmptyVertical.png) repeat-y bottom left;
-}
-.soria .dijitSliderRemainingBarH {
- border-color: #b4b4b4;
- background: #dcdcdc url(images/sliderEmpty.png) repeat-x top left;
-}
-.soria .dijitSliderBar {
- border-style: solid;
- outline:1px;
-
-}
-.soria .dijitSliderFocused .dijitSliderBar {
- border-color:#8ba0bd;
-}
-.soria .dijitSliderImageHandleH {
- border:0px;
- width:15px;
- height:18px;
- background:url(images/preciseSliderThumb.png) no-repeat center top;
-}
-.soria .dijitSliderFocused .dijitSliderImageHandleH {
- background-image:url(images/preciseSliderThumbFocus.png);
- #background-image:url(images/preciseSliderThumbFocus.gif);
-}
-.dj_ie6 .soria .dijitSliderImageHandleH {
- background-image:url(images/preciseSliderThumb.gif);
-}
-.soria .dijitSliderLeftBumper {
- border-left-width: 1px;
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFull.png) repeat-x top left;
-}
-.soria .dijitSliderRightBumper {
- background: #dcdcdc url(images/sliderEmpty.png) repeat-x top left;
- border-color: #b4b4b4;
- border-right-width: 1px;
-}
-.soria .dijitSliderImageHandleV {
- border:0px;
- width:20px;
- height:15px;
- background:url(images/sliderThumb.png) no-repeat center center;
- #background:url(images/sliderThumb.gif) no-repeat center center;
-}
-.soria .dijitSliderFocused .dijitSliderImageHandleV {
- background-image:url(images/sliderThumbFocus.png);
- #background-image:url(images/sliderThumbFocus.gif);
-}
-.soria .dijitSliderBottomBumper {
- border-bottom-width: 1px;
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFullVertical.png) repeat-y bottom left;
-}
-.soria .dijitSliderTopBumper {
- background: #dcdcdc url(images/sliderEmptyVertical.png) repeat-y top left;
- border-color: #b4b4b4;
- border-top-width: 1px;
-}
-.soria .dijitSliderIncrementIconH,
-.soria .dijitSliderIncrementIconV {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -45px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat -45px top;
- width:15px; height:15px;
-}
-.soria .dijitSliderIncrementIconH {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat -30px top;
-}
-.soria .dijitSliderDecrementIconH,
-.soria .dijitSliderDecrementIconV {
- width:15px;
- height:15px;
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -15px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat -15px top;
-}
-.soria .dijitSliderDecrementIconH {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat 0px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat 0px top;
-}
-.soria .dijitSliderButtonInner {
- visibility:hidden;
-}
-.soria .dijitSliderReadOnly *,
-.soria .dijitSliderDisabled * {
- border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
- color: #bdbdbd;
-}
-.soria .dijitSliderReadOnly .dijitSliderDecrementIconH,
-.soria .dijitSliderDisabled .dijitSliderDecrementIconH {
- background-position: 0px -15px;
-}
-.soria .dijitSliderReadOnly .dijitSliderIncrementIconH,
-.soria .dijitSliderDisabled .dijitSliderIncrementIconH {
- background-position: -30px -15px;
-}
-.soria .dijitSliderReadOnly .dijitSliderDecrementIconV,
-.soria .dijitSliderDisabled .dijitSliderDecrementIconV {
- background-position: -15px -15px;
-}
-.soria .dijitSliderReadOnly .dijitSliderIncrementIconV,
-.soria .dijitSliderDisabled .dijitSliderIncrementIconV {
- background-position: -45px -15px;
-}
-.soria .dijitSelect .dijitButtonNode {
- padding: 0px;
-}
-.soria .dijitSelect .dijitButtonContents {
- padding-top: 1px;
- background:#fff url(images/validationInputBg.png) repeat-x top left;
- #background:#fff url(images/validationInputBg.gif) repeat-x top left;
-}
-.soria .dijitSelectHover .dijitButtonContents,
-.soria .dijitSelectActive .dijitButtonContents,
-.soria .dijitSelectOpened .dijitButtonContents,
-.soria .dijitSelectDisabled .dijitButtonContents,
-.soria .dijitSelectReadOnly .dijitButtonContents{
- background: transparent none;
-}
-.dj_ie .soria .dijitSelect .dijitButtonContents {
- padding-top: 0px;
-}
-.soria .dijitSelect .dijitArrowButton {
- padding: 0px 2px;
-}
-.soria .dijitSelectDisabled .dijitButtonNode {
- border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
- background:#c3d3e5 url(images/buttonDisabled.png) top repeat-x;
-}
-.dj_ie .soria .dijitSelectDisabled .dijitButtonNode * {
- filter: gray() alpha(opacity=50);
-}
-.soria .dijitSelectHover .dijitButtonNode {
- color:#000;
- background:#acc5e2 url(images/buttonHover.png) repeat-x top left;
-}
-.soria .dijitSelectActive .dijitButtonNode,
-.soria .dijitSelectOpened .dijitButtonNode {
- border-color:#657c9c;
- background: #91b4e5 url(images/buttonActive.png) top left repeat-x;
-}
-.soria .dijitSelectMenu td {
- padding: 0em;
-}
-.soria .dijitSelectMenu .dijitMenuItemLabel,
-.soria .dijitSelectMenu .dijitMenuArrowCell {
- padding: 0.1em 0.2em;
-}
-.soria .dijitTreeNode {
- background : url(images/treeI.gif) no-repeat;
- background-position : top left;
- background-repeat : repeat-y;
- zoom: 1;
-}
-.soria .dijitTreeRowHover {
-
- background-image: url(images/treeHover.png);
- background-repeat: repeat;
- background-color: transparent !important;
-}
-.soria .dijitTreeIsLast {
- background: url(images/treeI_half.gif) no-repeat;
-}
-.soria .dijitTreeLabel {
- font-weight: normal;
- margin-left: 3px;
-}
-.soria .dijitTreeIsRoot {
- margin-left: 0;
- background-image: none;
-}
-.soria .dijitTreeExpando {
- width: 18px;
- height: 18px;
-}
-.soria .dijitTreeRow {
-
- padding-bottom: 2px;
-}
-.soria .dijitTreeContent {
- min-height: 18px;
- min-width: 18px;
- padding-left:1px;
-}
-.soria .dijitTreeRowSelected .dijitTreeLabel{
- background:#b8cbec;
-}
-.soria .dijitTreeExpandoOpened {
- background: url(images/spriteTree.gif) no-repeat -18px top;
-}
-.soria .dijitTreeExpandoClosed {
- background-image: url(images/spriteTree.gif);
-}
-.soria .dijitTreeExpandoLeaf {
- background: url(images/spriteTree.gif) no-repeat -36px top;
-}
-.soria .dijitTreeExpandoLoading {
- background-image: url(images/treeExpand_loading.gif);
-}
-.soria .dijitTreeIcon {
- width: 16px;
- height: 16px;
-}
-.soria .dijitFolderOpened {
- background: url(images/spriteDivIcons.gif) no-repeat -16px top;
-}
-.soria .dijitFolderClosed {
- background: url(images/spriteDivIcons.gif) no-repeat top left;
-}
-.soria .dijitLeaf {
- background: url(images/spriteDivIcons.gif) no-repeat -32px top;
-}
-.soria .dijitTreeNode .dojoDndItemBefore,
-.soria .dijitTreeNode .dojoDndItemAfter {
- border-bottom: none;
- border-top: none;
-}
-.soria .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
-
- border-top: 2px solid #369;
-}
-.soria .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
-
- border-bottom: 2px solid #369;
-}
-.soria .dijitProgressBar {
- margin:2px 0px 2px 0px;
-}
-.soria .dijitProgressBarEmpty{
-
- background:#fff url(images/progressBarEmpty.png) repeat-x center center;
- border-color: #8ba0bd;
-}
-.soria .dijitProgressBarTile{
-
- background:#f0f0f0 url(images/progressBarFull.png) repeat-x center center;
-}
-.soria .dijitProgressBarFull {
- border-right:1px solid #8ba0bd;
-}
-.soria .dijitProgressBarLabel {
-
- color:#293a4b;
-}
-.soria .dijitProgressBarIndeterminate .dijitProgressBarTile {
-
- background:#cad2de url(images/progressBarAnim.gif) repeat-x center center;
-}
-.soria .dijitTitlePaneTitle {
- background: #cccccc;
- background:#fff url(images/titleBar.png) repeat-x top left;
- border:1px solid #bfbfbf;
- padding:3px 4px;
- font-size: 0.9em;
- font-weight: bold;
- color: #6d6d6d;
-}
-.soria .dijitTitlePaneTitleHover {
- background: #f9f9f9 url(images/accordionItemActive.png) top repeat-x;
-}
-.soria .dijitTitlePaneTitle * {
- vertical-align: middle;
-}
-.soria .dijitTitlePane .dijitOpen .dijitArrowNode,
-.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
- width:15px;
- height:15px;
-}
-.soria .dijitTitlePaneTextNode {
- color: #243C5F;
-}
-.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
- background: url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
-}
-.dj_ie6 .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
- background:url(images/spriteRoundedIconsSmall.gif) no-repeat -30px top;
-}
-.soria .dijitTitlePane .dijitOpen .dijitArrowNode {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -15px top;
-}
-.dj_ie6 .soria .dijitTitlePane .dijitOpen .dijitArrowNode {
- background:url(images/spriteRoundedIconsSmall.gif) no-repeat -15px top;
-}
-.soria .dijitTitlePaneContentOuter {
- background: #ffffff;
- border: 1px solid #bfbfbf;
- border-top: 0px;
-}
-.soria .dijitTitlePaneContentInner {
- padding:10px;
-}
-.soria .dijitTitlePaneTextNode {
- margin-left: 4px;
- margin-right: 4px;
-}
-.soria .dijitCalendarIncrementControl {
-
- width:15px;
- height:15px;
- background-image: url(images/spriteRoundedIconsSmall.png);
- background-repeat: no-repeat;
-}
-.dj_ie6 .soria .dijitCalendarIncrementControl {
- font-size:.1em;
- background-image: url(images/spriteRoundedIconsSmall.gif);
-}
-.soria .dijitA11ySideArrow {
- display: none;
-}
-.soria .dijitCalendarDecrease {
- background-position: top left;
-}
-.soria .dijitCalendarIncrease {
- background-position: -30px top;
-}
-.soria table.dijitCalendarContainer {
- font-size: 100%;
- border-spacing: 0;
- border-collapse: separate;
- border: 1px solid #b1badf;
- margin: 0;
-}
-.soria .dijitCalendarMonthContainer th {
-
- background:#bed7f0 url(images/titleBar.png) repeat-x top;
- padding-top:.3em;
- padding-bottom:.2em;
- text-align:center;
-}
-.dj_ie6 .soria .dijitCalendarMonthContainer th {
- padding-top:.2em;
- padding-bottom:.1em;
-}
-.soria .dijitCalendarDayLabelTemplate {
-
- background:#bed7f0;
- font-weight:normal;
- padding-top:.15em;
- padding-bottom:.2em;
- border-bottom: 1px solid #b1badf;
- color:#293a4b;
- text-align:center;
-}
-.soria .dijitCalendarBodyContainer {
- border-bottom: 1px solid #eeeeee;
-}
-.soria .dijitCalendarMonthLabel {
- color:#293a4b;
- font-weight: bold;
-}
-.soria .dijitCalendarDateTemplate {
-
- font-size: 0.9em;
- font-weight: bold;
- text-align: center;
- padding: 0.3em 0.3em 0.05em 0.3em;
- letter-spacing: 1px;
- background-color: #fff;
- border:#fff solid 1px !important;
-}
-.dj_ie .soria .dijitCalendarDateTemplate {
- padding: 0.1em .33em 0.02em .33em;
-}
-.soria .dijitCalendarPreviousMonth,
-.soria .dijitCalendarNextMonth {
-
- color:#999999;
- background-color:#fdfdfd !important;
- border:#fdfdfd solid 1px !important;
-}
-.soria .dijitCalendarCurrentMonth {
-
-}
-.soria .dijitCalendarDisabledDate {
- text-decoration:line-through !important;
-}
-.soria .dijitCalendarCurrentDate {
-
- text-decoration:underline;
- font-weight:bold;
-}
-.soria .dijitCalendarSelectedDate {
-
- background-color:#b9cbf1 !important;
- color:black !important;
- border:#4b5aaa solid 1px !important;
-}
-.soria .dijitCalendarYearContainer {
-
- background:white url(images/titleBar.png) repeat-x top;
-}
-.soria .dijitCalendarYearLabel {
-
- margin:0;
- padding:0.4em 0 0.25em 0;
- text-align:center;
-}
-.soria .dijitCalendarSelectedYear {
-
- color:black;
- padding:0.2em;
- padding-bottom:0.1em;
- background-color:#b9cbf1 !important;
- border:#4b5aaa solid 1px !important;
-}
-.soria .dijitCalendarNextYear,
-.soria .dijitCalendarPreviousYear {
-
- color:black !important;
- font-weight:normal;
-}
-.soria .dijitTimePickerTick,
-.soria .dijitTimePickerMarker {
- border-color: #b1badf;
-}
-.soria .dijitTimePickerTick {
- color:white;
-}
-.soria .dijitTimePickerMarker {
- background:#bed7f0 url(images/titleBar.png) repeat-x top;
- color:#293a4b;
- font-weight: bold;
-}
-.soria .dijitTimePickerItemSelected {
- color: black;
- background: #b9cbf1 none;
-}
-.soria .dijitTimePickerItemHover {
- background: #60a1ea none;
- color:white;
-}
-.soria .dijitTimePickerItemHover,
-.soria .dijitTimePickerItemSelected {
- position: relative;
- z-index: 10;
-}
-.soria .dijitTimePickerTick .dijitTimePickerItemInner {
- font-size:0.4em;
-}
-.soria .dijitTimePickerItemHover .dijitTimePickerItemInner,
-.soria .dijitTimePickerItemSelected .dijitTimePickerItemInner {
- font-size:1em;
-}
-.soria .dijitTimePickerMarkerHover {
- border-top: 1px solid #94b9ef;
-}
-.soria .dijitTimePickerTickHover,
-.soria .dijitTimePickerTickSelected {
- margin-top:-0.3em;
- margin-bottom:-0.3em;
- border-bottom: none;
-}
-.soria .dijitToolbar {
- border-bottom: 1px solid #ccc;
- background:#eaeaea url(images/titleBar.png) repeat-x top left;
-}
-.dj_ie6 .soria .dijitToolbar {
- height: 10px;
-}
-.soria .dijitToolbar .dijitButtonNode,
-.soria .dijitToolbar .dijitComboButton .dijitButtonContents,
-.soria .dijitToolbar .dijitComboButton .dijitDownArrowButton {
- background: none;
- margin: 0px;
- padding: 0px;
- border: none;
- font-size: 12px;
-}
-.soria .dijitToolbar .dijitButton,
-.soria .dijitToolbar .dijitToggleButton,
-.soria .dijitToolbar .dijitDropDownButton,
-.soria .dijitToolbar .dijitComboButton .dijitButtonContents,
-.soria .dijitToolbar .dijitComboButton .dijitDownArrowButton {
- background: none;
- padding: 1px;
-}
-.soria .dijitToolbar .dijitButtonChecked,
-.soria .dijitToolbar .dijitToggleButtonChecked {
- background-color:#d8e5f8;
- border:1px solid #316ac5;
- padding: 0px;
-}
-.soria .dijitToolbar .dijitButtonCheckedHover,
-.soria .dijitToolbar .dijitToggleButtonCheckedHover
- {
- background-color:#9abbea;
- border:1px solid #316ac5;
- padding: 0px;
-}
-.soria .dijitToolbar .dijitButtonHover,
-.soria .dijitToolbar .dijitToggleButtonHover,
-.soria .dijitToolbar .dijitDropDownButtonHover,
-.soria .dijitToolbar .dijitComboButton .dijitButtonContentsHover,
-.soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover {
-
- border: 1px solid #316ac5;
- padding: 0px;
- background-color:#9abbea;
-}
-.soria .dijitToolbar label {
- padding: 3px 3px 0 6px;
-}
-.dj_ie .soria .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
-.dj_ie .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
-
- border: 1px #777 dotted !important;
- padding: 0px;
-}
-.soria .dijitDialog {
- background: #eee;
- border: 1px solid #cbcbcb;
- -webkit-box-shadow: 0px 5px 10px #adadad;
- padding: 0px;
-}
-.soria .dijitDialog .dijitDialogTitle {
-
- font-weight: bold;
- padding: 0px 4px;
- font-size: 0.9em;
- color: #3243C5F;
-}
-.soria .dijitDialog .dijitDialogPaneContent {
- background: #ffffff;
- border-top: 1px solid #b1badf;
- padding:10px;
-}
-.soria .dijitDialogTitleBar {
-
- background: #fafafa url(images/titleBar.png) repeat-x top left;
- padding: 5px 6px 3px 6px;
- outline:0;
-}
-.soria .dijitDialogCloseIcon {
-
- background-image: url(images/spriteRoundedIconsSmallBl.png);
- background-repeat: no-repeat;
- background-position: -60px 0px;
- position: absolute;
- vertical-align: middle;
- right: 6px;
- top: 4px;
- height: 15px;
- width: 15px;
-}
-.dj_ie6 .soria .dijitDialogCloseIcon {
- background-image: url(images/spriteRoundedIconsSmallBl.gif);
-}
-.soria .dijitDialogCloseIconHover {
- background-position: -60px -15px;
-}
-.soria .dijitTooltip,
-.soria .dijitTooltipDialog {
-
- background: transparent;
-}
-.dijitTooltipBelow {
-
- padding-top: 10px;
-}
-.dijitTooltipAbove {
-
- padding-bottom: 10px;
-}
-.soria .dijitTooltipContainer {
-
- background-color: #fff;
- border:1px solid #cbcbcb;
- padding:0.45em;
-}
-.soria .dijitTooltipConnector {
-
- border:0px;
- z-index: 2;
-}
-.soria .dijitTooltipABRight .dijitTooltipConnector {
-
- left: auto !important;
- right: 6px;
-}
-.soria .dijitTooltipBelow .dijitTooltipConnector {
-
- top: 0px;
- left: 6px;
- background:url(images/tooltipConnectorUp.png) no-repeat top left;
- width:17px;
- height:11px;
-}
-.dj_ie .soria .dijitTooltipBelow .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorUp.gif);
-}
-.soria .dijitTooltipAbove .dijitTooltipConnector {
-
- bottom: 0px;
- left: 6px;
- background:url(images/tooltipConnectorDown.png) no-repeat top left;
- width:17px;
- height:11px;
-}
-.dj_ie .soria .dijitTooltipAbove .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorDown.gif);
-}
-.dj_ie .soria .dijitTooltipAbove .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorDown.gif);
-}
-.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
- bottom: -5px;
-}
-.soria .dijitTooltipLeft {
- padding-right: 10px;
-}
-.dj_ie6 .soria .dijitTooltipLeft {
- padding-left: 11px;
-}
-.soria .dijitTooltipLeft .dijitTooltipConnector {
-
- right: 0px;
- bottom: 3px;
- background:url(images/tooltipConnectorRight.png) no-repeat top left;
- width:11px;
- height:17px;
-}
-.dj_ie .soria .dijitTooltipLeft .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorRight.gif);
-}
-.soria .dijitTooltipRight {
- padding-left: 10px;
-}
-.soria .dijitTooltipRight .dijitTooltipConnector {
-
- left: 0px;
- bottom: 3px;
- background:url(images/tooltipConnectorLeft.png) no-repeat top left;
- width:11px;
- height:17px;
-}
-.dj_ie .soria .dijitTooltipRight .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorLeft.gif);
-}
-.soria .dijitMenu,
-.soria .dijitMenuBar {
- border: 1px solid #cbcbcb;
- margin: 0px;
- padding: 0px;
- background-color: #fff;
-}
-.soria .dijitBorderContainer .dijitMenuBar {
- border:1px solid #B1BADF;
-}
-.soria .dijitMenuItem {
- font-family: sans-serif;
- margin: 0px;
- color: #243C5F;
-}
-.soria .dijitMenuBar .dijitMenuItem {
- padding: 4px 5px;
-}
-.soria .dijitMenuPreviousButton, .soria .dijitMenuNextButton {
- font-style: italic;
-}
-.soria .dijitMenuItem TD {
- padding:1px;
-}
-.soria .dijitMenuPassive .dijitMenuItemHover,
-.soria .dijitMenuItemSelected {
- background-color: #d9e6f9;
- color: #243C5F;
-}
-.soria .dijitMenuItemIcon {
- width: 15px;
- height: 15px;
-}
-.soria .dijitMenuExpand {
- width:15px;
- height:15px;
- background-image: url(images/spriteRoundedIconsSmall.png);
- background-position: -30px top;
-}
-.dj_ie6 .soria .dijitMenuExpand {
- background-image: url(images/spriteRoundedIconsSmall.gif);
-}
-.soria .dijitMenuSeparator {
- height: 1px;
-}
-.soria .dijitMenuSeparatorTop {
- border-bottom: 1px solid #fff;
-}
-.soria .dijitMenuSeparatorBottom {
- border-top: 1px solid #8ba0bd;
-}
-.soria .dijitCheckedMenuItemIconChar {
- display: none;
-}
-.soria .dijitCheckedMenuItemIcon {
- background-image: url(images/spriteCheckbox.gif);
- background-position: -80px;
-}
-.soria .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
- background-position: -64px;
-}
-.soria .dijitToolbar .dijitToolbarSeparator {
- background: url(../../icons/images/editorIconsEnabled.png);
-}
-.soria .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled.png);
- background-repeat: no-repeat;
- width: 18px;
- height: 18px;
- text-align: center;
-}
-.soria .dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled.png);
-}
-.dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled.png);
- background-repeat: no-repeat;
- width: 18px;
- height: 18px;
- text-align: center;
-}
-.dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled.png);
-}
-.dijitEditorIconSep { background-position: 0px; }
-.dijitEditorIconSave { background-position: -18px; }
-.dijitEditorIconPrint { background-position: -36px; }
-.dijitEditorIconCut { background-position: -54px; }
-.dijitEditorIconCopy { background-position: -72px; }
-.dijitEditorIconPaste { background-position: -90px; }
-.dijitEditorIconDelete { background-position: -108px; }
-.dijitEditorIconCancel { background-position: -126px; }
-.dijitEditorIconUndo { background-position: -144px; }
-.dijitEditorIconRedo { background-position: -162px; }
-.dijitEditorIconSelectAll { background-position: -180px; }
-.dijitEditorIconBold { background-position: -198px; }
-.dijitEditorIconItalic { background-position: -216px; }
-.dijitEditorIconUnderline { background-position: -234px; }
-.dijitEditorIconStrikethrough { background-position: -252px; }
-.dijitEditorIconSuperscript { background-position: -270px; }
-.dijitEditorIconSubscript { background-position: -288px; }
-.dijitEditorIconJustifyCenter { background-position: -306px; }
-.dijitEditorIconJustifyFull { background-position: -324px; }
-.dijitEditorIconJustifyLeft { background-position: -342px; }
-.dijitEditorIconJustifyRight { background-position: -360px; }
-.dijitEditorIconIndent { background-position: -378px; }
-.dijitEditorIconOutdent { background-position: -396px; }
-.dijitEditorIconListBulletIndent { background-position: -414px; }
-.dijitEditorIconListBulletOutdent { background-position: -432px; }
-.dijitEditorIconListNumIndent { background-position: -450px; }
-.dijitEditorIconListNumOutdent { background-position: -468px; }
-.dijitEditorIconTabIndent { background-position: -486px; }
-.dijitEditorIconLeftToRight { background-position: -504px; }
-.dijitEditorIconRightToLeft, .dijitEditorIconToggleDir { background-position: -522px; }
-.dijitEditorIconBackColor { background-position: -540px; }
-.dijitEditorIconForeColor { background-position: -558px; }
-.dijitEditorIconHiliteColor { background-position: -576px; }
-.dijitEditorIconNewPage { background-position: -594px; }
-.dijitEditorIconInsertImage { background-position: -612px; }
-.dijitEditorIconInsertTable { background-position: -630px; }
-.dijitEditorIconSpace { background-position: -648px; }
-.dijitEditorIconInsertHorizontalRule { background-position: -666px; }
-.dijitEditorIconInsertOrderedList { background-position: -684px; }
-.dijitEditorIconInsertUnorderedList { background-position: -702px; }
-.dijitEditorIconCreateLink { background-position: -720px; }
-.dijitEditorIconUnlink { background-position: -738px; }
-.dijitEditorIconViewSource { background-position: -756px; }
-.dijitEditorIconRemoveFormat { background-position: -774px; }
-.dijitEditorIconFullScreen { background-position: -792px; }
-.dijitEditorIconWikiword { background-position: -810px; }
-
-.dijitColorPalette {
- border:1px solid #cbcbcb;
- background:#fff;
- -moz-border-radius: 0px !important;
-}
+ NOTES:
+ ---
+ Dialog.css contains css classes for both Dialog and Tooltip!
+ This because currently a dijit.TooltipDialog exist. Until this is resolved
+ you need to include Dialog.css for both dijits
+ ---
+ Toolbar.css contains classes also used in Editor. Until this is resolved
+ you need to include Toolbar.css for both Toolbar and Editor
+ ---
+ Button.css contains classes for combobox,
+
+*/
+
+@import url("../dijit.css");
+@import url("../../icons/commonIcons.css");/*sprite containing common icons to be used by all themes*/
+@import url("Common.css");
+@import url("layout/ContentPane.css");
+@import url("layout/TabContainer.css");
+@import url("layout/AccordionContainer.css");
+@import url("layout/SplitContainer.css");
+@import url("layout/BorderContainer.css");
+@import url("form/Common.css");
+@import url("form/Button.css");
+@import url("form/Checkbox.css");
+@import url("form/RadioButton.css");
+@import url("form/Slider.css");
+@import url("form/Select.css");
+@import url("Tree.css");
+@import url("ProgressBar.css");
+@import url("TitlePane.css");
+@import url("Calendar.css");
+@import url("TimePicker.css");
+@import url("Toolbar.css");
+@import url("Dialog.css");
+@import url("Menu.css");
+@import url("Editor.css");
+@import url("../../icons/editorIcons.css"); /* sprite for editor icons to be used by all themes */
+@import url("ColorPalette.css"); \ No newline at end of file
diff --git a/lib/dijit/themes/soria/soria_rtl.css b/lib/dijit/themes/soria/soria_rtl.css
index 97246a28f..b804011a4 100644
--- a/lib/dijit/themes/soria/soria_rtl.css
+++ b/lib/dijit/themes/soria/soria_rtl.css
@@ -1,225 +1,29 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
-.dijitRtl .dijitPlaceHolder {
- left: auto;
- right: 0;
-}
-.dijitMenuItemRtl {
- text-align: right;
-}
-.dj_iequirks .dijitComboButtonRtl BUTTON {
-
- float:left;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitComboBoxRtl .dijitArrowButtonContainer {
-
- border-right-width: 1px !important;
- border-right-style: solid !important;
- border-left-width: 0px !important;
- border-left-style: none !important;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijit_a11y .dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBoxRtl .dijitArrowButtonContainer {
- border-right: 1px solid black !important;
- border-left: 0px none black !important;
-}
-.dijitSpinnerRtl .dijitSpinnerButtonContainer .dijitArrowButton {
- right: 0;
- left: auto;
-}
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitArrowButtonContainer {
- float: left;
-}
-.dijitCalendarRtl .dijitCalendarNextYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarRtl .dijitCalendarPreviousYear {
- margin:0 0 0 0.55em;
-}
-.dijitSliderRtl .dijitSliderImageHandleV {
- left:auto;
-}
-.dijitSliderRtl .dijitSliderImageHandleH {
- left:-50%;
-}
-.dijitSliderRtl .dijitSliderMoveableH {
- right:auto;
- left:0;
-}
-.dijitSliderRtl .dijitRuleContainerV {
- float:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleContainerV {
- text-align:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelV {
- text-align:left;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelH {
- zoom:1;
-}
-.dijitSliderRtl .dijitSliderProgressBarH {
-
- float:right;
- right:0;
- left:auto;
-}
-.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
- background-position:right;
- padding-right:25px;
-}
-.dijitTabRtl .dijitTabCloseButton {
- margin-left: 0px;
- margin-right: 1em;
-}
-.dj_ie .dijitTimePickerRtl .dijitTimePickerItem {
- width:100%;
-}
-.dijitColorPaletteRtl .dijitColorPaletteUnder {
-
- left: auto;
- right: 0;
-}
-.dijitSelectRtl .dijitButtonContents {
- text-align: right;
-}
-.dijitRtl .soria .dijitTab {
- margin-right:0;
- margin-left:2px;
-}
-.dijitRtl .soria .dijitTabContainer .tabStripButton {
- margin-left: 0;
-}
-.dijitRtl .soria .dijitTabContainerTopStrip,
-.dijitRtl .soria .dijitTabContainerBottomStrip,
-.dijitRtl .soria .dijitTabContainerTop-tabs,
-.dijitRtl .soria .dijitTabContainerBottom-tabs {
- padding-left: 0;
- padding-right: 3px;
-}
-.dijitRtl .soria .dijitTabInnerDiv {
- padding-left: 3px;
- padding-right: 4px;
-}
-.dijitRtl .soria .dijitTabPaneWrapper {
- #zoom: 1;
-}
-.dj_ie-rtl .soria .dijitTabContainerLeft-tabs {
- margin-left: 0px !important;
-}
-.dj_ie-rtl .soria .dijitTabContainerRight-tabs {
- margin-right: 0px !important;
-}
-.dijitRtl .soria .dijitTabContainerLeft-tabs .dijitTab,
-.dijitRtl .soria .dijitTabContainerRight-tabs .dijitTab {
- margin-left:0px;
-}
-.dj_ie-rtl .soria .dijitTab .dijitTabInnerDiv{
- width : 1%;
-}
-.dijitRtl .soria .dijitAccordionArrow {
- background-position: 0px top;
-}
-.dijitRtl .soria .dijitAccordionTitleSelected .dijitAccordionArrow {
-
- background-position: -15px top;
-}
-.dijitRtl .soria .dijitSliderProgressBarH,
-.dijitRtl .soria .dijitSliderRemainingBarH,
-.dijitRtl .soria .dijitSliderLeftBumper,
-.dijitRtl .soria .dijitSliderRightBumper,
-.dijitRtl .soria .dijitSliderTopBumper {
- background-position: top right;
-}
-.dijitRtl .soria .dijitSliderProgressBarV,
-.dijitRtl .soria .dijitSliderRemainingBarV,
-.dijitRtl .soria .dijitSliderBottomBumper {
- background-position: bottom right;
-}
-.dijitRtl .soria .dijitSliderLeftBumper {
- border-left-width: 0px;
- border-right-width: 1px;
-}
-.dijitRtl .soria .dijitSliderRightBumper {
- border-left-width: 1px;
- border-right-width: 0px;
-}
-.dijitRtl .soria .dijitSliderIncrementIconH {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat left top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat left top;
-}
-.dijitRtl .soria .dijitSliderDecrementIconH {
- background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
- #background:url(images/spriteRoundedIconsSmall.gif) no-repeat -30px top;
-}
-.dijitRtl .soria .dijitComboBox .dijitButtonNode {
- border-width: 0px 0px 0px 1px;
-}
-.dijitRtl .soria .dijitSelect .dijitButtonContents {
- border-left: none;
- border-right-width: 1px;
-}
-.dijitRtl .soria .dijitTreeNode,
-.dijitRtl .soria .dijitTreeExpandoLeaf {
-
- background-image: none;
-}
-.dijitRtl .soria .dijitTreeContent {
- padding-left: 0px;
- padding-right: 1px;
-}
-.dijitRtl .soria .dijitTreeExpandoOpened {
-
- background: url(images/spriteTree_rtl.gif) no-repeat -18px top;
-}
-.dijitRtl .soria .dijitTreeExpandoClosed {
-
- background-image: url(images/spriteTree_rtl.gif);
-}
-.dijitRtl .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: 0px top;
-}
-.dj_ie6-rtl .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: 0px top;
-}
-.dijitRtl .soria .dijitCalendarDecrease {
- background-position: -30px top;
-}
-.dijitRtl .soria .dijitCalendarIncrease {
- background-position: 0px top;
-}
-.dj_ie6-rtl .soria .dijitTimePickerMarkerHover,
-.dj_ie7-rtl .soria .dijitTimePickerMarkerHover {
- border-top: 0px;
-}
-.dijitRtl .soria .dijitDialogTitleBar .dijitDialogCloseIcon {
- right: auto;
- left: 5px;
-}
-.dijitRtl .soria .dijitMenuItem .dijitMenuItemIcon {
- padding-left: 3px;
- padding-right: 0px;
-}
-.dijitRtl .soria .dijitMenuItem .dijitMenuExpand {
- background-position: left top;
-}
-.dijitRtl .soria .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitRtl .soria .dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitEditorRtl .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitToolbarRtl .dijitToolbarSeparator {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-
+ NOTES:
+ ---
+ Dialog.css contains css classes for both Dialog and Tooltip!
+ This because currently a dijit.TooltipDialog exist. Until this is resolved
+ you need to include Dialog.css for both dijits
+ ---
+ Toolbar.css contains classes also used in Editor. Until this is resolved
+ you need to include Toolbar.css for both Toolbar and Editor
+ ---
+ Button.css contains classes for combobox,
+
+*/
+
+@import url("../dijit_rtl.css");
+@import url("layout/TabContainer_rtl.css");
+@import url("layout/AccordionContainer_rtl.css");
+@import url("form/Slider_rtl.css");
+@import url("form/Button_rtl.css");
+@import url("Tree_rtl.css");
+@import url("TitlePane_rtl.css");
+@import url("Calendar_rtl.css");
+@import url("TimePicker_rtl.css");
+@import url("Dialog_rtl.css");
+@import url("Menu_rtl.css");
+@import url("Editor_rtl.css");
+@import url("../../icons/editorIcons_rtl.css"); /*sprite for editor icons to be used by all themes*/ \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/Calendar.css b/lib/dijit/themes/tundra/Calendar.css
index 19d8bf76a..5fef68ee1 100644
--- a/lib/dijit/themes/tundra/Calendar.css
+++ b/lib/dijit/themes/tundra/Calendar.css
@@ -1,6 +1,7 @@
+/* Calendar*/
.tundra .dijitCalendarIncrementControl {
-
+ /* next/prev month buttons */
width:15px;
height:15px;
background-image: url("images/spriteRoundedIconsSmall.png");
@@ -10,15 +11,18 @@
font-size:.1em;
background-image: url("images/spriteRoundedIconsSmall.gif");
}
+
.tundra .dijitA11ySideArrow {
display: none;
}
+
.tundra .dijitCalendarDecrease {
background-position: top left;
}
.tundra .dijitCalendarIncrease {
background-position: -30px top;
}
+
.tundra .dijitCalendarContainer {
font-size: 100%;
border-spacing: 0;
@@ -26,8 +30,9 @@
border: 1px solid #ccc;
margin: 0;
}
+
.tundra .dijitCalendarMonthContainer th {
-
+ /* month header cell */
background:#d3d3d3 url("images/titleBar.png") repeat-x top;
padding-top:.3em;
padding-bottom:.2em;
@@ -37,82 +42,118 @@
padding-top:.2em;
padding-bottom:.1em;
}
+
.tundra .dijitCalendarDayLabelTemplate {
-
+ /* day of week labels */
background:white url("images/calendarDayLabel.png") repeat-x bottom;
font-weight:normal;
padding-top:.15em;
- padding-bottom:0em;
+ padding-bottom:0;
border-top: 1px solid #eeeeee;
color:#293a4b;
text-align:center;
}
+
.tundra .dijitCalendarBodyContainer {
border-bottom: 1px solid #eeeeee;
}
+
.tundra .dijitCalendarMonthLabel {
color:#293a4b;
font-weight: bold;
+ padding: 0 4px;
}
+
.tundra .dijitCalendarDateTemplate {
-
+ /* style for each day cell */
font-size: 0.9em;
font-weight: bold;
text-align: center;
padding: 0.3em 0.3em 0.05em 0.3em;
letter-spacing: 1px;
}
+
.dj_ie .tundra .dijitCalendarDateTemplate {
padding: 0.1em .33em 0.02em .33em;
}
+
.tundra .dijitCalendarPreviousMonth,
.tundra .dijitCalendarNextMonth {
-
+ /* days that are part of the previous or next month */
color:#999999;
background-color:#f8f8f8;
}
+
.tundra .dijitCalendarCurrentMonth {
-
+ /* days that are part of this month */
background-color: white;
}
+
.tundra .dijitCalendarCurrentDate {
-
+ /* cell for today's date */
text-decoration:underline;
font-weight:bold;
}
+
.tundra .dijitCalendarHoveredDate {
background-color: #e2ebf2;
}
+
.tundra .dijitCalendarDisabledDate {
text-decoration: line-through;
- background-color: white;
+ background-color: white; /* override hover effects above, hover and click on disabled date should have no effect */
}
+
.tundra .dijitCalendarSelectedDate {
-
+ /* cell for the selected date */
background-color:#bbc4d0 !important;
color:black !important;
}
.tundra .dijitCalendarYearContainer {
-
+ /* footer of the table that contains the year display/selector */
background:white url("images/calendarYearLabel.png") repeat-x bottom;
border-top:1px solid #ccc;
}
+
.tundra .dijitCalendarYearLabel {
-
+ /* container for all of 3 year labels */
margin:0;
padding:0.4em 0 0.25em 0;
text-align:center;
}
+
.tundra .dijitCalendarSelectedYear {
-
+ /* label for selected year */
color:black;
padding:0.2em;
padding-bottom:0.1em;
background-color:#bbc4d0 !important;
}
+
.tundra .dijitCalendarNextYear,
.tundra .dijitCalendarPreviousYear {
-
+ /* label for next/prev years */
color:black !important;
font-weight:normal;
}
+
+/* Styling for month DropDownButton */
+
+.tundra .dijitCalendar .dijitDropDownButton {
+ margin: 0;
+}
+.tundra .dijitCalendar .dijitButtonText {
+ padding: 0;
+}
+.tundra .dijitCalendar .dijitDropDownButton .dijitButtonNode {
+ background-color: transparent;
+ background-image: none;
+ padding: 0;
+}
+
+/* Styling for month drop down list */
+
+.tundra .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
+ background-color: #3559ac;
+ color:#fff;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/Calendar_rtl.css b/lib/dijit/themes/tundra/Calendar_rtl.css
index 9144dcfeb..fbfe27b5d 100644
--- a/lib/dijit/themes/tundra/Calendar_rtl.css
+++ b/lib/dijit/themes/tundra/Calendar_rtl.css
@@ -1,7 +1,9 @@
+/* Calendar */
.tundra .dijitCalendarRtl .dijitCalendarDecrease {
background-position: -30px top;
}
+
.tundra .dijitCalendarRtl .dijitCalendarIncrease {
- background-position: 0px top;
+ background-position: 0 top;
}
diff --git a/lib/dijit/themes/tundra/ColorPalette.css b/lib/dijit/themes/tundra/ColorPalette.css
index 56fa5585a..38088b845 100644
--- a/lib/dijit/themes/tundra/ColorPalette.css
+++ b/lib/dijit/themes/tundra/ColorPalette.css
@@ -1,5 +1,5 @@
.dijitColorPalette {
border:1px solid #7eabcd;
background:#fff;
- -moz-border-radius: 0px !important;
-}
+ -moz-border-radius: 0 !important;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/Common.css b/lib/dijit/themes/tundra/Common.css
index b7f8ace85..c339263e1 100644
--- a/lib/dijit/themes/tundra/Common.css
+++ b/lib/dijit/themes/tundra/Common.css
@@ -1,13 +1,17 @@
-
+/* DnD avatar-specific settings */
+/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
.tundra .dojoDndItemBefore {
border-top: 2px solid #369;
}
+
.tundra .dojoDndItemAfter {
border-bottom: 2px solid #369;
}
+
.tundra .dojoDndItemOver {
cursor:pointer;
}
+
.tundra table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
.tundra .dojoDndAvatar td { border: none; }
.tundra .dojoDndAvatar tr { border: none; }
@@ -17,10 +21,12 @@
.tundra.dojoDndCopy .dojoDndAvatarHeader {background-color: #f58383; background-image: url(images/dndNoCopy.png); background-repeat: no-repeat; background-position: 2px center;}
.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 {
background:url('images/loading.gif') no-repeat left center;
padding-left:25px;
}
+
.tundra .dijitContentPaneError {
background:url('images/warning.png') no-repeat left center;
padding-left:25px;
diff --git a/lib/dijit/themes/tundra/Dialog.css b/lib/dijit/themes/tundra/Dialog.css
index 74d3d36ef..b346f6267 100644
--- a/lib/dijit/themes/tundra/Dialog.css
+++ b/lib/dijit/themes/tundra/Dialog.css
@@ -1,29 +1,35 @@
+/* Dialog and Tooltip/TooltipDialog */
.tundra .dijitDialog {
background: #fff;
border: 1px solid #7eabcd;
- padding: 0px;
- -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0;
+ -webkit-box-shadow: 0 5px 10px #adadad;
}
+
.tundra .dijitDialogPaneContent {
background: #fff;
border-top: 1px solid #d3d3d3;
padding:10px;
+
}
+
.tundra .dijitDialogTitleBar {
-
+ /* outer container for the titlebar of the dialog */
background: #fafafa url("images/titleBar.png") repeat-x top left;
padding: 5px 6px 3px 6px;
- outline:0;
+ outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
}
+
.tundra .dijitDialogTitle {
-
+ /* typography and styling of the dialog title */
font-weight: bold;
- padding: 0px 4px;
+ padding: 0 4px;
}
+
.tundra .dijitDialogCloseIcon {
-
-
+ /* the default close icon for the dialog */
+ /* background : url("images/spriteRoundedIconsSmall.png") no-repeat right top; */
background: url("images/tabClose.png") no-repeat right top;
position: absolute;
vertical-align: middle;
@@ -35,58 +41,72 @@
.dj_ie6 .tundra .dijitDialogCloseIcon {
background : url("images/tabClose.gif") no-repeat right top;
}
+
.tundra .dijitDialogCloseIconHover {
background: url("images/tabCloseHover.png") no-repeat right top;
}
.dj_ie6 .tundra .dijitDialogCloseIconHover {
background : url("images/tabCloseHover.gif") no-repeat right top;
}
+
+/* Tooltip and TooltipDialog */
+
.tundra .dijitTooltip,
.tundra .dijitTooltipDialog {
-
- background: transparent;
+ /* the outermost dom node, holding the connector and container */
+ background: transparent; /* make the area on the sides of the arrow transparent */
}
+
.dijitTooltipBelow {
-
+ /* leave room for arrow above content */
padding-top: 13px;
}
+
.dijitTooltipAbove {
-
+ /* leave room for arrow below content */
padding-bottom: 13px;
}
+
.tundra .dijitTooltipContainer {
-
+ /*
+ The part with the text.
+ */
background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
border: 1px solid #7eabcd;
padding: 0.45em;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
}
+
.tundra .dijitTooltipConnector {
-
- border:0px;
+ /* the arrow piece */
+ border:0;
z-index: 2;
}
.tundra .dijitTooltipABRight .dijitTooltipConnector {
-
+ /* above or below tooltip, but the arrow appears on the right,
+ and the right edges of target and tooltip are aligned rather than the left */
left: auto !important;
right: 3px;
}
+
.tundra .dijitTooltipBelow .dijitTooltipConnector {
-
- top: 0px;
+ /* the arrow piece for tooltips below an element */
+ top: 0;
left: 3px;
background:url("images/tooltipConnectorUp.png") no-repeat top left;
width:16px;
height:14px;
}
+
.dj_ie .tundra .dijitTooltipBelow .dijitTooltipConnector {
-
+ /* use gif for IE7 too, due to png rendering problems on fade-in (see http://trac.dojotoolkit.org/ticket/6555) */
background-image: url("images/tooltipConnectorUp.gif");
}
+
.tundra .dijitTooltipAbove .dijitTooltipConnector {
-
- bottom: 0px;
+ /* the arrow piece for tooltips above an element */
+ bottom: 0;
left: 3px;
background:url("images/tooltipConnectorDown.png") no-repeat top left;
width:16px;
@@ -98,16 +118,13 @@
.dj_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
bottom: -3px;
}
+
.tundra .dijitTooltipLeft {
padding-right: 14px;
}
-.dj_ie6 .tundra .dijitTooltipLeft {
- padding-left: 15px;
-}
.tundra .dijitTooltipLeft .dijitTooltipConnector {
-
- right: 0px;
- bottom: 3px;
+ /* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+ right: 0;
background:url("images/tooltipConnectorRight.png") no-repeat top left;
width:16px;
height:14px;
@@ -115,13 +132,13 @@
.dj_ie .tundra .dijitTooltipLeft .dijitTooltipConnector {
background-image: url("images/tooltipConnectorRight.gif");
}
+
.tundra .dijitTooltipRight {
padding-left: 14px;
}
.tundra .dijitTooltipRight .dijitTooltipConnector {
-
- left: 0px;
- bottom: 3px;
+ /* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+ left: 0;
background:url("images/tooltipConnectorLeft.png") no-repeat top left;
width:16px;
height:14px;
@@ -129,6 +146,7 @@
.dj_ie .tundra .dijitTooltipRight .dijitTooltipConnector {
background-image: url("images/tooltipConnectorLeft.gif");
}
+
.dj_webkit .tundra .dijitTooltipContainer {
- -webkit-box-shadow: 0px 5px 10px #adadad;
+ -webkit-box-shadow: 0 5px 10px #adadad;
}
diff --git a/lib/dijit/themes/tundra/Dialog_rtl.css b/lib/dijit/themes/tundra/Dialog_rtl.css
index faeaa4139..9337680aa 100644
--- a/lib/dijit/themes/tundra/Dialog_rtl.css
+++ b/lib/dijit/themes/tundra/Dialog_rtl.css
@@ -1,4 +1,4 @@
-
+/* Dialog */
.tundra .dijitDialogRtl .dijitDialogCloseIcon {
right: auto;
left: 5px;
diff --git a/lib/dijit/themes/tundra/Editor.css b/lib/dijit/themes/tundra/Editor.css
index d24de9557..b6f07a1f7 100644
--- a/lib/dijit/themes/tundra/Editor.css
+++ b/lib/dijit/themes/tundra/Editor.css
@@ -2,13 +2,15 @@
border:1px solid #bfbfbf;
border-top:0;
}
+
.tundra .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsEnabled.png');
+ background-image: url('../../icons/images/editorIconsEnabled.png'); /* editor icons sprite image - enabled state */
background-repeat: no-repeat;
width: 18px;
height: 18px;
text-align: center;
}
.tundra .dijitDisabled .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsDisabled.png');
+ background-image: url('../../icons/images/editorIconsDisabled.png'); /* editor icons sprite image - disabled state */
}
+
diff --git a/lib/dijit/themes/tundra/Editor_rtl.css b/lib/dijit/themes/tundra/Editor_rtl.css
index 888c0335a..cd4849e7f 100644
--- a/lib/dijit/themes/tundra/Editor_rtl.css
+++ b/lib/dijit/themes/tundra/Editor_rtl.css
@@ -1,7 +1,7 @@
-
+/* Editor */
.tundra .dijitEditorRtl .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsEnabled_rtl.png');
+ background-image: url('../../icons/images/editorIconsEnabled_rtl.png'); /* editor icons sprite image - enabled state */
}
.tundra .dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url('../../icons/images/editorIconsDisabled_rtl.png');
+ background-image: url('../../icons/images/editorIconsDisabled_rtl.png'); /* editor icons sprite image - disabled state */
}
diff --git a/lib/dijit/themes/tundra/Menu.css b/lib/dijit/themes/tundra/Menu.css
index ca1198864..6229b1773 100644
--- a/lib/dijit/themes/tundra/Menu.css
+++ b/lib/dijit/themes/tundra/Menu.css
@@ -1,61 +1,76 @@
.tundra .dijitMenu,
.tundra .dijitMenuBar {
border: 1px solid #7eabcd;
- margin: 0px;
- padding: 0px;
+ margin: 0;
+ padding: 0;
background-color: #f7f7f7;
}
+
.tundra .dijitBorderContainer .dijitMenuBar {
border:1px solid #ccc;
}
+
.tundra .dijitMenuItem {
font-family: sans-serif;
margin: 0;
}
+
.tundra .dijitMenuItem {
padding: 4px 5px;
}
+
.tundra .dijitMenuPreviousButton, .tundra .dijitMenuNextButton {
font-style: italic;
}
.tundra .dijitMenuItem td {
padding: 2px;
}
+
.tundra .dijitMenuPassive .dijitMenuItemHover,
.tundra .dijitMenuItemSelected {
background-color: #3559ac;
color:#fff;
}
+
.tundra .dijitMenuItemIcon {
width: 16px;
height: 16px;
}
+
.tundra .dijitMenuExpand {
-
+ /* arrow to indicate this MenuItem opens a sub-menu */
width: 7px;
height: 7px;
background-image: url('images/spriteArrows.png');
- background-position: -14px 0px;
+ background-position: -14px 0;
}
.dj_ie6 .tundra .dijitMenuExpand {
background-image: url('images/spriteArrows.gif');
}
+
+/* separator can be two pixels -- set border of either one to 0 to have only one */
.tundra .dijitMenuSeparatorTop {
border-bottom: 1px solid #9b9b9b;
}
+
.tundra .dijitMenuSeparatorBottom {
border-top: 1px solid #e8e8e8;
}
+
+/* the checked menu item */
.tundra .dijitCheckedMenuItemIconChar {
display: none;
}
+
.tundra .dijitCheckedMenuItemIcon {
background-image: url('images/checkmark.png');
background-position: -80px;
}
+
.dj_ie6 .tundra .dijitCheckedMenuItemIcon {
background-image: url('images/checkmark.gif');
}
+
.tundra .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
background-position: -64px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/Menu_rtl.css b/lib/dijit/themes/tundra/Menu_rtl.css
index 7f0a58ae3..f14859297 100644
--- a/lib/dijit/themes/tundra/Menu_rtl.css
+++ b/lib/dijit/themes/tundra/Menu_rtl.css
@@ -1,3 +1,3 @@
.tundra .dijitMenuItemRtl .dijitMenuExpand {
- background-position: -7px 0px;
-}
+ background-position: -7px 0;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/ProgressBar.css b/lib/dijit/themes/tundra/ProgressBar.css
index 3f555c42b..2d70e28d4 100644
--- a/lib/dijit/themes/tundra/ProgressBar.css
+++ b/lib/dijit/themes/tundra/ProgressBar.css
@@ -1,23 +1,28 @@
.tundra .dijitProgressBar {
- margin:2px 0px 2px 0px;
+ margin:2px 0 2px 0;
}
+
.tundra .dijitProgressBarEmpty {
-
+ /* outer container and background of the bar that's not finished yet*/
background:#fff url("images/progressBarEmpty.png") repeat-x center center;
border-color: #a2a2a2 #b8b8b8 #b8b8b8 #a2a2a2;
}
+
.tundra .dijitProgressBarTile {
-
+ /* inner container for finished portion when in 'tile' (image) mode */
background:#f0f0f0 url("images/progressBarFull.png") repeat-x center center;
}
+
.tundra .dijitProgressBarFull {
border-right:1px solid #b8b8b8;
}
+
.tundra .dijitProgressBarLabel {
-
+ /* Set to a color that contrasts with both the "Empty" and "Full" parts. */
color:#293a4b;
}
+
.tundra .dijitProgressBarIndeterminate .dijitProgressBarTile {
-
+ /* use an animated gif for the progress bar in 'indeterminate' mode */
background:#cad2de url("images/progressBarAnim.gif") repeat-x center center;
}
diff --git a/lib/dijit/themes/tundra/TimePicker.css b/lib/dijit/themes/tundra/TimePicker.css
index 5811ad665..13dc7f80c 100644
--- a/lib/dijit/themes/tundra/TimePicker.css
+++ b/lib/dijit/themes/tundra/TimePicker.css
@@ -1,42 +1,52 @@
-
+/* Time Picker */
.tundra .dijitTimePickerTick,
.tundra .dijitTimePickerMarker {
border-color: #ccc;
}
+
.tundra .dijitTimePickerTick {
color:white;
}
+
.tundra .dijitTimePickerMarker {
background:#d3d3d3 url("images/titleBar.png") repeat-x top;
color:#293a4b;
font-weight: bold;
}
+
.tundra .dijitTimePickerItemSelected {
color: black;
background: #bbc4d0 none;
}
+
.tundra .dijitTimePickerItemHover {
background: #60a1ea none;
color:white;
}
+
.tundra .dijitTimePickerItemHover,
.tundra .dijitTimePickerItemSelected {
position: relative;
z-index: 10;
}
+
.tundra .dijitTimePickerTick .dijitTimePickerItemInner {
font-size:0.4em;
}
+
.tundra .dijitTimePickerItemHover .dijitTimePickerItemInner,
.tundra .dijitTimePickerItemSelected .dijitTimePickerItemInner {
font-size:1em;
}
+
.tundra .dijitTimePickerMarkerHover {
border-top: 1px solid #ccc;
}
+
.tundra .dijitTimePickerTickHover,
.tundra .dijitTimePickerTickSelected {
margin-top:-0.3em;
margin-bottom:-0.3em;
border-bottom: none;
}
+
diff --git a/lib/dijit/themes/tundra/TimePicker_rtl.css b/lib/dijit/themes/tundra/TimePicker_rtl.css
index 985600778..7a4d5e58c 100644
--- a/lib/dijit/themes/tundra/TimePicker_rtl.css
+++ b/lib/dijit/themes/tundra/TimePicker_rtl.css
@@ -1,4 +1,4 @@
.dj_ie6 .tundra .dijitTimePickerRtl .dijitTimePickerMarkerHover,
.dj_ie7 .tundra .dijitTimePickerRtl .dijitTimePickerMarkerHover {
- border-top: 0px;
+ border-top: 0; /* IE6/7 bug causes mouseover/out event storm */
}
diff --git a/lib/dijit/themes/tundra/TitlePane.css b/lib/dijit/themes/tundra/TitlePane.css
index 265de718c..e964bf8a8 100644
--- a/lib/dijit/themes/tundra/TitlePane.css
+++ b/lib/dijit/themes/tundra/TitlePane.css
@@ -7,28 +7,32 @@
.tundra .dijitTitlePaneTitleHover {
background: #f8fafd url("images/accordionItemHover.gif") bottom repeat-x;
}
+
.tundra .dijitTitlePane .dijitArrowNode {
background-image: url('images/spriteArrows.png');
background-repeat: no-repeat;
- background-position: 0px 0px;
+ background-position: 0 0;
height: 7px;
width: 7px;
}
.dj_ie6 .tundra .dijitTitlePane .dijitArrowNode {
background-image: url('images/spriteArrows.gif');
}
+
.tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: -14px 0px;
+ background-position: -14px 0;
}
+
.tundra .dijitTitlePaneContentOuter {
background: #ffffff;
border:1px solid #bfbfbf;
- border-top: 0px;
+ border-top: 0;
}
.tundra .dijitTitlePaneContentInner {
padding:10px;
}
+
.tundra .dijitTitlePaneTextNode {
margin-left: 4px;
margin-right: 4px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/TitlePane_rtl.css b/lib/dijit/themes/tundra/TitlePane_rtl.css
index f3d2b91a3..5f63a03d9 100644
--- a/lib/dijit/themes/tundra/TitlePane_rtl.css
+++ b/lib/dijit/themes/tundra/TitlePane_rtl.css
@@ -1,3 +1,3 @@
.tundra .dijitTitlePaneRtl .dijitClosed .dijitArrowNode {
- background-position: -7px 0px;
-}
+ background-position: -7px 0;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/Toolbar.css b/lib/dijit/themes/tundra/Toolbar.css
index 0f489fa85..ebe9cdae4 100644
--- a/lib/dijit/themes/tundra/Toolbar.css
+++ b/lib/dijit/themes/tundra/Toolbar.css
@@ -2,18 +2,22 @@
border-bottom: 1px solid #ccc;
background:#eaeaea url("images/titleBar.png") repeat-x top left;
}
+
+/* setting a min-height on ditor toolbar */
.dj_ie6 .tundra .dijitToolbar {
height: 10px;
}
+
.tundra .dijitToolbar .dijitButtonNode,
.tundra .dijitToolbar .dijitComboButton .dijitButtonContents,
.tundra .dijitToolbar .dijitComboButton .dijitDownArrowButton {
background: none;
- margin: 0px;
- padding: 0px;
+ margin: 0;
+ padding: 0;
border: none;
font-size: 12px;
}
+
.tundra .dijitToolbar .dijitButton,
.tundra .dijitToolbar .dijitToggleButton,
.tundra .dijitToolbar .dijitDropDownButton,
@@ -22,43 +26,50 @@
background: none;
padding: 1px;
}
+
.tundra .dijitToolbar .dijitButtonChecked,
.tundra .dijitToolbar .dijitToggleButtonChecked {
background-color:#d4dff2;
border:1px solid #316ac5;
- padding: 0px;
+ padding: 0; /* reduce padding to compensate for space taken by border */
}
+
.tundra .dijitToolbar .dijitButtonCheckedHover,
.tundra .dijitToolbar .dijitToggleButtonCheckedHover
{
background-color:#abc1e5;
border:1px solid #316ac5;
- padding: 0px;
+ padding: 0; /* reduce padding to compensate for space taken by border */
}
+
.tundra .dijitToolbar .dijitButtonHover,
.tundra .dijitToolbar .dijitToggleButtonHover,
.tundra .dijitToolbar .dijitDropDownButtonHover,
.tundra .dijitToolbar .dijitComboButton .dijitButtonContentsHover,
.tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover {
-
+ /* TODO: change this from Hover to Selected so that button is still highlighted while drop down is being used */
border: 1px solid #869cbf;
- padding: 0px;
+ padding: 0; /* reduce padding to compensate for space taken by border */
background-color:#e1e5f0;
}
+
.tundra .dijitToolbar label {
padding: 3px 3px 0 6px;
}
+
.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
-
+ /* focus border doesn't appear on <td> for IE, so need to add it manually */
border: 1px #555 dotted !important;
- padding: 0px;
+ padding: 0;
}
+
.tundra .dijitToolbarSeparator {
-
+ /* separator icon in the editor sprite */
background: url('../../icons/images/editorIconsEnabled.png');
}
+
.tundra .dijitToolbarRtl .dijitToolbarSeparator {
-
+ /* separator icon in the editor sprite */
background-image: url('../../icons/images/editorIconsDisabled.png');
}
diff --git a/lib/dijit/themes/tundra/Tree.css b/lib/dijit/themes/tundra/Tree.css
index 5ba1c8804..76c81e0b1 100644
--- a/lib/dijit/themes/tundra/Tree.css
+++ b/lib/dijit/themes/tundra/Tree.css
@@ -1,72 +1,96 @@
+/* Tree */
.tundra .dijitTreeNode {
background-image : url('images/i.gif');
background-repeat : repeat-y;
- zoom: 1;
+ zoom: 1; /* force layout on IE (TODO: may not be needed anymore) */
}
+
+/* left vertical line (grid) for all nodes */
.tundra .dijitTreeIsLast {
background: url('images/i_half.gif') no-repeat;
}
+
.tundra .dijitTreeIsRoot {
margin-left: 0;
background-image: none;
}
+
.tundra .dijitTreeExpando {
width: 18px;
height: 18px;
}
+
.tundra .dijitTreeRow {
-
+ /* so insert line shows up on IE when dropping after a target element */
padding-bottom: 2px;
}
+
.tundra .dijitTreeContent {
min-height: 18px;
min-width: 18px;
}
+
.tundra .dijitTreeRowSelected .dijitTreeLabel {
background:#e2ebfe;
}
.tundra .dijitTreeRowHover {
-
+ /* using a transparent png so that we can still see grid lines, which are (unfortunately) behind the dijitRowNode that we are hovering over */
background-image: url(images/treeHover.png);
background-repeat: repeat;
background-color: transparent !important;
}
+
.tundra .dijitTreeExpandoOpened {
background-image: url('images/treeExpand_minus.gif');
}
+
.tundra .dijitTreeExpandoClosed {
background-image: url('images/treeExpand_plus.gif');
}
+
.tundra .dijitTreeExpandoLeaf {
background-image: url('images/treeExpand_leaf.gif');
}
+
.tundra .dijitTreeExpandoLoading {
background-image: url('images/treeExpand_loading.gif');
}
+
.tundra .dijitTreeIcon {
width: 16px;
height: 16px;
}
+
.tundra .dijitFolderOpened {
background: url('images/folderOpened.gif') no-repeat;
}
+
.tundra .dijitFolderClosed {
background: url('images/folderClosed.gif') no-repeat;
}
+
.tundra .dijitLeaf {
background: url('images/leaf.gif') no-repeat;
}
+
+/* Drag and Drop on TreeNodes
+ * Put insert line on dijitTreeContent node so it's aligned w/
+ * (ie, indented equally with) target element, even
+ * though dijitTreeRowNode is the actual "drag object"
+ */
.tundra .dijitTreeNode .dojoDndItemBefore,
.tundra .dijitTreeNode .dojoDndItemAfter {
border-bottom: none;
border-top: none;
}
+
.tundra .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
-
+ /* copied from Common.css */
border-top: 2px solid #369;
}
+
.tundra .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
-
+ /* copied from Common.css */
border-bottom: 2px solid #369;
}
diff --git a/lib/dijit/themes/tundra/Tree_rtl.css b/lib/dijit/themes/tundra/Tree_rtl.css
index 6a9d93186..607b71ce8 100644
--- a/lib/dijit/themes/tundra/Tree_rtl.css
+++ b/lib/dijit/themes/tundra/Tree_rtl.css
@@ -1,13 +1,17 @@
+/* Tree */
.tundra .dijitTreeNodeRtl,
.tundra .dijitTreeNodeRtl .dijitTreeExpandoLeaf {
-
+ /* disable grid lines in RTL mode; too hard to support */
background-image: none;
}
+
.tundra .dijitTreeNodeRtl .dijitTreeExpandoOpened {
-
+ /* todo: get rid of transparent space in icon files,
+ and just use background-placement (or margin maybe) to get desired alignment */
background-image: url('images/treeExpand_minus_rtl.gif');
}
+
.tundra .dijitTreeNodeRtl .dijitTreeExpandoClosed {
background-image: url('images/treeExpand_plus_rtl.gif');
}
diff --git a/lib/dijit/themes/tundra/form/Button.css b/lib/dijit/themes/tundra/form/Button.css
index d9d103fc1..2c68aef04 100644
--- a/lib/dijit/themes/tundra/form/Button.css
+++ b/lib/dijit/themes/tundra/form/Button.css
@@ -1,6 +1,14 @@
+/*****
+ dijit.form.Button
+ dijit.form.DropDownButton
+ dijit.form.ComboButton
+ dijit.form.ComboBox (partial)
+ dijit.form.Spinner (partial) (TODO: create NumberSpinner.css file like claro has)
+ *****/
+
.tundra .dijitButtonNode {
-
+ /* enabled state - inner */
border: 1px solid #c0c0c0;
border-bottom: 1px solid #9b9b9b;
padding: 0.1em 0.2em 0.2em 0.2em;
@@ -10,15 +18,19 @@
text-align: center;
padding: 0 0.3em;
}
+
.tundra .dijitDisabled .dijitButtonText {
color: #7F7F7F;
}
+
.tundra .dijitArrowButton {
color: #111;
}
+
.tundra .dijitComboButton .dijitDownArrowButton {
padding-right:4px;
}
+
.tundra .dijitTextBoxReadOnly,
.tundra .dijitTextBoxReadOnly .dijitButtonNode,
.tundra .dijitButtonDisabled .dijitButtonNode,
@@ -27,18 +39,19 @@
.tundra .dijitComboButtonDisabled .dijitButtonNode,
.tundra .dijitTextBoxDisabled,
.tundra .dijitTextBoxDisabled .dijitButtonNode {
-
+ /* disabled state - inner */
border-color: #d5d5d5 #d5d5d5 #bdbdbd #d5d5d5;
background:#e4e4e4 url("../images/buttonDisabled.png") top repeat-x;
}
+
.tundra .dijitButtonHover .dijitButtonNode,
.tundra .dijitButtonNodeHover,
.tundra .dijitToggleButtonHover .dijitButtonNode,
.tundra .dijitDropDownButtonHover .dijitButtonNode,
.tundra .dijitComboButton .dijitButtonContentsHover,
.tundra .dijitComboButton .dijitDownArrowButtonHover {
-
-
+ /* hover state - inner */
+ /* TODO: change from Hover to Selected so that button is still highlighted while drop down is being used */
border-color: #a5beda;
border-bottom-color:#5c7590;
color:#243C5F;
@@ -46,10 +59,11 @@
}
.tundra .dijitDownArrowButtonHover,
.tundra .dijitUpArrowButtonHover {
-
+ /* same as above except don't adjust border color (it's controlled by the containing Spinner/ComboBox) */
color:#243C5F;
background:#fcfdff url("../images/buttonHover.png") repeat-x bottom;
}
+
.tundra .dijitUpArrowButtonActive,
.tundra .dijitDownArrowButtonActive,
.tundra .dijitButtonActive .dijitButtonNode,
@@ -57,15 +71,18 @@
.tundra .dijitDropDownButtonActive .dijitButtonNode,
.tundra .dijitButtonContentsActive,
.tundra .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
-
+ /* active state - inner (for when you are pressing a normal button, or
+ * when a radio-type button is in a depressed state
+ */
border-color:#366dba;
background: #ededed url("../images/buttonActive.png") bottom repeat-x;
}
+
.tundra .dijitArrowButtonInner {
- background:url("../images/spriteArrows.png") no-repeat scroll 0px center;
+ background:url("../images/spriteArrows.png") no-repeat scroll 0 center;
width: 7px;
height: 7px;
- margin: 0px 4px 0px 4px;
+ margin: 0 4px 0 4px;
}
.tundra .dijitTextBox .dijitArrowButtonInner {
background-position: 0 center;
@@ -82,6 +99,7 @@
.tundra .dijitUpArrowButton .dijitArrowButtonInner {
background-position: -21px center;
}
+
.tundra .dijitDisabled .dijitArrowButtonInner {
background-position: -28px center;
}
@@ -95,13 +113,13 @@
background-position: -49px center;
}
.dj_webkit .tundra .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: -1px;
+ margin-top: -1px; /* image has too many blank pixels on top */
}
.dj_ie .tundra .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
- margin-top: -2px;
+ margin-top: -2px; /* image has too many blank pixels on top */
}
.dj_ie8 .tundra .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
- margin-top: -1px;
+ margin-top: -1px; /* image has too many blank pixels on top */
}
.tundra .dijitSpinnerButtonContainer {
width: auto;
diff --git a/lib/dijit/themes/tundra/form/Checkbox.css b/lib/dijit/themes/tundra/form/Checkbox.css
index e7ff2f945..28a7d79c9 100644
--- a/lib/dijit/themes/tundra/form/Checkbox.css
+++ b/lib/dijit/themes/tundra/form/Checkbox.css
@@ -1,45 +1,54 @@
.tundra .dijitToggleButton .dijitCheckBoxIcon {
background-image: url('../images/checkmarkNoBorder.png');
}
+
.dj_ie6 .tundra .dijitToggleButton .dijitCheckBoxIcon {
background-image: url('../images/checkmarkNoBorder.gif');
}
+
.tundra .dijitCheckBox,
-.tundra .dijitCheckBoxIcon {
- background-image: url('../images/checkmark.png');
+.tundra .dijitCheckBoxIcon /* inside a toggle button */ {
+ background-image: url('../images/checkmark.png'); /* checkbox sprite image */
background-repeat: no-repeat;
width: 16px;
height: 16px;
margin: 0 2px 0 0;
padding: 0;
}
+
.dj_ie6 .tundra .dijitCheckBox,
-.dj_ie6 .tundra .dijitCheckBoxIcon {
- background-image: url('../images/checkmark.gif');
+.dj_ie6 .tundra .dijitCheckBoxIcon /* inside a toggle button */ {
+ background-image: url('../images/checkmark.gif'); /* checkbox sprite image */
}
+
.tundra .dijitCheckBox,
.tundra .dijitToggleButton .dijitCheckBoxIcon {
-
+ /* unchecked */
background-position: -16px;
}
+
.tundra .dijitCheckBoxChecked,
.tundra .dijitToggleButtonChecked .dijitCheckBoxIcon {
-
- background-position: 0px;
+ /* checked */
+ background-position: 0;
}
+
.tundra .dijitCheckBoxDisabled {
-
+ /* disabled */
background-position: -48px;
}
+
.tundra .dijitCheckBoxCheckedDisabled {
-
+ /* disabled but checked */
background-position: -32px;
}
+
.tundra .dijitCheckBoxHover {
-
+ /* hovering over an unchecked enabled checkbox */
background-position: -80px;
}
+
.tundra .dijitCheckBoxCheckedHover {
-
+ /* hovering over a checked enabled checkbox */
background-position: -64px;
}
diff --git a/lib/dijit/themes/tundra/form/Common.css b/lib/dijit/themes/tundra/form/Common.css
index 999eb22ee..201368639 100644
--- a/lib/dijit/themes/tundra/form/Common.css
+++ b/lib/dijit/themes/tundra/form/Common.css
@@ -1,48 +1,76 @@
+/****
+ dijit.form.TextBox
+ dijit.form.ValidationTextBox
+ dijit.form.SerializableTextBox
+ dijit.form.RangeBoundTextBox
+ dijit.form.NumberTextBox
+ dijit.form.CurrencyTextBox
+ dijit.form.NumberSpinner
+ dijit.form.ComboBox (partial)
+ ****/
+
.tundra .dijitInputContainer INPUT,
.tundra .dijitTextBox {
- margin: 0em 0.1em;
+ margin: 0 0.1em;
}
+
.tundra .dijitTextArea {
padding: 3px;
}
+
.tundra .dijitTextBox {
-
+ /* For all except dijit.form.NumberSpinner: the actual input element.
+ For TextBox, ComboBox, Spinner: the div that contains the input.
+ Otherwise the actual input element.
+ */
background:#fff url("../images/validationInputBg.png") repeat-x top left;
#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
border:1px solid #b3b3b3;
}
+
+/* ComboBox specific rules*/
.tundra .dijitComboBox .dijitButtonNode {
padding: 0 0.2em;
}
.tundra .dijitTextBox .dijitButtonNode {
-
+ /* line between the input area and the drop down button, and also between
+ * the up and down buttons of a spinner
+ */
border-color: #9b9b9b;
}
+
.tundra .dijitTextBoxFocused {
-
+ /* input field when focused (ie: typing affects it) */
border-color:#406b9b;
}
.tundra .dijitTextBoxFocused .dijitButtonNode {
border-color:#366dba;
}
+
.tundra .dijitError {
background-color:#f9f7ba;
background-image:none;
}
+
.tundra .dijitErrorFocused {
background-color:#f9f999;
background-image:none;
}
+
+/* Validation errors */
.tundra .dijitValidationIcon {
-
+ /* prevent height change when widget goes from valid to invalid state */
width: 16px;
background: transparent url('../images/warning.png') no-repeat center center;
}
+
+/* The highlight is shown in the ComboBox menu. */
.tundra .dijitComboBoxHighlightMatch {
background-color:#a5beda;
}
+
.tundra .dijitFocusedLabel {
-
+ /* for checkboxes or radio buttons, hatch border around the corresponding label, to indicate focus */
outline: 1px dotted #666666;
}
diff --git a/lib/dijit/themes/tundra/form/RadioButton.css b/lib/dijit/themes/tundra/form/RadioButton.css
index 3044d0edb..4dfc0fa6d 100644
--- a/lib/dijit/themes/tundra/form/RadioButton.css
+++ b/lib/dijit/themes/tundra/form/RadioButton.css
@@ -1,7 +1,7 @@
-.tundra .dijitRadio,
-.tundra .dijitRadioIcon {
- background-image: url('../images/checkmark.png');
+.tundra .dijitRadio, /* stand alone */
+.tundra .dijitRadioIcon { /* inside a toggle button */
+ background-image: url('../images/checkmark.png'); /* checkbox sprite image */
background-repeat: no-repeat;
width: 16px;
height: 16px;
@@ -10,35 +10,43 @@
}
.dj_ie6 .tundra .dijitRadio,
.dj_ie6 .tundra .dijitRadioIcon {
- background-image: url('../images/checkmark.gif');
+ background-image: url('../images/checkmark.gif'); /* checkbox sprite image */
}
+
.tundra .dijitToggleButton .dijitRadioIcon {
-
+ /* for checkbox in a toggle button, override above setting to have no border */
background-image: url('../images/checkmarkNoBorder.png');
}
.dj_ie6 .tundra .dijitToggleButton .dijitRadioIcon {
background-image: url('../images/checkmarkNoBorder.gif');
}
+
.tundra .dijitRadio,
.tundra .dijitRadioIcon {
-
+ /* unselected */
background-position: -112px;
}
+
.tundra .dijitRadioDisabled {
-
+ /* unselected and disabled */
background-position: -144px;
}
+
.tundra .dijitRadioHover {
-
+ /* hovering over an unselected enabled radio button */
background-position: -176px;
}
+
.tundra .dijitRadioChecked,
.tundra .dijitRadioCheckedHover,
.tundra .dijitToggleButtonChecked .dijitRadioIcon {
-
+ /* selected. Since clicking a selected radio button doesn't change anything, there's
+ * no hover effect on selected radio buttons.
+ */
background-position: -96px;
}
+
.tundra .dijitRadioCheckedDisabled {
-
+ /* selected but disabled */
background-position: -128px;
}
diff --git a/lib/dijit/themes/tundra/form/Select.css b/lib/dijit/themes/tundra/form/Select.css
index 072b1204a..b0290167a 100644
--- a/lib/dijit/themes/tundra/form/Select.css
+++ b/lib/dijit/themes/tundra/form/Select.css
@@ -1,9 +1,11 @@
.tundra .dijitSelect .dijitButtonNode {
- padding: 0px;
+ padding: 0;
}
.tundra .dijitSelect .dijitButtonNode .dijitArrowButtonInner {
- margin: 0px 4px 0px 5px;
+ margin: 0 4px 0 5px;
}
+
+/* Make unselected content portion "look" more like a text box and less like a button */
.tundra .dijitSelect .dijitButtonContents {
padding-top: 1px;
background:#fff url("../images/validationInputBg.png") repeat-x top left;
@@ -17,8 +19,10 @@
background: transparent none;
}
.dj_ie .tundra .dijitSelect .dijitButtonContents {
- padding-top: 0px;
+ padding-top: 0;
}
+
+/* Mirror DropDownButton */
.tundra .dijitSelectDisabled .dijitButtonNode {
border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
background:#e4e4e4 url("../images/buttonDisabled.png") top repeat-x;
@@ -26,6 +30,7 @@
.dj_ie .tundra .dijitSelectDisabled .dijitButtonNode * {
filter: gray() alpha(opacity=50);
}
+
.tundra .dijitSelectHover .dijitButtonNode {
border-color:#a5beda;
border-bottom-color:#5c7590;
@@ -33,15 +38,20 @@
color:#243C5F;
background:#fcfdff url("../images/buttonHover.png") repeat-x bottom;
}
+
.tundra .dijitSelectActive .dijitButtonNode,
.tundra .dijitSelectOpened .dijitButtonNode {
border-color:#366dba;
background: #ededed url("../images/buttonActive.png") bottom repeat-x;
}
+
+/* Make the menu look more combobox-like */
.tundra .dijitSelectMenu td {
- padding: 0em;
+ padding: 0;
}
.tundra .dijitSelectMenu .dijitMenuItemLabel,
.tundra .dijitSelectMenu .dijitMenuArrowCell {
padding: 0.1em 0.2em;
}
+
+
diff --git a/lib/dijit/themes/tundra/form/Slider.css b/lib/dijit/themes/tundra/form/Slider.css
index b2c2b69f8..7465e8377 100644
--- a/lib/dijit/themes/tundra/form/Slider.css
+++ b/lib/dijit/themes/tundra/form/Slider.css
@@ -2,26 +2,32 @@
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFull.png") repeat-x top left;
}
+
.tundra .dijitSliderProgressBarV {
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFullVertical.png") repeat-y bottom left;
}
+
.tundra .dijitSliderFocused .dijitSliderProgressBarH,
.tundra .dijitSliderFocused .dijitSliderLeftBumper {
background-image:url("../images/sliderFullFocus.png");
}
+
.tundra .dijitSliderFocused .dijitSliderProgressBarV,
.tundra .dijitSliderFocused .dijitSliderBottomBumper {
background-image:url("../images/sliderFullVerticalFocus.png");
}
+
.tundra .dijitSliderRemainingBarV {
border-color: #b4b4b4;
background: #dcdcdc url("../images/sliderEmptyVertical.png") repeat-y bottom left;
}
+
.tundra .dijitSliderRemainingBarH {
border-color: #b4b4b4;
background: #dcdcdc url("../images/sliderEmpty.png") repeat-x top left;
}
+
.tundra .dijitSliderBar {
border-style: solid;
outline:1px;
@@ -29,8 +35,9 @@
.tundra .dijitSliderFocused .dijitSliderBar {
border-color:#888;
}
+
.tundra .dijitSliderImageHandleH {
- border:0px;
+ border:0;
width:16px;
height:16px;
background:url("../images/preciseSliderThumb.png") no-repeat center top;
@@ -39,41 +46,49 @@
background-image:url("../images/preciseSliderThumbFocus.png");
#background-image:url("../images/preciseSliderThumbFocus.gif");
}
+
.dj_ie6 .tundra .dijitSliderImageHandleH {
background-image:url("../images/preciseSliderThumb.gif");
}
+
.tundra .dijitSliderLeftBumper {
border-left-width: 1px;
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFull.png") repeat-x top left;
}
+
.tundra .dijitSliderRightBumper {
background: #dcdcdc url("../images/sliderEmpty.png") repeat-x top left;
border-color: #b4b4b4;
border-right-width: 1px;
}
+
.tundra .dijitSliderImageHandleV {
- border:0px;
+ border:0;
width:16px;
height:16px;
background:url("../images/sliderThumb.png") no-repeat center center;
}
+
.tundra .dijitSliderFocused .dijitSliderImageHandleV {
background-image:url("../images/sliderThumbFocus.png");
}
.dj_ie6 .tundra .dijitSliderFocused .dijitSliderImageHandleV {
background-image:url("../images/sliderThumbFocus.gif");
}
+
.tundra .dijitSliderBottomBumper {
border-bottom-width: 1px;
border-color: #aab0bb;
background: #c0c2c5 url("../images/sliderFullVertical.png") repeat-y bottom left;
}
+
.tundra .dijitSliderTopBumper {
background: #dcdcdc url("../images/sliderEmptyVertical.png") repeat-y top left;
border-color: #b4b4b4;
border-top-width: 1px;
}
+
.tundra .dijitSliderDecrementIconH,
.tundra .dijitSliderDecrementIconV,
.tundra .dijitSliderIncrementIconH,
@@ -91,21 +106,24 @@
.dj_ie6 .tundra .dijitSliderIncrementIconV {
background-image: url('../images/spriteArrows.gif');
}
+
.tundra .dijitSliderDecrementIconH {
- background-position: -7px 0px;
+ background-position: -7px 0;
}
.tundra .dijitSliderIncrementIconH {
- background-position: -14px 0px;
+ background-position: -14px 0;
}
.tundra .dijitSliderDecrementIconV {
- background-position: 0px 0px;
+ background-position: 0 0;
}
.tundra .dijitSliderIncrementIconV {
- background-position: -21px 0px;
+ background-position: -21px 0;
}
+
.tundra .dijitSliderButtonInner {
visibility:hidden;
}
+
.tundra .dijitSliderReadOnly *,
.tundra .dijitSliderDisabled * {
border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
@@ -113,17 +131,17 @@
}
.tundra .dijitSliderReadOnly .dijitSliderDecrementIconH,
.tundra .dijitSliderDisabled .dijitSliderDecrementIconH {
- background-position: -35px 0px;
+ background-position: -35px 0;
}
.tundra .dijitSliderReadOnly .dijitSliderIncrementIconH,
.tundra .dijitSliderDisabled .dijitSliderIncrementIconH {
- background-position: -42px 0px;
+ background-position: -42px 0;
}
.tundra .dijitSliderReadOnly .dijitSliderDecrementIconV,
.tundra .dijitSliderDisabled .dijitSliderDecrementIconV {
- background-position: -28px 0px;
+ background-position: -28px 0;
}
.tundra .dijitSliderReadOnly .dijitSliderIncrementIconV,
.tundra .dijitSliderDisabled .dijitSliderIncrementIconV {
- background-position: -49px 0px;
-}
+ background-position: -49px 0;
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/form/Slider_rtl.css b/lib/dijit/themes/tundra/form/Slider_rtl.css
index 979eed651..9375c4ecb 100644
--- a/lib/dijit/themes/tundra/form/Slider_rtl.css
+++ b/lib/dijit/themes/tundra/form/Slider_rtl.css
@@ -5,22 +5,27 @@
.tundra .dijitSliderRtl .dijitSliderTopBumper {
background-position: top right;
}
+
.tundra .dijitSliderRtl .dijitSliderProgressBarV,
.tundra .dijitSliderRtl .dijitSliderRemainingBarV,
.tundra .dijitSliderRtl .dijitSliderBottomBumper {
background-position: bottom right;
}
+
.tundra .dijitSliderRtl .dijitSliderLeftBumper {
- border-left-width: 0px;
+ border-left-width: 0;
border-right-width: 1px;
}
+
.tundra .dijitSliderRtl .dijitSliderRightBumper {
border-left-width: 1px;
- border-right-width: 0px;
+ border-right-width: 0;
}
+
.tundra .dijitSliderRtl .dijitSliderIncrementIconH {
- background-position: -7px 0px;
+ background-position: -7px 0;
}
+
.tundra .dijitSliderRtl .dijitSliderDecrementIconH {
- background-position: -14px 0px;
+ background-position: -14px 0;
}
diff --git a/lib/dijit/themes/tundra/layout/AccordionContainer.css b/lib/dijit/themes/tundra/layout/AccordionContainer.css
index 6479956e6..c5621efab 100644
--- a/lib/dijit/themes/tundra/layout/AccordionContainer.css
+++ b/lib/dijit/themes/tundra/layout/AccordionContainer.css
@@ -1,20 +1,26 @@
+/* Accordion */
.tundra .dijitAccordionContainer {
border-color: #ccc;
background-color: #fff;
}
+
+/* common */
+
.tundra .dijitAccordionTitle {
background:#fafafa url("../images/titleBar.png") repeat-x bottom left;
border-top: 1px solid #bfbfbf;
padding: 4px 4px 4px 8px;
}
+
.tundra .dijitAccordionTitleHover {
background: #f8fafd url("../images/accordionItemHover.gif") bottom repeat-x;
}
+
.tundra .dijitAccordionTitleSelected {
background: #f9f9f9 url("../images/accordionItemActive.gif") bottom repeat-x;
font-weight: bold;
border-top: 1px solid #aaaaaa;
border-bottom: 1px solid #bfbfbf;
padding: 4px 4px 4px 8px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/layout/BorderContainer.css b/lib/dijit/themes/tundra/layout/BorderContainer.css
index 076460f15..0dd1b1b51 100644
--- a/lib/dijit/themes/tundra/layout/BorderContainer.css
+++ b/lib/dijit/themes/tundra/layout/BorderContainer.css
@@ -1,49 +1,63 @@
+/* BorderContainer */
.tundra .dijitBorderContainer {
background-color: #fcfcfc;
padding: 5px;
}
+
.tundra .dijitSplitContainer-child,
.tundra .dijitBorderContainer-child {
-
+ /* By default put borders on all children of BorderContainer,
+ * to give illusion of borders on the splitters themselves.
+ */
border: 1px #ccc solid;
}
+
.tundra .dijitBorderContainer-dijitTabContainerTop,
.tundra .dijitBorderContainer-dijitTabContainerBottom,
.tundra .dijitBorderContainer-dijitTabContainerLeft,
.tundra .dijitBorderContainer-dijitTabContainerRight {
-
+ /* except that TabContainer defines borders on it's sub-nodes (tablist and dijitTabPaneWrapper),
+ * so override rule setting border on domNode
+ */
border: none;
}
+
.tundra .dijitBorderContainer-dijitBorderContainer {
-
+ /* also, make nested BorderContainers look like a single big widget with lots of splitters */
border: none;
- padding: 0px;
+ padding: 0;
}
+
.tundra .dijitSplitterH,
.tundra .dijitGutterH {
background:#fcfcfc;
border:0;
height:5px;
}
+
.tundra .dijitSplitterH .dijitSplitterThumb {
background:#B0B0B0 none;
height:1px;
top:2px;
width:19px;
}
+
.tundra .dijitSplitterV,
.tundra .dijitGutterV {
background:#fcfcfc;
border:0;
width:5px;
}
+
.tundra .dijitSplitterV .dijitSplitterThumb {
background:#B0B0B0 none;
height:19px;
left:2px;
width:1px;
}
+
+/* active splitter */
.tundra .dijitSplitterActive {
font-size: 1px;
background-image: none;
diff --git a/lib/dijit/themes/tundra/layout/ContentPane.css b/lib/dijit/themes/tundra/layout/ContentPane.css
index 8b470b938..21d25d524 100644
--- a/lib/dijit/themes/tundra/layout/ContentPane.css
+++ b/lib/dijit/themes/tundra/layout/ContentPane.css
@@ -1,7 +1,10 @@
+/* ContentPane */
.tundra .dijitContentPane {
- padding: 0px;
+ padding: 0;
}
+
+/* nested layouts */
.tundra .dijitTabContainerTop-dijitContentPane,
.tundra .dijitTabContainerLeft-dijitContentPane,
.tundra .dijitTabContainerBottom-dijitContentPane,
@@ -10,8 +13,9 @@
background-color: #fff;
padding: 5px;
}
+
.tundra .dijitSplitContainer-dijitContentPane,
.tundra .dijitBorderContainer-dijitContentPane {
- background-color: #fff;
+ background-color: #fff; /* override background-color setting on parent .dijitBorderContainer */
padding: 5px;
-}
+} \ No newline at end of file
diff --git a/lib/dijit/themes/tundra/layout/SplitContainer.css b/lib/dijit/themes/tundra/layout/SplitContainer.css
index 278503116..5a3eed6c9 100644
--- a/lib/dijit/themes/tundra/layout/SplitContainer.css
+++ b/lib/dijit/themes/tundra/layout/SplitContainer.css
@@ -5,6 +5,7 @@
border-right:1px solid #bfbfbf;
width:7px;
}
+
.tundra .dijitSplitContainerSizerH .thumb {
background:url("../images/splitContainerSizerV-thumb.png") no-repeat #ccc;
left:1px;
@@ -12,6 +13,7 @@
height:19px;
overflow: hidden;
}
+
.tundra .dijitSplitContainerSizerV {
background:url("../images/splitContainerSizerH.png") repeat-x #fff;
border:0;
@@ -19,6 +21,7 @@
border-bottom:1px solid #bfbfbf;
height:7px;
}
+
.tundra .dijitSplitContainerSizerV .thumb {
background:url("../images/splitContainerSizerH-thumb.png") no-repeat #ccc;
top:1px;
diff --git a/lib/dijit/themes/tundra/layout/TabContainer.css b/lib/dijit/themes/tundra/layout/TabContainer.css
index 8e859b9b4..667da4ad9 100644
--- a/lib/dijit/themes/tundra/layout/TabContainer.css
+++ b/lib/dijit/themes/tundra/layout/TabContainer.css
@@ -1,42 +1,51 @@
-
+/* Tabs, shared classes */
.tundra .dijitTabPaneWrapper {
background:#fff;
border:1px solid #ccc;
margin: 0;
padding: 0;
}
+
.tundra .dijitTab {
line-height:normal;
- margin-right:4px;
- padding:0px;
+ margin-right:4px; /* space between one tab and the next in top/bottom mode */
+ padding:0;
border:1px solid #ccc;
background:#e2e2e2 url("../images/tabEnabled.png") repeat-x;
}
+
.tundra .dijitTabInnerDiv {
padding:2px 8px 2px 9px;
}
+
.tundra .dijitTabSpacer {
display: none;
}
+
.tundra .dijitTabContainer .tabStripRBtn {
margin-right: 20px;
}
.tundra .dijitTabContainer .tabStripLBtn {
margin-left: 20px;
}
+
.tundra .nowrapTabStrip .dijitTab {
top: 2px;
}
.tundra .dijitTabContainerBottom .nowrapTabStrip .dijitTab {
- top: 0px;
+ top: 0;
bottom: 2px;
}
+
+/* checked tab*/
.tundra .dijitTabChecked {
-
+ /* the selected tab (with or without hover) */
background-color:#fff;
border-color: #ccc;
background-image:none;
}
+
+/* hovered tab */
.tundra .dijitTabHover {
color: #243C5F;
border-top-color:#92a0b3;
@@ -45,38 +54,49 @@
border-bottom-color:#92a0b3;
background:#e2e2e2 url("../images/tabHover.gif") repeat-x;
}
+
.tundra .dijitTabContainerTop .dijitTabHover {
border-bottom-color:#ccc;
}
+
.tundra .dijitTabContainerBottom .dijitTabHover {
border-top-color:#ccc;
}
+
.tundra .dijitTabContainerLeft .dijitTabHover {
border-right-color:#ccc;
}
+
.tundra .dijitTabContainerRight .dijitTabHover {
border-left-color:#ccc;
}
+
.tundra .dijitTabContainer .dijitTabCheckedHover {
color: inherit;
border:1px solid #ccc;
background:#fff;
}
+
.tundra .dijitTab .tabLabel {
-
+ /* make sure tabs w/close button and w/out close button are same height, even w/small (<12px) font */
min-height: 12px;
display: inline-block;
}
+
+/* Nested Tabs */
+
.tundra .dijitTabContainerNested .dijitTabListWrapper {
height: auto;
}
+
.tundra .dijitTabContainerNested .dijitTabContainerTop-tabs {
border-bottom: 1px solid #CCC;
}
+
.tundra .dijitTabContainerTabListNested .dijitTab {
background: none;
border: none;
- top: 0px;
+ top: 0; /* to override top: 1px/-1px for normal tabs */
}
.tundra .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
}
@@ -86,11 +106,14 @@
.tundra .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent .tabLabel {
text-decoration: underline;
font-weight: bold;
-
+ /*background:#f3f3f3;*/
}
.tundra .dijitTabContainer .dijitTabPaneWrapperNested {
- border: none;
+ border: none; /* prevent double border */
}
+
+/* Close button */
+
.tundra .dijitTabCloseButton {
background: url("../images/tabClose.png") no-repeat right top;
width: 12px;
@@ -99,33 +122,45 @@
.dj_ie6 .tundra .dijitTabCloseButton {
background-image : url("../images/tabClose.gif");
}
+
.tundra .dijitTabCloseButtonHover {
background-image : url("../images/tabCloseHover.png");
}
.dj_ie6 .tundra .dijitTabCloseButtonHover {
background-image : url("../images/tabCloseHover.gif");
}
+
+/* ================================ */
+/* top tabs */
+
.tundra .dijitTabContainerTop-tabs {
- margin-bottom: 0px;
+ margin-bottom: 0;
border-color: #cccccc;
padding-left: 3px;
background-position: bottom;
}
.tundra .dijitTabContainerTop-tabs .dijitTab {
- top: 0px;
+ top: 0;
margin-bottom: -1px;
}
+
+/* top container */
.tundra .dijitTabContainerTop-container {
border-top: none;
}
+
+/* checked tabs */
.tundra .dijitTabContainerTop-tabs .dijitTabChecked {
border-bottom-color:white;
}
+
.tundra .dijitTabContainerTop-tabs,
.tundra .dijitTabContainerBottom-tabs {
padding-left: 3px;
padding-right: 3px;
}
+
+/* strip */
.tundra .dijitTabContainerTopStrip {
border-top: 1px solid #CCC;
border-right: 1px solid #CCC;
@@ -133,96 +168,142 @@
padding-top: 2px;
background: #f2f2f2;
}
+
.tundra .dijitTabContainerTopNone {
- padding-top: 0px;
+ padding-top: 0;
}
+
+
+/* ================================ */
+/* bottom tabs */
.tundra .dijitTabContainerBottom-tabs {
- margin-top: 0px;
+ margin-top: 0;
border-color: #cccccc;
background-position: top;
padding-left: 3px;
}
.tundra .dijitTabContainerBottom-tabs .dijitTab {
- bottom: 0px;
+ bottom: 0;
margin-top: -1px;
}
+
+/* bottom container */
.tundra .dijitTabContainerBottom-container {
border-bottom: none;
}
+
+/* checked tabs */
.tundra .dijitTabContainerBottom-tabs .dijitTabChecked {
border-top-color:white;
}
+
+/* strip */
.tundra .dijitTabContainerBottomStrip {
padding-bottom: 2px;
border: 1px solid #ccc;
background: #f2f2f2;
border-top: none;
}
+
+/* ================================ */
+/* right tabs */
.tundra .dijitTabContainerRight-tabs {
border-color: #ccc;
height: 100%;
padding-top: 3px;
}
+
.tundra .dijitTabContainerRightStrip {
margin-left: -1px;
}
+
+/* right container */
.tundra .dijitTabContainerRight-container {
border-right: none;
}
+
+/* checked tabs */
.tundra .dijitTabContainerRight-tabs .dijitTabChecked {
border-left-color:white;
}
+
+/* strip */
.tundra .dijitTabContainerRightStrip {
padding-right: 2px;
border: 1px solid #ccc;
}
+
.tundra .dijitTabContainerRightStrip {
background: #f2f2f2;
}
+
+/* ================================ */
+/* left tabs */
.tundra .dijitTabContainerLeft-tabs {
border-color: #ccc;
padding-top: 3px;
height: 100%;
}
+
+/* left conatiner */
.tundra .dijitTabContainerLeft-container {
border-left: none;
}
+
+/* checked tabs */
.tundra .dijitTabContainerLeft-tabs .dijitTabChecked {
border-right-color:white;
}
+
+/* strip */
.tundra .dijitTabContainerLeftStrip {
padding-left: 2px;
border: 1px solid #ccc;
background: #f2f2f2;
border-right: none;
}
+
+/* ================================ */
+/* left/right tabs */
.tundra .dijitTabContainerLeft-tabs .dijitTab,
.tundra .dijitTabContainerRight-tabs .dijitTab {
- margin-right:0px;
- margin-bottom:4px;
+ margin-right:0;
+ margin-bottom:4px; /* space between one tab and the next in left/right mode */
}
+
+/* ================================ */
+
+/* this resets the tabcontainer stripe when within a contentpane */
.tundra .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
- border-left: 0px solid #ccc;
- border-top: 0px solid #ccc;
- border-right: 0px solid #ccc;
- padding-top: 0px;
- padding-left: 0px;
+ border-left: 0 solid #ccc;
+ border-top: 0 solid #ccc;
+ border-right: 0 solid #ccc;
+ padding-top: 0;
+ padding-left: 0;
}
+
+/* ================================ */
+
+/* Menu and slider control styles */
.tundra .dijitTabContainer .tabStripButton {
margin-right: 0;
padding-top: 2px;
z-index: 12;
}
+
.tundra .dijitTabContainerBottom .tabStripButton {
padding-top: 2px;
}
+
.tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
padding-bottom: 3px;
padding-top: 1px;
}
+
.tundra .tabStripButton .dijitTabInnerDiv {
padding: 3px 2px 4px 2px;
}
+
.dj_ie6 .tundra .tabStripButton .dijitTabInnerDiv,
.dj_ie7 .tundra .tabStripButton .dijitTabInnerDiv,
.dj_opera .tundra .tabStripButton .dijitTabInnerDiv {
@@ -233,17 +314,22 @@
.dj_opera .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
padding-bottom: 4px;
}
+
.tundra .dijitTabStripIcon {
height: 14px;
width: 14px;
background: url(../images/spriteRoundedIconsSmall.png) no-repeat left top ;
}
+
.dj_ie6 .tundra .dijitTabStripIcon {
background-image: url(../images/spriteRoundedIconsSmall.gif);
}
+
.tundra .dijitTabStripSlideRightIcon {
background-position: -30px top;
}
+
.tundra .dijitTabStripMenuIcon {
background-position: -15px top;
}
+
diff --git a/lib/dijit/themes/tundra/layout/TabContainer_rtl.css b/lib/dijit/themes/tundra/layout/TabContainer_rtl.css
index 1811a5b6c..fb8e28e9b 100644
--- a/lib/dijit/themes/tundra/layout/TabContainer_rtl.css
+++ b/lib/dijit/themes/tundra/layout/TabContainer_rtl.css
@@ -2,37 +2,50 @@
-moz-box-orient:horizontal;
text-align: right;
}
+
.tundra .dijitTabRtl .dijitTabInnerDiv {
padding:2px 9px 2px 8px;
}
+
.tundra .tabStrip-disabled .tabStripButtonRtl .dijitTabInnerDiv {
-
+ /* this is not special for RTL mode, but just here to override rule above (for enabled tabstrip) */
padding-bottom: 3px;
padding-top: 1px;
}
+
.tundra .tabStripButtonRtl .dijitTabInnerDiv {
padding: 3px 2px 4px 2px;
}
+
.tundra .dijitTabPaneWrapper {
#zoom: 1;
}
+
.dj_ie-rtl .tundra .dijitTabContainerLeft-tabs {
margin-left: 1px !important;
}
+
.dj_ie-rtl .tundra .dijitTabContainerRight-tabs {
margin-right: 1px !important;
}
+
.tundra .dijitTabContainerLeft-tabs .dijitTabRtl,
.tundra .dijitTabContainerRight-tabs .dijitTabRtl {
- margin-left:0px;
+ margin-left:0;
}
+
.dj_ie .tundra .dijitTabRtl .dijitTabInnerDiv {
-
+ /* without this the tab label and icon become invisible, as though they were set to visibility:hidden */
width : 0.1% !important;
}
+
+
+
.dj_iequirks-rtl .tundra .dijitTabContainerTopNone,
.dj_iequirks-rtl .tundra .dijitTabContainerBottomNone {
-
+ /* this strange rule prevents IE6 bug in themeTesterQuirk.html?dir=rtl upon closing
+ * "Closable" tab, where the other tabs disappear
+ */
border-left: 1px solid #fff;
border-right: 1px solid #fff;
}
diff --git a/lib/dijit/themes/tundra/tundra.css b/lib/dijit/themes/tundra/tundra.css
index ee23609b6..f1d239c88 100644
--- a/lib/dijit/themes/tundra/tundra.css
+++ b/lib/dijit/themes/tundra/tundra.css
@@ -1,3437 +1,41 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
-.dijitReset {
-
- margin:0;
- border:0;
- padding:0;
- line-height:normal;
- font: inherit;
- color: inherit;
-}
-.dijit_a11y .dijitReset {
- -moz-appearance: none;
-}
-.dijitInline {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
- border:0;
- padding:0;
- vertical-align:middle;
- #vertical-align: auto;
-}
-.dijitHidden {
-
- display: none !important;
-}
-.dijitVisible {
-
- display: block !important;
- position: relative;
-}
-.dijitInputContainer {
-
- #zoom: 1;
- overflow: hidden;
- float: none !important;
- position:relative;
-}
-.dj_ie INPUT.dijitTextBox,
-.dj_ie .dijitTextBox INPUT {
- font-size: 100%;
-}
-.dijitTextBox .dijitSpinnerButtonContainer,
-.dijitTextBox .dijitArrowButtonContainer,
-.dijitTextBox .dijitValidationContainer {
- float: right;
- text-align: center;
-}
-.dijitTextBox INPUT.dijitInputField {
-
- padding-left: 0 !important;
- padding-right: 0 !important;
-}
-.dijitTextBox .dijitValidationContainer {
- display: none;
-}
-.dijitInlineTable {
-
- display:inline-table;
- display:inline-block;
- #zoom: 1;
- #display:inline;
- box-sizing: content-box; -moz-box-sizing: content-box;
- border:0;
- padding:0;
-}
-.dijitTeeny {
- font-size:1px;
- line-height:1px;
-}
-.dijitOffScreen {
- position: absolute;
- visibility: hidden;
- left: 50%;
- top: -10000px;
-}
-.dijitPopup {
- position: absolute;
- background-color: transparent;
- margin: 0;
- border: 0;
- padding: 0;
-}
-.dijit_a11y .dijitPopup,
-.dijit_ally .dijitPopup DIV,
-.dijit_a11y .dijitPopup TABLE,
-.dijit_a11y .dijitTooltipContainer {
- background-color: white !important;
-}
-.dijitPositionOnly {
-
- padding: 0 !important;
- border: 0 !important;
- background-color: transparent !important;
- background-image: none !important;
- height: auto !important;
- width: auto !important;
-}
-.dijitNonPositionOnly {
-
- float: none !important;
- position: static !important;
- margin: 0 0 0 0 !important;
- vertical-align: middle !important;
-}
-.dijitBackgroundIframe {
-
- position: absolute;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- border: 0;
- padding: 0;
- margin: 0;
-}
-.dijitDisplayNone {
-
- display:none !important;
-}
-.dijitContainer {
-
- overflow: hidden;
-}
-.dijit_a11y * {
- background-image:none !important;
-}
-.dijit_a11y .dijitIcon,
-.dijit_a11y DIV.dijitArrowButtonInner,
-.dijit_a11y SPAN.dijitArrowButtonInner,
-.dijit_a11y IMG.dijitArrowButtonInner,
-.dijit_a11y .dijitCalendarIncrementControl {
-
- display: none;
-}
-.dijitSpinner DIV.dijitArrowButtonInner {
- display: block;
-}
-.dijit_a11y .dijitA11ySideArrow {
- display: inline !important;
- cursor: pointer;
-}
-.dijit_a11y .dijitCalendarDateLabel {
- padding: 1px;
-}
-.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
- border-style: dotted !important;
- border-width: 1px;
- padding: 0px;
-}
-.dijit_a11y .dijitCalendarDateTemplate {
- padding-bottom: 0.1em !important;
-}
-.dijit_a11y .dijit * {
- background:white !important;
- color:black !important;
-}
-.dijit_a11y .dijitButtonNode {
- border-color: black!important;
- border-style: outset!important;
- border-width: medium!important;
-}
-.dijit_a11y .dijitTextBoxReadOnly .dijitInputField,
-.dijit_a11y .dijitTextBoxReadOnly .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
-.dijitButtonNode * {
- vertical-align: middle;
-}
-.dijitButtonNode .dijitArrowButtonInner {
-
- background: no-repeat center;
- width: 12px;
- height: 12px;
- direction: ltr;
-}
-.dijitLeft {
-
- background-position:left top;
- background-repeat:no-repeat;
-}
-.dijitStretch {
-
- white-space:nowrap;
- background-repeat:repeat-x;
-}
-.dijitRight {
-
- #display:inline;
- background-position:right top;
- background-repeat:no-repeat;
-}
-.dijitToggleButton,
-.dijitButton,
-.dijitDropDownButton,
-.dijitComboButton {
-
- margin: 0.2em;
-}
-.dijitButtonContents {
- display: block;
-}
-td.dijitButtonContents {
- display: table-cell;
-}
-.dijitButtonNode IMG {
-
- vertical-align:middle;
-
-}
-TABLE.dijitComboButton {
-
- border-collapse: collapse;
- border:0;
- padding:0;
- margin:0;
-}
-.dijitToolbar .dijitComboButton {
-
- border-collapse: separate;
-}
-.dijitToolbar .dijitToggleButton,
-.dijitToolbar .dijitButton,
-.dijitToolbar .dijitDropDownButton,
-.dijitToolbar .dijitComboButton {
- margin: 0;
-}
-.dijitToolbar .dijitButtonContents {
-
- padding: 1px 2px;
-}
-.dj_ie .dijitComboButton {
-
- margin-bottom: -3px;
-}
-.dj_webkit .dijitToolbar .dijitDropDownButton {
- padding-left: 0.3em;
-}
-.dj_gecko .dijitToolbar .dijitButtonNode::-moz-focus-inner {
- padding:0;
-}
-.dijitButtonNode {
-
- border:1px solid gray;
- margin:0;
- line-height:normal;
- vertical-align: middle;
- #vertical-align: auto;
- text-align:center;
- white-space: nowrap;
-}
-.dj_webkit .dijitSpinner .dijitSpinnerButtonContainer {
-
- line-height:inherit;
-}
-.dijitTextBox .dijitButtonNode {
- border-width: 0;
-}
-.dijitButtonNode,
-.dijitButtonNode * {
- cursor: pointer;
-}
-.dj_ie .dijitButtonNode {
-
- zoom: 1;
-}
-.dj_ie .dijitButtonNode button {
-
- overflow: visible;
-}
-DIV.dijitArrowButton {
- float: right;
-}
-.dijitTextBox {
- border: solid black 1px;
- #overflow: hidden;
- width: 15em;
- vertical-align: middle;
- #vertical-align: auto;
-}
-.dijitTextBoxReadOnly,
-.dijitTextBoxDisabled {
- color: gray;
-}
-.dj_webkit .dijitTextBoxDisabled INPUT {
- color: #eee;
-}
-.dj_webkit TEXTAREA.dijitTextAreaDisabled {
- color: #333;
-}
-.dj_gecko .dijitTextBoxReadOnly INPUT,
-.dj_gecko .dijitTextBoxDisabled INPUT {
- -moz-user-input: none;
-}
-.dijitPlaceHolder {
-
- color: #AAAAAA;
- font-style: italic;
- position: absolute;
- top: 0;
- left: 0;
- #filter: "";
-}
-.dijitTimeTextBox {
- width: 8em;
-}
-.dijitTextBox INPUT:focus {
- outline: none;
-}
-.dijitTextBoxFocused {
- outline: auto 5px -webkit-focus-ring-color;
-}
-.dijitTextBox INPUT {
- float: left;
-}
-.dijitInputInner {
-
- border:0 !important;
- vertical-align:middle !important;
- background-color:transparent !important;
- width:100% !important;
-
- padding-left: 0 !important;
- padding-right: 0 !important;
- margin-left: 0 !important;
- margin-right: 0 !important;
-}
-.dijit_a11y .dijitTextBox INPUT {
- margin: 0 !important;
-}
-.dijitTextBoxError INPUT.dijitValidationInner,
-.dijitTextBox INPUT.dijitArrowButtonInner {
-
- text-indent: -1em !important;
- direction: ltr !important;
- text-align: left !important;
- height: auto !important;
- #text-indent: 0 !important;
- #letter-spacing: -5em !important;
- #text-align: right !important;
-}
-.dj_ie .dijitTextBox INPUT,
-.dj_ie INPUT.dijitTextBox {
- overflow-y: visible;
- line-height: normal;
-}
-.dj_ie7 .dijitTextBox INPUT.dijitValidationInner,
-.dj_ie7 .dijitTextBox INPUT.dijitArrowButtonInner {
- line-height: 86%;
-}
-.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%;
-}
-.dijit_a11y INPUT.dijitValidationInner,
-.dijit_a11y INPUT.dijitArrowButtonInner {
-
- text-indent: 0 !important;
- width: 1em !important;
- #text-align: left !important;
-}
-.dijitTextBoxError .dijitValidationContainer {
- display: inline;
- cursor: default;
-}
-.dijitSpinner .dijitSpinnerButtonContainer,
-.dijitComboBox .dijitArrowButtonContainer {
-
- border-width: 0 0 0 1px !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
-
- border-width: 0;
-}
-.dj_ie .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
- clear: both;
-}
-.dijit_a11y .dijitTextBox .dijitValidationContainer,
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBox .dijitArrowButtonContainer {
-
- border: solid black !important;
- border-width: 0 0 0 1px !important;
-}
-.dj_ie .dijitToolbar .dijitComboBox {
-
- vertical-align: middle;
-}
-.dijitTextBox .dijitSpinnerButtonContainer {
- width: 1em;
- position: relative !important;
- overflow: hidden;
-}
-.dijitSpinner .dijitSpinnerButtonInner {
- width:1em;
- visibility:hidden !important;
- overflow-x:hidden;
-}
-.dijitComboBox .dijitButtonNode,
-.dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 0;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border: 0 none !important;
-}
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner,
-.dijit_a11y .dijitSpinnerButtonContainer INPUT {
- width: 1em !important;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner {
- margin: 0 auto !important;
-}
-.dj_ie .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.3em !important;
- padding-right: 0.3em !important;
- margin-left: 0.3em !important;
- margin-right: 0.3em !important;
- width: 1.4em !important;
-}
-.dj_ie7 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding-left: 0.0em !important;
- padding-right: 0.0em !important;
- width: 1em !important;
-}
-.dj_ie6 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- margin-left: 0.1em !important;
- margin-right: 0.1em !important;
- width: 1em !important;
-}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- margin-left: 0 !important;
- margin-right: 0 !important;
- width: 2em !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
-
- padding: 0;
- position: absolute !important;
- right: 0;
- float: none;
- height: 50%;
- width: 100%;
- bottom: auto;
- left: 0;
- right: auto;
-}
-.dj_iequirks .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: auto;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitArrowButton {
- overflow: visible !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitDownArrowButton {
- top: 50%;
- border-top-width: 1px !important;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitUpArrowButton {
- #bottom: 50%;
- top: 0;
-}
-.dijitSpinner .dijitArrowButtonInner {
- margin: auto;
- overflow-x: hidden;
- height: 100% !important;
-}
-.dj_iequirks .dijitSpinner .dijitArrowButtonInner {
- height: auto !important;
-}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- -moz-transform: scale(0.5);
- -moz-transform-origin: center top;
- -webkit-transform: scale(0.5);
- -webkit-transform-origin: center top;
- -o-transform: scale(0.5);
- -o-transform-origin: center top;
- transform: scale(0.5);
- transform-origin: left top;
- padding-top: 0;
- padding-bottom: 0;
- padding-left: 0 !important;
- padding-right: 0 !important;
- width: 100%;
-}
-.dj_ie .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- zoom: 50%;
-}
-.dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButtonInner {
- overflow: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 100%;
-}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 1em;
-}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- visibility: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- vertical-align:top;
- visibility: visible;
-}
-.dijit_a11y .dijitSpinnerButtonContainer {
- width: 1em;
-}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 1px 0px 0px 0px;
- border-style: solid !important;
-}
-.dijitCheckBox,
-.dijitRadio,
-.dijitCheckBoxInput {
- padding: 0;
- border: 0;
- width: 16px;
- height: 16px;
- background-position:center center;
- background-repeat:no-repeat;
- overflow: hidden;
-}
-.dijitCheckBox INPUT,
-.dijitRadio INPUT {
- margin: 0;
- padding: 0;
- display: block;
-}
-.dijitCheckBoxInput {
-
- opacity: 0.01;
-}
-.dj_ie .dijitCheckBoxInput {
- filter: alpha(opacity=0);
-}
-.dijit_a11y .dijitCheckBox,
-.dijit_a11y .dijitRadio {
-
- width: auto !important;
- height: auto !important;
-}
-.dijit_a11y .dijitCheckBoxInput {
- opacity: 1;
- filter: none;
- width: auto;
- height: auto;
-}
-.dijitProgressBarEmpty {
-
- position:relative;overflow:hidden;
- border:1px solid black;
- z-index:0;
-}
-.dijitProgressBarFull {
-
- position:absolute;
- overflow:hidden;
- z-index:-1;
- top:0;
- width:100%;
-}
-.dj_ie6 .dijitProgressBarFull {
- height:1.6em;
-}
-.dijitProgressBarTile {
-
- position:absolute;
- overflow:hidden;
- top:0;
- left:0;
- bottom:0;
- right:0;
- margin:0;
- padding:0;
- width:auto;
- height:auto;
- background-color:#aaa;
- background-attachment: fixed;
-}
-.dijit_a11y .dijitProgressBarTile {
-
- border-width:2px;
- border-style:solid;
- background-color:transparent !important;
-}
-.dj_ie6 .dijitProgressBarTile {
-
- position:static;
-
- height:1.6em;
-}
-.dijitProgressBarIndeterminate .dijitProgressBarLabel {
- visibility:hidden;
-}
-.dijitProgressBarIndeterminate .dijitProgressBarTile {
-
-}
-.dijitProgressBarIndeterminateHighContrastImage {
- display:none;
-}
-.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
- display:block;
- position:absolute;
- top:0;
- bottom:0;
- margin:0;
- padding:0;
- width:100%;
- height:auto;
-}
-.dijitProgressBarLabel {
- display:block;
- position:static;
- width:100%;
- text-align:center;
- background-color:transparent !important;
-}
-.dijitTooltip {
- position: absolute;
- z-index: 2000;
- display: block;
-
- left: 50%;
- top: -10000px;
- overflow: visible;
-}
-.dijitTooltipContainer {
- border: solid black 2px;
- background: #b8b5b5;
- color: black;
- font-size: small;
-}
-.dijitTooltipFocusNode {
- padding: 2px 2px 2px 2px;
-}
-.dijitTooltipConnector {
- position: absolute;
-}
-.dijit_a11y .dijitTooltipConnector {
- display: none;
-}
-.dijitTooltipData {
- display:none;
-}
-.dijitLayoutContainer {
- position: relative;
- display: block;
- overflow: hidden;
-}
-body .dijitAlignTop,
-body .dijitAlignBottom,
-body .dijitAlignLeft,
-body .dijitAlignRight {
- position: absolute;
- overflow: hidden;
-}
-body .dijitAlignClient { position: absolute; }
-.dijitBorderContainer, .dijitBorderContainerNoGutter {
- position:relative;
- overflow: hidden;
-}
-.dijitBorderContainerPane,
-.dijitBorderContainerNoGutterPane {
- position: absolute !important;
- z-index: 2;
-}
-.dijitBorderContainer > .dijitTextArea {
-
- resize: none;
-}
-.dijitGutter {
-
- position: absolute;
- font-size: 1px;
-}
-.dijitSplitter {
- position: absolute;
- overflow: hidden;
- z-index: 10;
- background-color: #fff;
- border-color: gray;
- border-style: solid;
- border-width: 0;
-}
-.dj_ie .dijitSplitter {
- z-index: 1;
-}
-.dijitSplitterActive {
- z-index: 11 !important;
-}
-.dijitSplitterCover {
- position:absolute;
- z-index:-1;
- top:0;
- left:0;
- width:100%;
- height:100%;
-}
-.dijitSplitterCoverActive {
- z-index:3 !important;
-}
-.dj_ie .dijitSplitterCover {
- background: white;
- filter: alpha(opacity=0);
-}
-.dijitSplitterH {
- height: 7px;
- border-top:1px;
- border-bottom:1px;
- cursor: ns-resize;
-}
-.dijitSplitterV {
- width: 7px;
- border-left:1px;
- border-right:1px;
- cursor: ew-resize;
-}
-.dijitSplitContainer {
- position: relative;
- overflow: hidden;
- display: block;
-}
-.dj_ff3 .dijit_a11y div.dijitSplitter:focus {
- outline-style:dotted;
- outline-width: 2px;
-}
-.dijitSplitPane {
- position: absolute;
-}
-.dijitSplitContainerSizerH,
-.dijitSplitContainerSizerV {
- position:absolute;
- font-size: 1px;
- cursor: move;
- cursor: w-resize;
- background-color: ThreeDFace;
- border: 1px solid;
- border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
- margin: 0;
-}
-.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
- overflow:hidden;
- position:absolute;
- top:49%;
-}
-.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
- position:absolute;
- left:49%;
-}
-.dijitSplitterShadow,
-.dijitSplitContainerVirtualSizerH,
-.dijitSplitContainerVirtualSizerV {
- font-size: 1px;
- background-color: ThreeDShadow;
- -moz-opacity: 0.5;
- opacity: 0.5;
- filter: Alpha(Opacity=50);
- margin: 0;
-}
-.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
- cursor: w-resize;
-}
-.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
- cursor: n-resize;
-}
-.dijit_a11y .dijitSplitterH {
- border-top:1px solid #d3d3d3 !important;
- border-bottom:1px solid #d3d3d3 !important;
-}
-.dijit_a11y .dijitSplitterV {
- border-left:1px solid #d3d3d3 !important;
- border-right:1px solid #d3d3d3 !important;
-}
-.dijitContentPane {
- display: block;
- overflow: auto;
-}
-.dijitContentPaneSingleChild {
-
- overflow: hidden;
-}
-.dijitTitlePane {
- display: block;
- overflow: hidden;
-}
-.dijitTitlePaneTitle {
- cursor: pointer;
-}
-.dijitFixedOpen {
-
- cursor: default;
-}
-.dijitTitlePaneTitle * {
- vertical-align: middle;
-}
-.dijitTitlePane .dijitArrowNodeInner {
-
- display: none;
-}
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
-
- display:inline !important;
- font-family: monospace;
-}
-.dijit_a11y .dijitTitlePane .dijitArrowNode {
-
- display:none;
-}
-.dj_ie6 .dijitTitlePaneContentOuter,
-.dj_ie6 .dijitTitlePane .dijitTitlePaneTitle {
-
- zoom: 1;
-}
-.dijitColorPalette {
- border: 1px solid #999;
- background: #fff;
- position: relative;
-}
-img.dijitColorPaletteUnder {
-
- border-style: none;
- position: absolute;
- left: 0;
- top: 0;
-}
-.dijitColorPalette .dijitPaletteTable {
-
- padding: 2px 3px 3px 3px;
- position: relative;
- overflow: hidden;
- outline: 0;
- border-collapse: separate;
-}
-.dj_ie6 .dijitColorPalette .dijitPaletteTable,
-.dj_ie7 .dijitColorPalette .dijitPaletteTable,
-.dj_iequirks .dijitColorPalette .dijitPaletteTable {
-
- padding: 0;
- margin: 2px 3px 3px 3px;
-}
-.dijitColorPalette .dijitPaletteCell {
-
- height: 20px;
- width: 20px;
- font-size: 1px;
- vertical-align: middle;
- text-align: center;
-}
-.dijitColorPalette .dijitPaletteImg {
-
- width: 16px;
- height: 14px;
- border: 1px solid #999;
- cursor: default;
- vertical-align: middle;
-}
-.dj_iequirks .dijitColorPalette .dijitPaletteImg {
- margin: 1px;
-}
-.dijitPaletteTable td {
- padding: 0px;
-}
-.dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
-
- border: 1px solid #000;
-}
-.dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
-.dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
- border: 2px solid #000;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteTable,
-.dijit_a11y .dijitColorPalette .dijitPaletteTable * {
-
- background-color: transparent !important;
-}
-.dj_gecko .dijit_a11y .dijitColorPalette .dijitPaletteCellFocused .dijitPaletteImg {
- border: 3px dotted #000;
- margin: -1px;
-}
-.dijit_a11y .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
- border: 2px solid #000 !important;
-}
-.dijitAccordionContainer {
- border:1px solid #b7b7b7;
- border-top:0 !important;
-}
-.dijitAccordionTitle {
- cursor: pointer;
-}
-.dijitAccordionTitleSelected {
- cursor: default;
-}
-.dijitAccordionTitle .arrowTextUp,
-.dijitAccordionTitle .arrowTextDown {
- display: none;
- font-size: 0.65em;
- font-weight: normal !important;
-}
-.dijit_a11y .dijitAccordionTitle .arrowTextUp,
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextDown {
- display: inline;
-}
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextUp {
- display: none;
-}
-.dj_ie6 .dijitAccordionTitle,
-.dj_iequirks .dijitAccordionTitle {
-
- zoom: 1;
-}
-.dijitCalendarContainer {
- width: auto;
-}
-.dijitCalendarContainer th, .dijitCalendarContainer td {
- padding: 0;
-}
-.dijitCalendarNextYear {
- margin:0 0 0 0.55em;
-}
-.dijitCalendarPreviousYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarIncrementControl {
- vertical-align: middle;
-}
-.dijitCalendarIncrementControl,
-.dijitCalendarDateTemplate,
-.dijitCalendarMonthLabel,
-.dijitCalendarPreviousYear,
-.dijitCalendarNextYear {
- cursor: pointer;
-}
-.dijitCalendarDisabledDate {
- color: gray;
- text-decoration: line-through;
- cursor: default;
-}
-.dijitSpacer {
-
- position: relative;
- height: 1px;
- overflow: hidden;
- visibility: hidden;
-}
-.dijitMenu {
- border:1px solid black;
- background-color:white;
-}
-.dijitMenuTable {
- border-collapse:collapse;
- border-width:0;
- background-color:white;
-}
-.dj_webkit .dijitMenuTable td[colspan="2"]{
- border-right:hidden;
-}
-.dijitMenuItem {
- text-align: left;
- white-space: nowrap;
- padding:.1em .2em;
- cursor:pointer;
-}
-.dijitMenuPassive .dijitMenuItemHover,
-.dijitMenuItemSelected {
-
- background-color:black;
- color:white;
-}
-.dijitMenuItemIcon, .dijitMenuExpand {
- background-repeat: no-repeat;
-}
-.dijitMenuItemDisabled * {
-
- opacity:0.5;
- cursor:default;
-}
-.dj_ie .dijit_a11y .dijitMenuItemDisabled,
-.dj_ie .dijit_a11y .dijitMenuItemDisabled td,
-.dj_ie .dijitMenuItemDisabled *,
-.dj_ie .dijitMenuItemDisabled td {
- color:gray !important;
- filter: alpha(opacity=35);
-}
-.dijitMenuItemLabel {
- position: relative;
- vertical-align: middle;
-}
-.dijit_a11y .dijitMenuItemSelected {
- border: 1px dotted black !important;
-}
-.dj_ff3 .dijit_a11y .dijitMenuItem td {
- padding: none !important;
- background:none !important;
-}
-.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
- border-width: 1px;
- border-style: solid;
-}
-.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
- position:static;
-}
-.dijitMenuExpandA11y {
- display: none;
-}
-.dijit_a11y .dijitMenuExpandA11y {
- display: inline;
-}
-.dijitMenuSeparator td {
- border: 0;
- padding: 0;
-}
-.dijitMenuSeparatorTop {
- height: 50%;
- margin: 0;
- margin-top:3px;
- font-size: 1px;
-}
-.dijitMenuSeparatorBottom {
- height: 50%;
- margin: 0;
- margin-bottom:3px;
- font-size: 1px;
-}
-.dijitCheckedMenuItemIconChar {
- vertical-align: middle;
- visibility:hidden;
-}
-.dijitCheckedMenuItemChecked .dijitCheckedMenuItemIconChar {
- visibility: visible;
-}
-.dijit_a11y .dijitCheckedMenuItemIconChar {
- display:inline !important;
-}
-.dijit_a11y .dijitCheckedMenuItemIcon {
- display: none;
-}
-.dj_ie .dijit_a11y .dijitMenuBar .dijitMenuItem {
-
- margin: 0px;
-}
-.dijitStackController .dijitToggleButtonChecked * {
- cursor: default;
-}
-.dijitTabContainerNoLayout {
- width: 100%;
-}
-.dijitTabContainerBottom-tabs,
-.dijitTabContainerTop-tabs,
-.dijitTabContainerLeft-tabs,
-.dijitTabContainerRight-tabs {
- overflow: visible !important;
-}
-.dijitTabContainerBottom-container,
-.dijitTabContainerTop-container,
-.dijitTabContainerLeft-container,
-.dijitTabContainerRight-container {
- z-index:0;
- overflow: hidden;
- border: 1px solid black;
-}
-.nowrapTabStrip {
- width: 50000px;
- display: block;
- position: relative;
-}
-.dijitTabListWrapper {
- overflow: hidden;
-}
-.dijit_a11y .tabStripButton img {
-
- display: none;
-}
-.dijitTabContainerTop-tabs {
- border-bottom: 1px solid black;
-}
-.dijitTabContainerTop-container {
- border-top: 0px;
-}
-.dijitTabContainerLeft-tabs {
- border-right: 1px solid black;
- float: left;
-}
-.dijitTabContainerLeft-container {
- border-left: 0px;
-}
-.dijitTabContainerBottom-tabs {
- border-top: 1px solid black;
-}
-.dijitTabContainerBottom-container {
- border-bottom: 0px;
-}
-.dijitTabContainerRight-tabs {
- border-left: 1px solid black;
- float: left;
-}
-.dijitTabContainerRight-container {
- border-right: 0px;
-}
-DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
- cursor: auto;
-}
-.dijitTab {
- position:relative;
- cursor:pointer;
- white-space:nowrap;
- z-index:3;
-}
-.dijitTab * {
-
- vertical-align: middle;
-}
-.dijitTabChecked {
- cursor: default;
-}
-.dijitTabContainerTop-tabs .dijitTab {
- top: 1px;
-}
-.dijitTabContainerBottom-tabs .dijitTab {
- top: -1px;
-}
-.dijitTabContainerLeft-tabs .dijitTab {
- left: 1px;
-}
-.dijitTabContainerRight-tabs .dijitTab {
- left: -1px;
-}
-.dijitTabContainerTop-tabs .dijitTab,
-.dijitTabContainerBottom-tabs .dijitTab {
-
- display:inline-block;
- #zoom: 1;
- #display:inline;
-}
-.dijitTabInnerDiv {
- position:relative;
-}
-.tabStripButton {
- z-index: 12;
-}
-.dijitTabButtonDisabled .tabStripButton {
- display: none;
-}
-.dijitTabCloseButton {
- margin-left: 1em;
-}
-.dijitTabCloseText {
- display:none;
-}
-.dijit_a11y .dijitTabCloseButton {
- background-image: none !important;
- width: auto !important;
- height: auto !important;
- border: thin dotted;
-}
-.dijit_a11y .dijitTabCloseButtonHover {
- border:thin solid;
-}
-.dijit_a11y .dijitTabCloseText {
- display: inline;
-}
-.dijit_a11y .dijitTabChecked {
-
- border-style:dashed !important;
-}
-.dijit_a11y .dijitTabInnerDiv {
- border-left:none !important;
- }
-.dijitTabPane,
-.dijitStackContainer-child,
-.dijitAccordionContainer-child {
-
- border: none !important;
-}
-.dijitInlineEditBoxDisplayMode {
- border: 1px solid transparent;
- cursor: text;
-}
-.dijit_a11y .dijitInlineEditBoxDisplayMode,
-.dj_ie6 .dijitInlineEditBoxDisplayMode {
-
- border: none;
-}
-.dijitInlineEditBoxDisplayModeHover,
-.dijit_a11y .dijitInlineEditBoxDisplayModeHover,
-.dj_ie6 .dijitInlineEditBoxDisplayModeHover {
-
- background-color: #e2ebf2;
- border: solid 1px black;
-}
-.dijitInlineEditBoxDisplayModeDisabled {
- cursor: default;
-}
-.dijitTreeIndent {
-
- width: 19px;
-}
-.dijitTreeRow, .dijitTreeContent {
- white-space: nowrap;
-}
-.dijitTreeRow img {
-
- vertical-align: middle;
-}
-.dijitTreeContent {
- cursor: default;
-}
-.dijitExpandoText {
- display: none;
-}
-.dijit_a11y .dijitExpandoText {
- display: inline;
- padding-left: 10px;
- padding-right: 10px;
- font-family: monospace;
- border-style: solid;
- border-width: thin;
- cursor: pointer;
-}
-.dijitTreeLabel {
- margin: 0px 4px;
-}
-.dijitDialog {
- position: absolute;
- z-index: 999;
- overflow: hidden;
-}
-.dijitDialogTitleBar {
- cursor: move;
-}
-.dijitDialogFixed .dijitDialogTitleBar {
- cursor:default;
-}
-.dijitDialogCloseIcon {
- cursor: pointer;
-}
-.dijitDialogUnderlayWrapper {
- position: absolute;
- left: 0;
- top: 0;
- z-index: 998;
- display: none;
- background: transparent !important;
-}
-.dijitDialogUnderlay {
- background: #eee;
- opacity: 0.5;
-}
-.dj_ie .dijitDialogUnderlay {
- filter: alpha(opacity=50);
-}
-.dijit_a11y .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitDialog {
- opacity: 1 !important;
- background-color: white !important;
-}
-.dijitDialog .closeText {
- display:none;
-
- position:absolute;
-}
-.dijit_a11y .dijitDialog .closeText {
- display:inline;
-}
-.dijitSliderMoveable {
- z-index:99;
- position:absolute !important;
- display:block;
- vertical-align:middle;
-}
-.dijitSliderMoveableH {
- right:0;
-}
-.dijitSliderMoveableV {
- right:50%;
-}
-.dijit_a11y DIV.dijitSliderImageHandle,
-.dijitSliderImageHandle {
- margin:0;
- padding:0;
- position:relative !important;
- border:8px solid gray;
- width:0;
- height:0;
- cursor: pointer;
-}
-.dj_iequirks .dijit_a11y .dijitSliderImageHandle {
- font-size: 0;
-}
-.dj_ie7 .dijitSliderImageHandle {
- overflow: hidden;
-}
-.dj_ie7 .dijit_a11y .dijitSliderImageHandle {
- overflow: visible;
-}
-.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
- border:4px solid #000;
- height:8px;
- width:8px;
-}
-.dijitSliderImageHandleV {
- top:-8px;
- right: -50%;
-}
-.dijitSliderImageHandleH {
- left:50%;
- top:-5px;
- vertical-align:top;
-}
-.dijitSliderBar {
- border-style:solid;
- border-color:black;
- cursor: pointer;
-}
-.dijitSliderBarContainerV {
- position:relative;
- height:100%;
- z-index:1;
-}
-.dijitSliderBarContainerH {
- position:relative;
- z-index:1;
-}
-.dijitSliderBarH {
- height:4px;
- border-width:1px 0;
-}
-.dijitSliderBarV {
- width:4px;
- border-width:0 1px;
-}
-.dijitSliderProgressBar {
- background-color:red;
- z-index:1;
-}
-.dijitSliderProgressBarV {
- position:static !important;
- height:0%;
- vertical-align:top;
- text-align:left;
-}
-.dijitSliderProgressBarH {
- position:absolute !important;
- width:0%;
- vertical-align:middle;
- overflow:visible;
-}
-.dijitSliderRemainingBar {
- overflow:hidden;
- background-color:transparent;
- z-index:1;
-}
-.dijitSliderRemainingBarV {
- height:100%;
- text-align:left;
-}
-.dijitSliderRemainingBarH {
- width:100% !important;
-}
-.dijitSliderBumper {
- overflow:hidden;
- z-index:1;
-}
-.dijitSliderBumperV {
- width:4px;
- height:8px;
- border-width:0 1px;
-}
-.dijitSliderBumperH {
- width:8px;
- height:4px;
- border-width:1px 0;
-}
-.dijitSliderBottomBumper,
-.dijitSliderLeftBumper {
- background-color:red;
-}
-.dijitSliderTopBumper,
-.dijitSliderRightBumper {
- background-color:transparent;
-}
-.dijitSliderDecoration {
- text-align:center;
-}
-.dijitSliderV TD {
- position: relative;
-}
-.dijitSliderDecorationH {
- width: 100%;
-}
-.dijitSliderDecorationV {
- height: 100%;
-}
-.dijitSliderButton {
- font-family:monospace;
- margin:0;
- padding:0;
- display:block;
-}
-.dijit_a11y .dijitSliderButtonInner {
- visibility:visible !important;
-}
-.dijitSliderButtonContainer {
- text-align:center;
- height:0;
-}
-.dijitSliderButtonContainer * {
- cursor: pointer;
-}
-.dijitSlider .dijitButtonNode {
- padding:0;
- display:block;
-}
-.dijitRuleContainer {
- position:relative;
- overflow:visible;
-}
-.dijitRuleContainerV {
- height:100%;
- line-height:0;
- float:left;
- text-align:left;
-}
-.dj_opera .dijitRuleContainerV {
- line-height:2%;
-}
-.dj_ie .dijitRuleContainerV {
- line-height:normal;
-}
-.dj_gecko .dijitRuleContainerV {
- margin:0 0 1px 0;
-}
-.dijitRuleMark {
- position:absolute;
- border:1px solid black;
- line-height:0;
- height:100%;
-}
-.dijitRuleMarkH {
- width:0;
- border-top-width:0 !important;
- border-bottom-width:0 !important;
- border-left-width:0 !important;
-}
-.dijitRuleLabelContainer {
- position:absolute;
-}
-.dijitRuleLabelContainerH {
- text-align:center;
- display:inline-block;
-}
-.dijitRuleLabelH {
- position:relative;
- left:-50%;
-}
-.dijitRuleLabelV {
-
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
-}
-.dijitRuleMarkV {
- height:0;
- border-right-width:0 !important;
- border-bottom-width:0 !important;
- border-left-width:0 !important;
- width:100%;
- left:0;
-}
-.dj_ie .dijitRuleLabelContainerV {
- margin-top:-.55em;
-}
-.dijit_a11y .dijitSliderReadOnly,
-.dijit_a11y .dijitSliderDisabled {
- opacity:0.6;
-}
-.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
-.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
- filter: alpha(opacity=40);
-}
-.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
- font-family: monospace;
- font-size: 1em;
- line-height: 1em;
- height: auto;
- width: auto;
- margin: 0px 4px;
-}
-.dijit_a11y .dijitButtonContents .dijitButtonText,
-.dijit_a11y .dijitTab .tabLabel {
- display: inline !important;
-}
-.dijitTextArea {
- width:100%;
- overflow-y: auto;
-}
-.dijitTextArea[cols] {
- width:auto;
-}
-.dj_ie .dijitTextAreaCols {
- width:auto;
-}
-.dijitToolbarSeparator {
- height: 18px;
- width: 5px;
- padding: 0 1px;
- margin: 0;
-}
-.dijitIEFixedToolbar {
- position:absolute;
-
- top: expression(eval((document.documentElement||document.body).scrollTop));
-}
-.dijitEditor {
- display: block;
-}
-.dijitEditorDisabled,
-.dijitEditorReadOnly {
- color: gray;
-}
-.dijitTimePickerItemInner {
- text-align:center;
- border:0;
- padding:2px 8px 2px 8px;
-}
-.dijitTimePickerTick,
-.dijitTimePickerMarker {
- border-bottom:1px solid gray;
-}
-.dijitTimePicker .dijitDownArrowButton {
- border-top: none !important;
-}
-.dijitTimePickerTick {
- color:#CCC;
-}
-.dijitTimePickerMarker {
- color:black;
- background-color:#CCC;
-}
-.dijitTimePickerItemSelected {
- font-weight:bold;
- color:#333;
- background-color:#b7cdee;
-}
-.dijitTimePickerItemHover {
- background-color:gray;
- color:white;
- cursor:pointer;
-}
-.dijit_a11y .dijitTimePickerItemSelected .dijitTimePickerItemInner {
- border: solid 4px black;
-}
-.dijit_a11y .dijitTimePickerItemHover .dijitTimePickerItemInner {
- border: dashed 4px black;
-}
-.dijitToggleButtonIconChar {
-
- display:none !important;
-}
-.dijit_a11y .dijitToggleButton .dijitToggleButtonIconChar {
- display:inline !important;
- visibility:hidden;
-}
-.dj_ie6 .dijitToggleButtonIconChar, .dj_ie6 .tabStripButton .dijitButtonText {
- font-family: "Arial Unicode MS";
-}
-.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
- display: inline !important;
- visibility:visible !important;
-}
-.dijitArrowButtonChar {
- display:none !important;
-}
-.dijit_a11y .dijitArrowButtonChar {
- display:inline !important;
-}
-.dijit_a11y .dijitDropDownButton .dijitArrowButtonInner,
-.dijit_a11y .dijitComboButton .dijitArrowButtonInner {
- display:none !important;
-}
-.dijitSelect {
- margin: 0.2em;
- border-collapse: collapse;
-}
-.dj_ie .dijitSelect,
-.dj_ie7 .dijitSelect,
-.dj_iequirks .dijitSelect {
- vertical-align: middle;
-}
-.dj_ie8 .dijitSelect .dijitButtonText {
- vertical-align: top;
-}
-.dijitToolbar .dijitSelect {
- margin: 0;
-}
-.dj_webkit .dijitToolbar .dijitSelect {
- padding-left: 0.3em;
-}
-.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
-.dijitSelect .dijitButtonContents {
- padding: 0px;
- background: transparent none;
- white-space: nowrap;
- text-align: left;
-}
-.dijitSelectFixedWidth .dijitButtonContents {
- width: 100%;
-}
-.dijitSelectMenu .dijitMenuItemIcon {
-
- display:none;
-}
-.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
-.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
-
- position: static;
-}
-.dijitSelectLabel *
-{
- vertical-align: baseline;
-}
-.dijitSelectSelectedOption * {
- font-weight: bold;
-}
-.dijitSelectMenu {
- border-width: 1px;
-}
-.dijitSelectMenu .dijitMenuTable {
- margin: 0px;
- background-color: transparent;
-}
-.dijitForceStatic {
- position: static !important;
-}
-.dijitReadOnly *,
-.dijitDisabled *,
-.dijitReadOnly,
-.dijitDisabled {
-
- cursor: default;
-}
-.dijitIconSave,
-.dijitIconPrint,
-.dijitIconCut,
-.dijitIconCopy,
-.dijitIconClear,
-.dijitIconDelete,
-.dijitIconUndo,
-.dijitIconEdit,
-.dijitIconNewTask,
-.dijitIconEditTask,
-.dijitIconEditProperty,
-.dijitIconTask,
-.dijitIconFilter,
-.dijitIconConfigure,
-.dijitIconSearch,
-.dijitIconApplication,
-.dijitIconBookmark,
-.dijitIconChart,
-.dijitIconConnector,
-.dijitIconDatabase,
-.dijitIconDocuments,
-.dijitIconMail,
-.dijitLeaf,
-.dijitIconFile,
-.dijitIconFunction,
-.dijitIconKey,
-.dijitIconPackage,
-.dijitIconSample,
-.dijitIconTable,
-.dijitIconUsers,
-.dijitFolderClosed,
-.dijitIconFolderClosed,
-.dijitFolderOpened,
-.dijitIconFolderOpen,
-.dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActEnabled.png);
- width: 16px;
- height: 16px;
-}
-.dj_ie6 .dijitIconSave,
-.dj_ie6 .dijitIconPrint,
-.dj_ie6 .dijitIconCut,
-.dj_ie6 .dijitIconCopy,
-.dj_ie6 .dijitIconClear,
-.dj_ie6 .dijitIconDelete,
-.dj_ie6 .dijitIconUndo,
-.dj_ie6 .dijitIconEdit,
-.dj_ie6 .dijitIconNewTask,
-.dj_ie6 .dijitIconEditTask,
-.dj_ie6 .dijitIconEditProperty,
-.dj_ie6 .dijitIconTask,
-.dj_ie6 .dijitIconFilter,
-.dj_ie6 .dijitIconConfigure,
-.dj_ie6 .dijitIconSearch,
-.dj_ie6 .dijitIconApplication,
-.dj_ie6 .dijitIconBookmark,
-.dj_ie6 .dijitIconChart,
-.dj_ie6 .dijitIconConnector,
-.dj_ie6 .dijitIconDatabase,
-.dj_ie6 .dijitIconDocuments,
-.dj_ie6 .dijitIconMail,
-.dj_ie6 .dijitLeaf,
-.dj_ie6 .dijitIconFile,
-.dj_ie6 .dijitIconFunction,
-.dj_ie6 .dijitIconKey,
-.dj_ie6 .dijitIconPackage,
-.dj_ie6 .dijitIconSample,
-.dj_ie6 .dijitIconTable,
-.dj_ie6 .dijitIconUsers,
-.dj_ie6 .dijitFolderClosed,
-.dj_ie6 .dijitIconFolderClosed,
-.dj_ie6 .dijitFolderOpened,
-.dj_ie6 .dijitIconFolderOpen,
-.dj_ie6 .dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActEnabled8bit.png);
-}
-.dijitDisabled .dijitIconSave,
-.dijitDisabled .dijitIconPrint,
-.dijitDisabled .dijitIconCut,
-.dijitDisabled .dijitIconCopy,
-.dijitDisabled .dijitIconClear,
-.dijitDisabled .dijitIconDelete,
-.dijitDisabled .dijitIconUndo,
-.dijitDisabled .dijitIconEdit,
-.dijitDisabled .dijitIconNewTask,
-.dijitDisabled .dijitIconEditTask,
-.dijitDisabled .dijitIconEditProperty,
-.dijitDisabled .dijitIconTask,
-.dijitDisabled .dijitIconFilter,
-.dijitDisabled .dijitIconConfigure,
-.dijitDisabled .dijitIconSearch,
-.dijitDisabled .dijitIconApplication,
-.dijitDisabled .dijitIconBookmark,
-.dijitDisabled .dijitIconChart,
-.dijitDisabled .dijitIconConnector,
-.dijitDisabled .dijitIconDatabase,
-.dijitDisabled .dijitIconDocuments,
-.dijitDisabled .dijitIconMail,
-.dijitDisabled .dijitLeaf,
-.dijitDisabled .dijitIconFile,
-.dijitDisabled .dijitIconFunction,
-.dijitDisabled .dijitIconKey,
-.dijitDisabled .dijitIconPackage,
-.dijitDisabled .dijitIconSample,
-.dijitDisabled .dijitIconTable,
-.dijitDisabled .dijitIconUsers,
-.dijitDisabled .dijitFolderClosed,
-.dijitDisabled .dijitIconFolderClosed,
-.dijitDisabled .dijitFolderOpened,
-.dijitDisabled .dijitIconFolderOpen,
-.dijitDisabled .dijitIconError {
- background-image: url(../../icons/images/commonIconsObjActDisabled.png);
-}
-.dijitIconSave { background-position: 0px; }
-.dijitIconPrint { background-position: -16px; }
-.dijitIconCut { background-position: -32px; }
-.dijitIconCopy { background-position: -48px; }
-.dijitIconClear { background-position: -64px; }
-.dijitIconDelete { background-position: -80px; }
-.dijitIconUndo { background-position: -96px; }
-.dijitIconEdit { background-position: -112px; }
-.dijitIconNewTask { background-position: -128px; }
-.dijitIconEditTask { background-position: -144px; }
-.dijitIconEditProperty { background-position: -166px; }
-.dijitIconTask { background-position: -176px; }
-.dijitIconFilter { background-position: -192px; }
-.dijitIconConfigure { background-position: -208px; }
-.dijitIconSearch { background-position: -224px; }
-.dijitIconError { background-position: -496px; }
-.dijitIconApplication { background-position: -240px; }
-.dijitIconBookmark { background-position: -256px; }
-.dijitIconChart { background-position: -272px; }
-.dijitIconConnector { background-position: -288px; }
-.dijitIconDatabase { background-position: -304px; }
-.dijitIconDocuments { background-position: -320px; }
-.dijitIconMail { background-position: -336px; }
-.dijitIconFile, .dijitLeaf { background-position: -352px; }
-.dijitIconFunction { background-position: -368px; }
-.dijitIconKey { background-position: -384px; }
-.dijitIconPackage{ background-position: -400px; }
-.dijitIconSample { background-position: -416px; }
-.dijitIconTable { background-position: -432px; }
-.dijitIconUsers { background-position: -448px; }
-.dijitIconFolderClosed, .dijitFolderClosed { background-position: -464px; }
-.dijitIconFolderOpen, .dijitFolderOpened { background-position: -480px; }
-.tundra .dojoDndItemBefore {
- border-top: 2px solid #369;
-}
-.tundra .dojoDndItemAfter {
- border-bottom: 2px solid #369;
-}
-.tundra .dojoDndItemOver {
- cursor:pointer;
-}
-.tundra table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
-.tundra .dojoDndAvatar td { border: none; }
-.tundra .dojoDndAvatar tr { border: none; }
-.tundra .dojoDndAvatarHeader td { height: 20px; padding: 0 0 0 21px; }
-.tundra .dojoDndAvatarItem td { padding: 2px;}
-.tundra.dojoDndMove .dojoDndAvatarHeader {background-color: #f58383; background-image: url(images/dndNoMove.png); background-repeat: no-repeat; background-position: 2px center;}
-.tundra.dojoDndCopy .dojoDndAvatarHeader {background-color: #f58383; background-image: url(images/dndNoCopy.png); background-repeat: no-repeat; background-position: 2px center;}
-.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 {
- background:url(images/loading.gif) no-repeat left center;
- padding-left:25px;
-}
-.tundra .dijitContentPaneError {
- background:url(images/warning.png) no-repeat left center;
- padding-left:25px;
-}
-.tundra .dijitContentPane {
- padding: 0px;
-}
-.tundra .dijitTabContainerTop-dijitContentPane,
-.tundra .dijitTabContainerLeft-dijitContentPane,
-.tundra .dijitTabContainerBottom-dijitContentPane,
-.tundra .dijitTabContainerRight-dijitContentPane,
-.tundra .dijitAccordionContainer-dijitContentPane {
- background-color: #fff;
- padding: 5px;
-}
-.tundra .dijitSplitContainer-dijitContentPane,
-.tundra .dijitBorderContainer-dijitContentPane {
- background-color: #fff;
- padding: 5px;
-}
-.tundra .dijitTabPaneWrapper {
- background:#fff;
- border:1px solid #ccc;
- margin: 0;
- padding: 0;
-}
-.tundra .dijitTab {
- line-height:normal;
- margin-right:4px;
- padding:0px;
- border:1px solid #ccc;
- background:#e2e2e2 url(images/tabEnabled.png) repeat-x;
-}
-.tundra .dijitTabInnerDiv {
- padding:2px 8px 2px 9px;
-}
-.tundra .dijitTabSpacer {
- display: none;
-}
-.tundra .dijitTabContainer .tabStripRBtn {
- margin-right: 20px;
-}
-.tundra .dijitTabContainer .tabStripLBtn {
- margin-left: 20px;
-}
-.tundra .nowrapTabStrip .dijitTab {
- top: 2px;
-}
-.tundra .dijitTabContainerBottom .nowrapTabStrip .dijitTab {
- top: 0px;
- bottom: 2px;
-}
-.tundra .dijitTabChecked {
-
- background-color:#fff;
- border-color: #ccc;
- background-image:none;
-}
-.tundra .dijitTabHover {
- color: #243C5F;
- border-top-color:#92a0b3;
- border-left-color:#92a0b3;
- border-right-color:#92a0b3;
- border-bottom-color:#92a0b3;
- background:#e2e2e2 url(images/tabHover.gif) repeat-x;
-}
-.tundra .dijitTabContainerTop .dijitTabHover {
- border-bottom-color:#ccc;
-}
-.tundra .dijitTabContainerBottom .dijitTabHover {
- border-top-color:#ccc;
-}
-.tundra .dijitTabContainerLeft .dijitTabHover {
- border-right-color:#ccc;
-}
-.tundra .dijitTabContainerRight .dijitTabHover {
- border-left-color:#ccc;
-}
-.tundra .dijitTabContainer .dijitTabCheckedHover {
- color: inherit;
- border:1px solid #ccc;
- background:#fff;
-}
-.tundra .dijitTab .tabLabel {
-
- min-height: 12px;
- display: inline-block;
-}
-.tundra .dijitTabContainerNested .dijitTabListWrapper {
- height: auto;
-}
-.tundra .dijitTabContainerNested .dijitTabContainerTop-tabs {
- border-bottom: 1px solid #CCC;
-}
-.tundra .dijitTabContainerTabListNested .dijitTab {
- background: none;
- border: none;
- top: 0px;
-}
-.tundra .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
-}
-.tundra .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent .tabLabel {
- text-decoration: underline;
-}
-.tundra .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent .tabLabel {
- text-decoration: underline;
- font-weight: bold;
-
-}
-.tundra .dijitTabContainer .dijitTabPaneWrapperNested {
- border: none;
-}
-.tundra .dijitTabCloseButton {
- background: url(images/tabClose.png) no-repeat right top;
- width: 12px;
- height: 12px;
-}
-.dj_ie6 .tundra .dijitTabCloseButton {
- background-image : url(images/tabClose.gif);
-}
-.tundra .dijitTabCloseButtonHover {
- background-image : url(images/tabCloseHover.png);
-}
-.dj_ie6 .tundra .dijitTabCloseButtonHover {
- background-image : url(images/tabCloseHover.gif);
-}
-.tundra .dijitTabContainerTop-tabs {
- margin-bottom: 0px;
- border-color: #cccccc;
- padding-left: 3px;
- background-position: bottom;
-}
-.tundra .dijitTabContainerTop-tabs .dijitTab {
- top: 0px;
- margin-bottom: -1px;
-}
-.tundra .dijitTabContainerTop-container {
- border-top: none;
-}
-.tundra .dijitTabContainerTop-tabs .dijitTabChecked {
- border-bottom-color:white;
-}
-.tundra .dijitTabContainerTop-tabs,
-.tundra .dijitTabContainerBottom-tabs {
- padding-left: 3px;
- padding-right: 3px;
-}
-.tundra .dijitTabContainerTopStrip {
- border-top: 1px solid #CCC;
- border-right: 1px solid #CCC;
- border-left: 1px solid #CCC;
- padding-top: 2px;
- background: #f2f2f2;
-}
-.tundra .dijitTabContainerTopNone {
- padding-top: 0px;
-}
-.tundra .dijitTabContainerBottom-tabs {
- margin-top: 0px;
- border-color: #cccccc;
- background-position: top;
- padding-left: 3px;
-}
-.tundra .dijitTabContainerBottom-tabs .dijitTab {
- bottom: 0px;
- margin-top: -1px;
-}
-.tundra .dijitTabContainerBottom-container {
- border-bottom: none;
-}
-.tundra .dijitTabContainerBottom-tabs .dijitTabChecked {
- border-top-color:white;
-}
-.tundra .dijitTabContainerBottomStrip {
- padding-bottom: 2px;
- border: 1px solid #ccc;
- background: #f2f2f2;
- border-top: none;
-}
-.tundra .dijitTabContainerRight-tabs {
- border-color: #ccc;
- height: 100%;
- padding-top: 3px;
-}
-.tundra .dijitTabContainerRightStrip {
- margin-left: -1px;
-}
-.tundra .dijitTabContainerRight-container {
- border-right: none;
-}
-.tundra .dijitTabContainerRight-tabs .dijitTabChecked {
- border-left-color:white;
-}
-.tundra .dijitTabContainerRightStrip {
- padding-right: 2px;
- border: 1px solid #ccc;
-}
-.tundra .dijitTabContainerRightStrip {
- background: #f2f2f2;
-}
-.tundra .dijitTabContainerLeft-tabs {
- border-color: #ccc;
- padding-top: 3px;
- height: 100%;
-}
-.tundra .dijitTabContainerLeft-container {
- border-left: none;
-}
-.tundra .dijitTabContainerLeft-tabs .dijitTabChecked {
- border-right-color:white;
-}
-.tundra .dijitTabContainerLeftStrip {
- padding-left: 2px;
- border: 1px solid #ccc;
- background: #f2f2f2;
- border-right: none;
-}
-.tundra .dijitTabContainerLeft-tabs .dijitTab,
-.tundra .dijitTabContainerRight-tabs .dijitTab {
- margin-right:0px;
- margin-bottom:4px;
-}
-.tundra .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
- border-left: 0px solid #ccc;
- border-top: 0px solid #ccc;
- border-right: 0px solid #ccc;
- padding-top: 0px;
- padding-left: 0px;
-}
-.tundra .dijitTabContainer .tabStripButton {
- margin-right: 0;
- padding-top: 2px;
- z-index: 12;
-}
-.tundra .dijitTabContainerBottom .tabStripButton {
- padding-top: 2px;
-}
-.tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
- padding-bottom: 3px;
- padding-top: 1px;
-}
-.tundra .tabStripButton .dijitTabInnerDiv {
- padding: 3px 2px 4px 2px;
-}
-.dj_ie6 .tundra .tabStripButton .dijitTabInnerDiv,
-.dj_ie7 .tundra .tabStripButton .dijitTabInnerDiv,
-.dj_opera .tundra .tabStripButton .dijitTabInnerDiv {
- padding-bottom: 5px;
-}
-.dj_ie6 .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv,
-.dj_ie7 .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv,
-.dj_opera .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
- padding-bottom: 4px;
-}
-.tundra .dijitTabStripIcon {
- height: 14px;
- width: 14px;
- background: url(images/spriteRoundedIconsSmall.png) no-repeat left top ;
-}
-.dj_ie6 .tundra .dijitTabStripIcon {
- background-image: url(images/spriteRoundedIconsSmall.gif);
-}
-.tundra .dijitTabStripSlideRightIcon {
- background-position: -30px top;
-}
-.tundra .dijitTabStripMenuIcon {
- background-position: -15px top;
-}
-.tundra .dijitAccordionContainer {
- border-color: #ccc;
- background-color: #fff;
-}
-.tundra .dijitAccordionTitle {
- background:#fafafa url(images/titleBar.png) repeat-x bottom left;
- border-top: 1px solid #bfbfbf;
- padding: 4px 4px 4px 8px;
-}
-.tundra .dijitAccordionTitleHover {
- background: #f8fafd url(images/accordionItemHover.gif) bottom repeat-x;
-}
-.tundra .dijitAccordionTitleSelected {
- background: #f9f9f9 url(images/accordionItemActive.gif) bottom repeat-x;
- font-weight: bold;
- border-top: 1px solid #aaaaaa;
- border-bottom: 1px solid #bfbfbf;
- padding: 4px 4px 4px 8px;
-}
-.tundra .dijitSplitContainerSizerH {
- background:url(images/splitContainerSizerV.png) repeat-y #fff;
- border:0;
- border-left:1px solid #bfbfbf;
- border-right:1px solid #bfbfbf;
- width:7px;
-}
-.tundra .dijitSplitContainerSizerH .thumb {
- background:url(images/splitContainerSizerV-thumb.png) no-repeat #ccc;
- left:1px;
- width:3px;
- height:19px;
- overflow: hidden;
-}
-.tundra .dijitSplitContainerSizerV {
- background:url(images/splitContainerSizerH.png) repeat-x #fff;
- border:0;
- border-top:1px solid #bfbfbf;
- border-bottom:1px solid #bfbfbf;
- height:7px;
-}
-.tundra .dijitSplitContainerSizerV .thumb {
- background:url(images/splitContainerSizerH-thumb.png) no-repeat #ccc;
- top:1px;
- width:19px;
- height:3px;
- overflow: hidden;
-}
-.tundra .dijitBorderContainer {
- background-color: #fcfcfc;
- padding: 5px;
-}
-.tundra .dijitSplitContainer-child,
-.tundra .dijitBorderContainer-child {
-
- border: 1px #ccc solid;
-}
-.tundra .dijitBorderContainer-dijitTabContainerTop,
-.tundra .dijitBorderContainer-dijitTabContainerBottom,
-.tundra .dijitBorderContainer-dijitTabContainerLeft,
-.tundra .dijitBorderContainer-dijitTabContainerRight {
-
- border: none;
-}
-.tundra .dijitBorderContainer-dijitBorderContainer {
-
- border: none;
- padding: 0px;
-}
-.tundra .dijitSplitterH,
-.tundra .dijitGutterH {
- background:#fcfcfc;
- border:0;
- height:5px;
-}
-.tundra .dijitSplitterH .dijitSplitterThumb {
- background:#B0B0B0 none;
- height:1px;
- top:2px;
- width:19px;
-}
-.tundra .dijitSplitterV,
-.tundra .dijitGutterV {
- background:#fcfcfc;
- border:0;
- width:5px;
-}
-.tundra .dijitSplitterV .dijitSplitterThumb {
- background:#B0B0B0 none;
- height:19px;
- left:2px;
- width:1px;
-}
-.tundra .dijitSplitterActive {
- font-size: 1px;
- background-image: none;
- background-color: #aaa;
- -moz-opacity: 0.6;
- opacity: 0.6;
- filter: Alpha(Opacity=60);
- margin: 0;
-}
-.tundra .dijitInputContainer INPUT,
-.tundra .dijitTextBox {
- margin: 0em 0.1em;
-}
-.tundra .dijitTextArea {
- padding: 3px;
-}
-.tundra .dijitTextBox {
-
- background:#fff url(images/validationInputBg.png) repeat-x top left;
- #background:#fff url(images/validationInputBg.gif) repeat-x top left;
- border:1px solid #b3b3b3;
-}
-.tundra .dijitComboBox .dijitButtonNode {
- padding: 0 0.2em;
-}
-.tundra .dijitTextBox .dijitButtonNode {
-
- border-color: #9b9b9b;
-}
-.tundra .dijitTextBoxFocused {
-
- border-color:#406b9b;
-}
-.tundra .dijitTextBoxFocused .dijitButtonNode {
- border-color:#366dba;
-}
-.tundra .dijitError {
- background-color:#f9f7ba;
- background-image:none;
-}
-.tundra .dijitErrorFocused {
- background-color:#f9f999;
- background-image:none;
-}
-.tundra .dijitValidationIcon {
-
- width: 16px;
- background: transparent url(images/warning.png) no-repeat center center;
-}
-.tundra .dijitComboBoxHighlightMatch {
- background-color:#a5beda;
-}
-.tundra .dijitFocusedLabel {
-
- outline: 1px dotted #666666;
-}
-.tundra .dijitButtonNode {
-
- border: 1px solid #c0c0c0;
- border-bottom: 1px solid #9b9b9b;
- padding: 0.1em 0.2em 0.2em 0.2em;
- background: #fff url(images/buttonEnabled.png) repeat-x bottom left;
-}
-.tundra .dijitButtonText {
- text-align: center;
- padding: 0 0.3em;
-}
-.tundra .dijitDisabled .dijitButtonText {
- color: #7F7F7F;
-}
-.tundra .dijitArrowButton {
- color: #111;
-}
-.tundra .dijitComboButton .dijitDownArrowButton {
- padding-right:4px;
-}
-.tundra .dijitTextBoxReadOnly,
-.tundra .dijitTextBoxReadOnly .dijitButtonNode,
-.tundra .dijitButtonDisabled .dijitButtonNode,
-.tundra .dijitToggleButtonDisabled .dijitButtonNode,
-.tundra .dijitDropDownButtonDisabled .dijitButtonNode,
-.tundra .dijitComboButtonDisabled .dijitButtonNode,
-.tundra .dijitTextBoxDisabled,
-.tundra .dijitTextBoxDisabled .dijitButtonNode {
-
- border-color: #d5d5d5 #d5d5d5 #bdbdbd #d5d5d5;
- background:#e4e4e4 url(images/buttonDisabled.png) top repeat-x;
-}
-.tundra .dijitButtonHover .dijitButtonNode,
-.tundra .dijitButtonNodeHover,
-.tundra .dijitToggleButtonHover .dijitButtonNode,
-.tundra .dijitDropDownButtonHover .dijitButtonNode,
-.tundra .dijitComboButton .dijitButtonContentsHover,
-.tundra .dijitComboButton .dijitDownArrowButtonHover {
-
-
- border-color: #a5beda;
- border-bottom-color:#5c7590;
- color:#243C5F;
- background:#fcfdff url(images/buttonHover.png) repeat-x bottom;
-}
-.tundra .dijitDownArrowButtonHover,
-.tundra .dijitUpArrowButtonHover {
-
- color:#243C5F;
- background:#fcfdff url(images/buttonHover.png) repeat-x bottom;
-}
-.tundra .dijitUpArrowButtonActive,
-.tundra .dijitDownArrowButtonActive,
-.tundra .dijitButtonActive .dijitButtonNode,
-.tundra .dijitToggleButtonActive .dijitButtonNode,
-.tundra .dijitDropDownButtonActive .dijitButtonNode,
-.tundra .dijitButtonContentsActive,
-.tundra .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
-
- border-color:#366dba;
- background: #ededed url(images/buttonActive.png) bottom repeat-x;
-}
-.tundra .dijitArrowButtonInner {
- background:url(images/spriteArrows.png) no-repeat scroll 0px center;
- width: 7px;
- height: 7px;
- margin: 0px 4px 0px 4px;
-}
-.tundra .dijitTextBox .dijitArrowButtonInner {
- background-position: 0 center;
-}
-.dj_ie6 .tundra .dijitArrowButtonInner {
- background-image:url(images/spriteArrows.gif);
-}
-.tundra .dijitLeftArrowButton .dijitArrowButtonInner {
- background-position: -7px center;
-}
-.tundra .dijitRightArrowButton .dijitArrowButtonInner {
- background-position: -14px center;
-}
-.tundra .dijitUpArrowButton .dijitArrowButtonInner {
- background-position: -21px center;
-}
-.tundra .dijitDisabled .dijitArrowButtonInner {
- background-position: -28px center;
-}
-.tundra .dijitDisabled .dijitLeftArrowButton .dijitArrowButtonInner {
- background-position: -35px center;
-}
-.tundra .dijitDisabled .dijitRightArrowButton .dijitArrowButtonInner {
- background-position: -42px center;
-}
-.tundra .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner {
- background-position: -49px center;
-}
-.dj_webkit .tundra .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: -1px;
-}
-.dj_ie .tundra .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
- margin-top: -2px;
-}
-.dj_ie8 .tundra .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
- margin-top: -1px;
-}
-.tundra .dijitSpinnerButtonContainer {
- width: auto;
- padding: 0;
-}
-.tundra .dijitSpinner .dijitArrowButton {
- width: 15px;
-}
-.tundra .dijitSpinner .dijitSpinnerButtonInner {
- width: 15px;
-}
-.tundra .dijitSpinner .dijitArrowButtonInner .dijitInputField {
- padding: 0;
-}
-.tundra .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url(images/checkmarkNoBorder.png);
-}
-.dj_ie6 .tundra .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url(images/checkmarkNoBorder.gif);
-}
-.tundra .dijitCheckBox,
-.tundra .dijitCheckBoxIcon {
- background-image: url(images/checkmark.png);
- background-repeat: no-repeat;
- width: 16px;
- height: 16px;
- margin: 0 2px 0 0;
- padding: 0;
-}
-.dj_ie6 .tundra .dijitCheckBox,
-.dj_ie6 .tundra .dijitCheckBoxIcon {
- background-image: url(images/checkmark.gif);
-}
-.tundra .dijitCheckBox,
-.tundra .dijitToggleButton .dijitCheckBoxIcon {
-
- background-position: -16px;
-}
-.tundra .dijitCheckBoxChecked,
-.tundra .dijitToggleButtonChecked .dijitCheckBoxIcon {
-
- background-position: 0px;
-}
-.tundra .dijitCheckBoxDisabled {
-
- background-position: -48px;
-}
-.tundra .dijitCheckBoxCheckedDisabled {
-
- background-position: -32px;
-}
-.tundra .dijitCheckBoxHover {
-
- background-position: -80px;
-}
-.tundra .dijitCheckBoxCheckedHover {
-
- background-position: -64px;
-}
-.tundra .dijitRadio,
-.tundra .dijitRadioIcon {
- background-image: url(images/checkmark.png);
- background-repeat: no-repeat;
- width: 16px;
- height: 16px;
- margin: 0;
- padding: 0;
-}
-.dj_ie6 .tundra .dijitRadio,
-.dj_ie6 .tundra .dijitRadioIcon {
- background-image: url(images/checkmark.gif);
-}
-.tundra .dijitToggleButton .dijitRadioIcon {
-
- background-image: url(images/checkmarkNoBorder.png);
-}
-.dj_ie6 .tundra .dijitToggleButton .dijitRadioIcon {
- background-image: url(images/checkmarkNoBorder.gif);
-}
-.tundra .dijitRadio,
-.tundra .dijitRadioIcon {
-
- background-position: -112px;
-}
-.tundra .dijitRadioDisabled {
-
- background-position: -144px;
-}
-.tundra .dijitRadioHover {
-
- background-position: -176px;
-}
-.tundra .dijitRadioChecked,
-.tundra .dijitRadioCheckedHover,
-.tundra .dijitToggleButtonChecked .dijitRadioIcon {
-
- background-position: -96px;
-}
-.tundra .dijitRadioCheckedDisabled {
-
- background-position: -128px;
-}
-.tundra .dijitSliderProgressBarH {
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFull.png) repeat-x top left;
-}
-.tundra .dijitSliderProgressBarV {
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFullVertical.png) repeat-y bottom left;
-}
-.tundra .dijitSliderFocused .dijitSliderProgressBarH,
-.tundra .dijitSliderFocused .dijitSliderLeftBumper {
- background-image:url(images/sliderFullFocus.png);
-}
-.tundra .dijitSliderFocused .dijitSliderProgressBarV,
-.tundra .dijitSliderFocused .dijitSliderBottomBumper {
- background-image:url(images/sliderFullVerticalFocus.png);
-}
-.tundra .dijitSliderRemainingBarV {
- border-color: #b4b4b4;
- background: #dcdcdc url(images/sliderEmptyVertical.png) repeat-y bottom left;
-}
-.tundra .dijitSliderRemainingBarH {
- border-color: #b4b4b4;
- background: #dcdcdc url(images/sliderEmpty.png) repeat-x top left;
-}
-.tundra .dijitSliderBar {
- border-style: solid;
- outline:1px;
-}
-.tundra .dijitSliderFocused .dijitSliderBar {
- border-color:#888;
-}
-.tundra .dijitSliderImageHandleH {
- border:0px;
- width:16px;
- height:16px;
- background:url(images/preciseSliderThumb.png) no-repeat center top;
-}
-.tundra .dijitSliderFocused .dijitSliderImageHandleH {
- background-image:url(images/preciseSliderThumbFocus.png);
- #background-image:url(images/preciseSliderThumbFocus.gif);
-}
-.dj_ie6 .tundra .dijitSliderImageHandleH {
- background-image:url(images/preciseSliderThumb.gif);
-}
-.tundra .dijitSliderLeftBumper {
- border-left-width: 1px;
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFull.png) repeat-x top left;
-}
-.tundra .dijitSliderRightBumper {
- background: #dcdcdc url(images/sliderEmpty.png) repeat-x top left;
- border-color: #b4b4b4;
- border-right-width: 1px;
-}
-.tundra .dijitSliderImageHandleV {
- border:0px;
- width:16px;
- height:16px;
- background:url(images/sliderThumb.png) no-repeat center center;
-}
-.tundra .dijitSliderFocused .dijitSliderImageHandleV {
- background-image:url(images/sliderThumbFocus.png);
-}
-.dj_ie6 .tundra .dijitSliderFocused .dijitSliderImageHandleV {
- background-image:url(images/sliderThumbFocus.gif);
-}
-.tundra .dijitSliderBottomBumper {
- border-bottom-width: 1px;
- border-color: #aab0bb;
- background: #c0c2c5 url(images/sliderFullVertical.png) repeat-y bottom left;
-}
-.tundra .dijitSliderTopBumper {
- background: #dcdcdc url(images/sliderEmptyVertical.png) repeat-y top left;
- border-color: #b4b4b4;
- border-top-width: 1px;
-}
-.tundra .dijitSliderDecrementIconH,
-.tundra .dijitSliderDecrementIconV,
-.tundra .dijitSliderIncrementIconH,
-.tundra .dijitSliderIncrementIconV {
- background-image: url(images/spriteArrows.png);
- background-repeat: no-repeat;
- margin: 5px;
- height: 7px;
- width: 7px;
- font-size: 1px;
-}
-.dj_ie6 .tundra .dijitSliderDecrementIconH,
-.dj_ie6 .tundra .dijitSliderDecrementIconV,
-.dj_ie6 .tundra .dijitSliderIncrementIconH,
-.dj_ie6 .tundra .dijitSliderIncrementIconV {
- background-image: url(images/spriteArrows.gif);
-}
-.tundra .dijitSliderDecrementIconH {
- background-position: -7px 0px;
-}
-.tundra .dijitSliderIncrementIconH {
- background-position: -14px 0px;
-}
-.tundra .dijitSliderDecrementIconV {
- background-position: 0px 0px;
-}
-.tundra .dijitSliderIncrementIconV {
- background-position: -21px 0px;
-}
-.tundra .dijitSliderButtonInner {
- visibility:hidden;
-}
-.tundra .dijitSliderReadOnly *,
-.tundra .dijitSliderDisabled * {
- border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
- color: #bdbdbd;
-}
-.tundra .dijitSliderReadOnly .dijitSliderDecrementIconH,
-.tundra .dijitSliderDisabled .dijitSliderDecrementIconH {
- background-position: -35px 0px;
-}
-.tundra .dijitSliderReadOnly .dijitSliderIncrementIconH,
-.tundra .dijitSliderDisabled .dijitSliderIncrementIconH {
- background-position: -42px 0px;
-}
-.tundra .dijitSliderReadOnly .dijitSliderDecrementIconV,
-.tundra .dijitSliderDisabled .dijitSliderDecrementIconV {
- background-position: -28px 0px;
-}
-.tundra .dijitSliderReadOnly .dijitSliderIncrementIconV,
-.tundra .dijitSliderDisabled .dijitSliderIncrementIconV {
- background-position: -49px 0px;
-}
-.tundra .dijitSelect .dijitButtonNode {
- padding: 0px;
-}
-.tundra .dijitSelect .dijitButtonNode .dijitArrowButtonInner {
- margin: 0px 4px 0px 5px;
-}
-.tundra .dijitSelect .dijitButtonContents {
- padding-top: 1px;
- background:#fff url(images/validationInputBg.png) repeat-x top left;
- #background:#fff url(images/validationInputBg.gif) repeat-x top left;
-}
-.tundra .dijitSelectHover .dijitButtonContents,
-.tundra .dijitSelectActive .dijitButtonContents,
-.tundra .dijitSelectOpened .dijitButtonContents,
-.tundra .dijitSelectDisabled .dijitButtonContents,
-.tundra .dijitSelectReadOnly .dijitButtonContents{
- background: transparent none;
-}
-.dj_ie .tundra .dijitSelect .dijitButtonContents {
- padding-top: 0px;
-}
-.tundra .dijitSelectDisabled .dijitButtonNode {
- border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
- background:#e4e4e4 url(images/buttonDisabled.png) top repeat-x;
-}
-.dj_ie .tundra .dijitSelectDisabled .dijitButtonNode * {
- filter: gray() alpha(opacity=50);
-}
-.tundra .dijitSelectHover .dijitButtonNode {
- border-color:#a5beda;
- border-bottom-color:#5c7590;
- border-right-color:#5c7590;
- color:#243C5F;
- background:#fcfdff url(images/buttonHover.png) repeat-x bottom;
-}
-.tundra .dijitSelectActive .dijitButtonNode,
-.tundra .dijitSelectOpened .dijitButtonNode {
- border-color:#366dba;
- background: #ededed url(images/buttonActive.png) bottom repeat-x;
-}
-.tundra .dijitSelectMenu td {
- padding: 0em;
-}
-.tundra .dijitSelectMenu .dijitMenuItemLabel,
-.tundra .dijitSelectMenu .dijitMenuArrowCell {
- padding: 0.1em 0.2em;
-}
-.tundra .dijitTreeNode {
- background-image : url(images/i.gif);
- background-repeat : repeat-y;
- zoom: 1;
-}
-.tundra .dijitTreeIsLast {
- background: url(images/i_half.gif) no-repeat;
-}
-.tundra .dijitTreeIsRoot {
- margin-left: 0;
- background-image: none;
-}
-.tundra .dijitTreeExpando {
- width: 18px;
- height: 18px;
-}
-.tundra .dijitTreeRow {
-
- padding-bottom: 2px;
-}
-.tundra .dijitTreeContent {
- min-height: 18px;
- min-width: 18px;
-}
-.tundra .dijitTreeRowSelected .dijitTreeLabel {
- background:#e2ebfe;
-}
-.tundra .dijitTreeRowHover {
-
- background-image: url(images/treeHover.png);
- background-repeat: repeat;
- background-color: transparent !important;
-}
-.tundra .dijitTreeExpandoOpened {
- background-image: url(images/treeExpand_minus.gif);
-}
-.tundra .dijitTreeExpandoClosed {
- background-image: url(images/treeExpand_plus.gif);
-}
-.tundra .dijitTreeExpandoLeaf {
- background-image: url(images/treeExpand_leaf.gif);
-}
-.tundra .dijitTreeExpandoLoading {
- background-image: url(images/treeExpand_loading.gif);
-}
-.tundra .dijitTreeIcon {
- width: 16px;
- height: 16px;
-}
-.tundra .dijitFolderOpened {
- background: url(images/folderOpened.gif) no-repeat;
-}
-.tundra .dijitFolderClosed {
- background: url(images/folderClosed.gif) no-repeat;
-}
-.tundra .dijitLeaf {
- background: url(images/leaf.gif) no-repeat;
-}
-.tundra .dijitTreeNode .dojoDndItemBefore,
-.tundra .dijitTreeNode .dojoDndItemAfter {
- border-bottom: none;
- border-top: none;
-}
-.tundra .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
-
- border-top: 2px solid #369;
-}
-.tundra .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
-
- border-bottom: 2px solid #369;
-}
-.tundra .dijitProgressBar {
- margin:2px 0px 2px 0px;
-}
-.tundra .dijitProgressBarEmpty {
-
- background:#fff url(images/progressBarEmpty.png) repeat-x center center;
- border-color: #a2a2a2 #b8b8b8 #b8b8b8 #a2a2a2;
-}
-.tundra .dijitProgressBarTile {
-
- background:#f0f0f0 url(images/progressBarFull.png) repeat-x center center;
-}
-.tundra .dijitProgressBarFull {
- border-right:1px solid #b8b8b8;
-}
-.tundra .dijitProgressBarLabel {
-
- color:#293a4b;
-}
-.tundra .dijitProgressBarIndeterminate .dijitProgressBarTile {
-
- background:#cad2de url(images/progressBarAnim.gif) repeat-x center center;
-}
-.tundra .dijitTitlePaneTitle {
- background: #cccccc;
- background:#fff url(images/titleBar.png) repeat-x bottom left;
- border:1px solid #bfbfbf;
- padding:3px 4px;
-}
-.tundra .dijitTitlePaneTitleHover {
- background: #f8fafd url(images/accordionItemHover.gif) bottom repeat-x;
-}
-.tundra .dijitTitlePane .dijitArrowNode {
- background-image: url(images/spriteArrows.png);
- background-repeat: no-repeat;
- background-position: 0px 0px;
- height: 7px;
- width: 7px;
-}
-.dj_ie6 .tundra .dijitTitlePane .dijitArrowNode {
- background-image: url(images/spriteArrows.gif);
-}
-.tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
- background-position: -14px 0px;
-}
-.tundra .dijitTitlePaneContentOuter {
- background: #ffffff;
- border:1px solid #bfbfbf;
- border-top: 0px;
-}
-.tundra .dijitTitlePaneContentInner {
- padding:10px;
-}
-.tundra .dijitTitlePaneTextNode {
- margin-left: 4px;
- margin-right: 4px;
-}
-.tundra .dijitCalendarIncrementControl {
-
- width:15px;
- height:15px;
- background-image: url(images/spriteRoundedIconsSmall.png);
- background-repeat: no-repeat
-}
-.dj_ie6 .tundra .dijitCalendarIncrementControl {
- font-size:.1em;
- background-image: url(images/spriteRoundedIconsSmall.gif);
-}
-.tundra .dijitA11ySideArrow {
- display: none;
-}
-.tundra .dijitCalendarDecrease {
- background-position: top left;
-}
-.tundra .dijitCalendarIncrease {
- background-position: -30px top;
-}
-.tundra .dijitCalendarContainer {
- font-size: 100%;
- border-spacing: 0;
- border-collapse: separate;
- border: 1px solid #ccc;
- margin: 0;
-}
-.tundra .dijitCalendarMonthContainer th {
-
- background:#d3d3d3 url(images/titleBar.png) repeat-x top;
- padding-top:.3em;
- padding-bottom:.2em;
- text-align:center;
-}
-.dj_ie6 .tundra .dijitCalendarMonthContainer th {
- padding-top:.2em;
- padding-bottom:.1em;
-}
-.tundra .dijitCalendarDayLabelTemplate {
-
- background:white url(images/calendarDayLabel.png) repeat-x bottom;
- font-weight:normal;
- padding-top:.15em;
- padding-bottom:0em;
- border-top: 1px solid #eeeeee;
- color:#293a4b;
- text-align:center;
-}
-.tundra .dijitCalendarBodyContainer {
- border-bottom: 1px solid #eeeeee;
-}
-.tundra .dijitCalendarMonthLabel {
- color:#293a4b;
- font-weight: bold;
-}
-.tundra .dijitCalendarDateTemplate {
-
- font-size: 0.9em;
- font-weight: bold;
- text-align: center;
- padding: 0.3em 0.3em 0.05em 0.3em;
- letter-spacing: 1px;
-}
-.dj_ie .tundra .dijitCalendarDateTemplate {
- padding: 0.1em .33em 0.02em .33em;
-}
-.tundra .dijitCalendarPreviousMonth,
-.tundra .dijitCalendarNextMonth {
-
- color:#999999;
- background-color:#f8f8f8;
-}
-.tundra .dijitCalendarCurrentMonth {
-
- background-color: white;
-}
-.tundra .dijitCalendarCurrentDate {
-
- text-decoration:underline;
- font-weight:bold;
-}
-.tundra .dijitCalendarHoveredDate {
- background-color: #e2ebf2;
-}
-.tundra .dijitCalendarDisabledDate {
- text-decoration: line-through;
- background-color: white;
-}
-.tundra .dijitCalendarSelectedDate {
-
- background-color:#bbc4d0 !important;
- color:black !important;
-}
-.tundra .dijitCalendarYearContainer {
-
- background:white url(images/calendarYearLabel.png) repeat-x bottom;
- border-top:1px solid #ccc;
-}
-.tundra .dijitCalendarYearLabel {
-
- margin:0;
- padding:0.4em 0 0.25em 0;
- text-align:center;
-}
-.tundra .dijitCalendarSelectedYear {
-
- color:black;
- padding:0.2em;
- padding-bottom:0.1em;
- background-color:#bbc4d0 !important;
-}
-.tundra .dijitCalendarNextYear,
-.tundra .dijitCalendarPreviousYear {
-
- color:black !important;
- font-weight:normal;
-}
-.tundra .dijitTimePickerTick,
-.tundra .dijitTimePickerMarker {
- border-color: #ccc;
-}
-.tundra .dijitTimePickerTick {
- color:white;
-}
-.tundra .dijitTimePickerMarker {
- background:#d3d3d3 url(images/titleBar.png) repeat-x top;
- color:#293a4b;
- font-weight: bold;
-}
-.tundra .dijitTimePickerItemSelected {
- color: black;
- background: #bbc4d0 none;
-}
-.tundra .dijitTimePickerItemHover {
- background: #60a1ea none;
- color:white;
-}
-.tundra .dijitTimePickerItemHover,
-.tundra .dijitTimePickerItemSelected {
- position: relative;
- z-index: 10;
-}
-.tundra .dijitTimePickerTick .dijitTimePickerItemInner {
- font-size:0.4em;
-}
-.tundra .dijitTimePickerItemHover .dijitTimePickerItemInner,
-.tundra .dijitTimePickerItemSelected .dijitTimePickerItemInner {
- font-size:1em;
-}
-.tundra .dijitTimePickerMarkerHover {
- border-top: 1px solid #ccc;
-}
-.tundra .dijitTimePickerTickHover,
-.tundra .dijitTimePickerTickSelected {
- margin-top:-0.3em;
- margin-bottom:-0.3em;
- border-bottom: none;
-}
-.tundra .dijitToolbar {
- border-bottom: 1px solid #ccc;
- background:#eaeaea url(images/titleBar.png) repeat-x top left;
-}
-.dj_ie6 .tundra .dijitToolbar {
- height: 10px;
-}
-.tundra .dijitToolbar .dijitButtonNode,
-.tundra .dijitToolbar .dijitComboButton .dijitButtonContents,
-.tundra .dijitToolbar .dijitComboButton .dijitDownArrowButton {
- background: none;
- margin: 0px;
- padding: 0px;
- border: none;
- font-size: 12px;
-}
-.tundra .dijitToolbar .dijitButton,
-.tundra .dijitToolbar .dijitToggleButton,
-.tundra .dijitToolbar .dijitDropDownButton,
-.tundra .dijitToolbar .dijitComboButton .dijitButtonContents,
-.tundra .dijitToolbar .dijitComboButton .dijitDownArrowButton {
- background: none;
- padding: 1px;
-}
-.tundra .dijitToolbar .dijitButtonChecked,
-.tundra .dijitToolbar .dijitToggleButtonChecked {
- background-color:#d4dff2;
- border:1px solid #316ac5;
- padding: 0px;
-}
-.tundra .dijitToolbar .dijitButtonCheckedHover,
-.tundra .dijitToolbar .dijitToggleButtonCheckedHover
- {
- background-color:#abc1e5;
- border:1px solid #316ac5;
- padding: 0px;
-}
-.tundra .dijitToolbar .dijitButtonHover,
-.tundra .dijitToolbar .dijitToggleButtonHover,
-.tundra .dijitToolbar .dijitDropDownButtonHover,
-.tundra .dijitToolbar .dijitComboButton .dijitButtonContentsHover,
-.tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover {
-
- border: 1px solid #869cbf;
- padding: 0px;
- background-color:#e1e5f0;
-}
-.tundra .dijitToolbar label {
- padding: 3px 3px 0 6px;
-}
-.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
-.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
-
- border: 1px #555 dotted !important;
- padding: 0px;
-}
-.tundra .dijitToolbarSeparator {
-
- background: url(../../icons/images/editorIconsEnabled.png);
-}
-.tundra .dijitToolbarRtl .dijitToolbarSeparator {
-
- background-image: url(../../icons/images/editorIconsDisabled.png);
-}
-.tundra .dijitDialog {
- background: #fff;
- border: 1px solid #7eabcd;
- padding: 0px;
- -webkit-box-shadow: 0px 5px 10px #adadad;
-}
-.tundra .dijitDialogPaneContent {
- background: #fff;
- border-top: 1px solid #d3d3d3;
- padding:10px;
-}
-.tundra .dijitDialogTitleBar {
-
- background: #fafafa url(images/titleBar.png) repeat-x top left;
- padding: 5px 6px 3px 6px;
- outline:0;
-}
-.tundra .dijitDialogTitle {
-
- font-weight: bold;
- padding: 0px 4px;
-}
-.tundra .dijitDialogCloseIcon {
-
-
- background: url(images/tabClose.png) no-repeat right top;
- position: absolute;
- vertical-align: middle;
- right: 6px;
- top: 4px;
- height: 15px;
- width: 15px;
-}
-.dj_ie6 .tundra .dijitDialogCloseIcon {
- background : url(images/tabClose.gif) no-repeat right top;
-}
-.tundra .dijitDialogCloseIconHover {
- background: url(images/tabCloseHover.png) no-repeat right top;
-}
-.dj_ie6 .tundra .dijitDialogCloseIconHover {
- background : url(images/tabCloseHover.gif) no-repeat right top;
-}
-.tundra .dijitTooltip,
-.tundra .dijitTooltipDialog {
-
- background: transparent;
-}
-.dijitTooltipBelow {
-
- padding-top: 13px;
-}
-.dijitTooltipAbove {
-
- padding-bottom: 13px;
-}
-.tundra .dijitTooltipContainer {
-
- background: #ffffff url(images/popupMenuBg.gif) repeat-x bottom left;
- border: 1px solid #7eabcd;
- padding: 0.45em;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
-}
-.tundra .dijitTooltipConnector {
-
- border:0px;
- z-index: 2;
-}
-.tundra .dijitTooltipABRight .dijitTooltipConnector {
-
- left: auto !important;
- right: 3px;
-}
-.tundra .dijitTooltipBelow .dijitTooltipConnector {
-
- top: 0px;
- left: 3px;
- background:url(images/tooltipConnectorUp.png) no-repeat top left;
- width:16px;
- height:14px;
-}
-.dj_ie .tundra .dijitTooltipBelow .dijitTooltipConnector {
-
- background-image: url(images/tooltipConnectorUp.gif);
-}
-.tundra .dijitTooltipAbove .dijitTooltipConnector {
-
- bottom: 0px;
- left: 3px;
- background:url(images/tooltipConnectorDown.png) no-repeat top left;
- width:16px;
- height:14px;
-}
-.dj_ie .tundra .dijitTooltipAbove .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorDown.gif);
-}
-.dj_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
- bottom: -3px;
-}
-.tundra .dijitTooltipLeft {
- padding-right: 14px;
-}
-.dj_ie6 .tundra .dijitTooltipLeft {
- padding-left: 15px;
-}
-.tundra .dijitTooltipLeft .dijitTooltipConnector {
-
- right: 0px;
- bottom: 3px;
- background:url(images/tooltipConnectorRight.png) no-repeat top left;
- width:16px;
- height:14px;
-}
-.dj_ie .tundra .dijitTooltipLeft .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorRight.gif);
-}
-.tundra .dijitTooltipRight {
- padding-left: 14px;
-}
-.tundra .dijitTooltipRight .dijitTooltipConnector {
-
- left: 0px;
- bottom: 3px;
- background:url(images/tooltipConnectorLeft.png) no-repeat top left;
- width:16px;
- height:14px;
-}
-.dj_ie .tundra .dijitTooltipRight .dijitTooltipConnector {
- background-image: url(images/tooltipConnectorLeft.gif);
-}
-.dj_webkit .tundra .dijitTooltipContainer {
- -webkit-box-shadow: 0px 5px 10px #adadad;
-}
-.tundra .dijitMenu,
-.tundra .dijitMenuBar {
- border: 1px solid #7eabcd;
- margin: 0px;
- padding: 0px;
- background-color: #f7f7f7;
-}
-.tundra .dijitBorderContainer .dijitMenuBar {
- border:1px solid #ccc;
-}
-.tundra .dijitMenuItem {
- font-family: sans-serif;
- margin: 0;
-}
-.tundra .dijitMenuItem {
- padding: 4px 5px;
-}
-.tundra .dijitMenuPreviousButton, .tundra .dijitMenuNextButton {
- font-style: italic;
-}
-.tundra .dijitMenuItem td {
- padding: 2px;
-}
-.tundra .dijitMenuPassive .dijitMenuItemHover,
-.tundra .dijitMenuItemSelected {
- background-color: #3559ac;
- color:#fff;
-}
-.tundra .dijitMenuItemIcon {
- width: 16px;
- height: 16px;
-}
-.tundra .dijitMenuExpand {
-
- width: 7px;
- height: 7px;
- background-image: url(images/spriteArrows.png);
- background-position: -14px 0px;
-}
-.dj_ie6 .tundra .dijitMenuExpand {
- background-image: url(images/spriteArrows.gif);
-}
-.tundra .dijitMenuSeparatorTop {
- border-bottom: 1px solid #9b9b9b;
-}
-.tundra .dijitMenuSeparatorBottom {
- border-top: 1px solid #e8e8e8;
-}
-.tundra .dijitCheckedMenuItemIconChar {
- display: none;
-}
-.tundra .dijitCheckedMenuItemIcon {
- background-image: url(images/checkmark.png);
- background-position: -80px;
-}
-.dj_ie6 .tundra .dijitCheckedMenuItemIcon {
- background-image: url(images/checkmark.gif);
-}
-.tundra .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
- background-position: -64px;
-}
-.dijitEditor {
- border:1px solid #bfbfbf;
- border-top:0;
-}
-.tundra .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled.png);
- background-repeat: no-repeat;
- width: 18px;
- height: 18px;
- text-align: center;
-}
-.tundra .dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled.png);
-}
-.dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled.png);
- background-repeat: no-repeat;
- width: 18px;
- height: 18px;
- text-align: center;
-}
-.dijitDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled.png);
-}
-.dijitEditorIconSep { background-position: 0px; }
-.dijitEditorIconSave { background-position: -18px; }
-.dijitEditorIconPrint { background-position: -36px; }
-.dijitEditorIconCut { background-position: -54px; }
-.dijitEditorIconCopy { background-position: -72px; }
-.dijitEditorIconPaste { background-position: -90px; }
-.dijitEditorIconDelete { background-position: -108px; }
-.dijitEditorIconCancel { background-position: -126px; }
-.dijitEditorIconUndo { background-position: -144px; }
-.dijitEditorIconRedo { background-position: -162px; }
-.dijitEditorIconSelectAll { background-position: -180px; }
-.dijitEditorIconBold { background-position: -198px; }
-.dijitEditorIconItalic { background-position: -216px; }
-.dijitEditorIconUnderline { background-position: -234px; }
-.dijitEditorIconStrikethrough { background-position: -252px; }
-.dijitEditorIconSuperscript { background-position: -270px; }
-.dijitEditorIconSubscript { background-position: -288px; }
-.dijitEditorIconJustifyCenter { background-position: -306px; }
-.dijitEditorIconJustifyFull { background-position: -324px; }
-.dijitEditorIconJustifyLeft { background-position: -342px; }
-.dijitEditorIconJustifyRight { background-position: -360px; }
-.dijitEditorIconIndent { background-position: -378px; }
-.dijitEditorIconOutdent { background-position: -396px; }
-.dijitEditorIconListBulletIndent { background-position: -414px; }
-.dijitEditorIconListBulletOutdent { background-position: -432px; }
-.dijitEditorIconListNumIndent { background-position: -450px; }
-.dijitEditorIconListNumOutdent { background-position: -468px; }
-.dijitEditorIconTabIndent { background-position: -486px; }
-.dijitEditorIconLeftToRight { background-position: -504px; }
-.dijitEditorIconRightToLeft, .dijitEditorIconToggleDir { background-position: -522px; }
-.dijitEditorIconBackColor { background-position: -540px; }
-.dijitEditorIconForeColor { background-position: -558px; }
-.dijitEditorIconHiliteColor { background-position: -576px; }
-.dijitEditorIconNewPage { background-position: -594px; }
-.dijitEditorIconInsertImage { background-position: -612px; }
-.dijitEditorIconInsertTable { background-position: -630px; }
-.dijitEditorIconSpace { background-position: -648px; }
-.dijitEditorIconInsertHorizontalRule { background-position: -666px; }
-.dijitEditorIconInsertOrderedList { background-position: -684px; }
-.dijitEditorIconInsertUnorderedList { background-position: -702px; }
-.dijitEditorIconCreateLink { background-position: -720px; }
-.dijitEditorIconUnlink { background-position: -738px; }
-.dijitEditorIconViewSource { background-position: -756px; }
-.dijitEditorIconRemoveFormat { background-position: -774px; }
-.dijitEditorIconFullScreen { background-position: -792px; }
-.dijitEditorIconWikiword { background-position: -810px; }
-
-.dijitColorPalette {
- border:1px solid #7eabcd;
- background:#fff;
- -moz-border-radius: 0px !important;
-}
-.dijitRtl .dijitPlaceHolder {
- left: auto;
- right: 0;
-}
-.dijitMenuItemRtl {
- text-align: right;
-}
-.dj_iequirks .dijitComboButtonRtl BUTTON {
-
- float:left;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitComboBoxRtl .dijitArrowButtonContainer {
-
- border-right-width: 1px !important;
- border-right-style: solid !important;
- border-left-width: 0px !important;
- border-left-style: none !important;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijit_a11y .dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBoxRtl .dijitArrowButtonContainer {
- border-right: 1px solid black !important;
- border-left: 0px none black !important;
-}
-.dijitSpinnerRtl .dijitSpinnerButtonContainer .dijitArrowButton {
- right: 0;
- left: auto;
-}
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitArrowButtonContainer {
- float: left;
-}
-.dijitCalendarRtl .dijitCalendarNextYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarRtl .dijitCalendarPreviousYear {
- margin:0 0 0 0.55em;
-}
-.dijitSliderRtl .dijitSliderImageHandleV {
- left:auto;
-}
-.dijitSliderRtl .dijitSliderImageHandleH {
- left:-50%;
-}
-.dijitSliderRtl .dijitSliderMoveableH {
- right:auto;
- left:0;
-}
-.dijitSliderRtl .dijitRuleContainerV {
- float:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleContainerV {
- text-align:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelV {
- text-align:left;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelH {
- zoom:1;
-}
-.dijitSliderRtl .dijitSliderProgressBarH {
-
- float:right;
- right:0;
- left:auto;
-}
-.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
- background-position:right;
- padding-right:25px;
-}
-.dijitTabRtl .dijitTabCloseButton {
- margin-left: 0px;
- margin-right: 1em;
-}
-.dj_ie .dijitTimePickerRtl .dijitTimePickerItem {
- width:100%;
-}
-.dijitColorPaletteRtl .dijitColorPaletteUnder {
-
- left: auto;
- right: 0;
-}
-.dijitSelectRtl .dijitButtonContents {
- text-align: right;
-}
-.tundra .dijitCalendarRtl .dijitCalendarDecrease {
- background-position: -30px top;
-}
-.tundra .dijitCalendarRtl .dijitCalendarIncrease {
- background-position: 0px top;
-}
- .dj_ie6 .tundra .dijitTimePickerRtl .dijitTimePickerMarkerHover,
-.dj_ie7 .tundra .dijitTimePickerRtl .dijitTimePickerMarkerHover {
- border-top: 0px;
-}
-.tundra .dijitDialogRtl .dijitDialogCloseIcon {
- right: auto;
- left: 5px;
-}
-.tundra .dijitEditorRtl .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.tundra .dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitEditorRtl .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitToolbarRtl .dijitToolbarSeparator {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.tundra .dijitMenuItemRtl .dijitMenuExpand {
- background-position: -7px 0px;
-}
-.tundra .dijitTreeNodeRtl,
-.tundra .dijitTreeNodeRtl .dijitTreeExpandoLeaf {
-
- background-image: none;
-}
-.tundra .dijitTreeNodeRtl .dijitTreeExpandoOpened {
-
- background-image: url(images/treeExpand_minus_rtl.gif);
-}
-.tundra .dijitTreeNodeRtl .dijitTreeExpandoClosed {
- background-image: url(images/treeExpand_plus_rtl.gif);
-}
-.tundra .dijitTitlePaneRtl .dijitClosed .dijitArrowNode {
- background-position: -7px 0px;
-}
-.tundra .dijitTabRtl {
- -moz-box-orient:horizontal;
- text-align: right;
-}
-.tundra .dijitTabRtl .dijitTabInnerDiv {
- padding:2px 9px 2px 8px;
-}
-.tundra .tabStrip-disabled .tabStripButtonRtl .dijitTabInnerDiv {
-
- padding-bottom: 3px;
- padding-top: 1px;
-}
-.tundra .tabStripButtonRtl .dijitTabInnerDiv {
- padding: 3px 2px 4px 2px;
-}
-.tundra .dijitTabPaneWrapper {
- #zoom: 1;
-}
-.dj_ie-rtl .tundra .dijitTabContainerLeft-tabs {
- margin-left: 1px !important;
-}
-.dj_ie-rtl .tundra .dijitTabContainerRight-tabs {
- margin-right: 1px !important;
-}
-.tundra .dijitTabContainerLeft-tabs .dijitTabRtl,
-.tundra .dijitTabContainerRight-tabs .dijitTabRtl {
- margin-left:0px;
-}
-.dj_ie .tundra .dijitTabRtl .dijitTabInnerDiv {
-
- width : 0.1% !important;
-}
-.dj_iequirks-rtl .tundra .dijitTabContainerTopNone,
-.dj_iequirks-rtl .tundra .dijitTabContainerBottomNone {
-
- border-left: 1px solid #fff;
- border-right: 1px solid #fff;
-}
-.tundra .dijitSliderRtl .dijitSliderProgressBarH,
-.tundra .dijitSliderRtl .dijitSliderRemainingBarH,
-.tundra .dijitSliderRtl .dijitSliderLeftBumper,
-.tundra .dijitSliderRtl .dijitSliderRightBumper,
-.tundra .dijitSliderRtl .dijitSliderTopBumper {
- background-position: top right;
-}
-.tundra .dijitSliderRtl .dijitSliderProgressBarV,
-.tundra .dijitSliderRtl .dijitSliderRemainingBarV,
-.tundra .dijitSliderRtl .dijitSliderBottomBumper {
- background-position: bottom right;
-}
-.tundra .dijitSliderRtl .dijitSliderLeftBumper {
- border-left-width: 0px;
- border-right-width: 1px;
-}
-.tundra .dijitSliderRtl .dijitSliderRightBumper {
- border-left-width: 1px;
- border-right-width: 0px;
-}
-.tundra .dijitSliderRtl .dijitSliderIncrementIconH {
- background-position: -7px 0px;
-}
-.tundra .dijitSliderRtl .dijitSliderDecrementIconH {
- background-position: -14px 0px;
-}
+ NOTES:
+ ---
+ Dialog.css contains css classes for both Dialog and Tooltip!
+ This because currently a dijit.TooltipDialog exist. Until this is resolved
+ you need to include Dialog.css for both dijits
+ ---
+ Toolbar.css contains classes also used in Editor. Until this is resolved
+ you need to include Toolbar.css for both Toolbar and Editor
+ ---
+ Button.css contains classes for combobox,
+
+*/
+@import url("../dijit.css");
+@import url("../../icons/commonIcons.css");/*sprite containing common icons to be used by all themes*/
+@import url("Common.css");
+@import url("layout/ContentPane.css");
+@import url("layout/TabContainer.css");
+@import url("layout/AccordionContainer.css");
+@import url("layout/SplitContainer.css");
+@import url("layout/BorderContainer.css");
+@import url("form/Common.css");
+@import url("form/Button.css");
+@import url("form/Checkbox.css");
+@import url("form/RadioButton.css");
+@import url("form/Slider.css");
+@import url("form/Select.css");
+@import url("Tree.css");
+@import url("ProgressBar.css");
+@import url("TitlePane.css");
+@import url("Calendar.css");
+@import url("TimePicker.css");
+@import url("Toolbar.css");
+@import url("Dialog.css");
+@import url("Menu.css");
+@import url("Editor.css");
+@import url("../../icons/editorIcons.css"); /* sprite for editor icons to be used by all themes */
+@import url("ColorPalette.css");
+@import url("tundra_rtl.css");
diff --git a/lib/dijit/themes/tundra/tundra_rtl.css b/lib/dijit/themes/tundra/tundra_rtl.css
index 0ec76debc..58b7541fb 100644
--- a/lib/dijit/themes/tundra/tundra_rtl.css
+++ b/lib/dijit/themes/tundra/tundra_rtl.css
@@ -1,200 +1,27 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
-.dijitRtl .dijitPlaceHolder {
- left: auto;
- right: 0;
-}
-.dijitMenuItemRtl {
- text-align: right;
-}
-.dj_iequirks .dijitComboButtonRtl BUTTON {
-
- float:left;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitComboBoxRtl .dijitArrowButtonContainer {
-
- border-right-width: 1px !important;
- border-right-style: solid !important;
- border-left-width: 0px !important;
- border-left-style: none !important;
-}
-.dijit_a11y .dijitTextBoxRtl .dijitValidationContainer,
-.dijit_a11y .dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitComboBoxRtl .dijitArrowButtonContainer {
- border-right: 1px solid black !important;
- border-left: 0px none black !important;
-}
-.dijitSpinnerRtl .dijitSpinnerButtonContainer .dijitArrowButton {
- right: 0;
- left: auto;
-}
-.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitTextBoxRtl .dijitValidationContainer,
-.dijitTextBoxRtl .dijitArrowButtonContainer {
- float: left;
-}
-.dijitCalendarRtl .dijitCalendarNextYear {
- margin:0 0.55em 0 0;
-}
-.dijitCalendarRtl .dijitCalendarPreviousYear {
- margin:0 0 0 0.55em;
-}
-.dijitSliderRtl .dijitSliderImageHandleV {
- left:auto;
-}
-.dijitSliderRtl .dijitSliderImageHandleH {
- left:-50%;
-}
-.dijitSliderRtl .dijitSliderMoveableH {
- right:auto;
- left:0;
-}
-.dijitSliderRtl .dijitRuleContainerV {
- float:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleContainerV {
- text-align:right;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelV {
- text-align:left;
-}
-.dj_ie .dijitSliderRtl .dijitRuleLabelH {
- zoom:1;
-}
-.dijitSliderRtl .dijitSliderProgressBarH {
-
- float:right;
- right:0;
- left:auto;
-}
-.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
- background-position:right;
- padding-right:25px;
-}
-.dijitTabRtl .dijitTabCloseButton {
- margin-left: 0px;
- margin-right: 1em;
-}
-.dj_ie .dijitTimePickerRtl .dijitTimePickerItem {
- width:100%;
-}
-.dijitColorPaletteRtl .dijitColorPaletteUnder {
-
- left: auto;
- right: 0;
-}
-.dijitSelectRtl .dijitButtonContents {
- text-align: right;
-}
-.tundra .dijitCalendarRtl .dijitCalendarDecrease {
- background-position: -30px top;
-}
-.tundra .dijitCalendarRtl .dijitCalendarIncrease {
- background-position: 0px top;
-}
- .dj_ie6 .tundra .dijitTimePickerRtl .dijitTimePickerMarkerHover,
-.dj_ie7 .tundra .dijitTimePickerRtl .dijitTimePickerMarkerHover {
- border-top: 0px;
-}
-.tundra .dijitDialogRtl .dijitDialogCloseIcon {
- right: auto;
- left: 5px;
-}
-.tundra .dijitEditorRtl .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.tundra .dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitEditorRtl .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.dijitEditorRtlDisabled .dijitEditorIcon {
- background-image: url(../../icons/images/editorIconsDisabled_rtl.png);
-}
-.dijitToolbarRtl .dijitToolbarSeparator {
- background-image: url(../../icons/images/editorIconsEnabled_rtl.png);
-}
-.tundra .dijitMenuItemRtl .dijitMenuExpand {
- background-position: -7px 0px;
-}
-.tundra .dijitTreeNodeRtl,
-.tundra .dijitTreeNodeRtl .dijitTreeExpandoLeaf {
-
- background-image: none;
-}
-.tundra .dijitTreeNodeRtl .dijitTreeExpandoOpened {
-
- background-image: url(images/treeExpand_minus_rtl.gif);
-}
-.tundra .dijitTreeNodeRtl .dijitTreeExpandoClosed {
- background-image: url(images/treeExpand_plus_rtl.gif);
-}
-.tundra .dijitTitlePaneRtl .dijitClosed .dijitArrowNode {
- background-position: -7px 0px;
-}
-.tundra .dijitTabRtl {
- -moz-box-orient:horizontal;
- text-align: right;
-}
-.tundra .dijitTabRtl .dijitTabInnerDiv {
- padding:2px 9px 2px 8px;
-}
-.tundra .tabStrip-disabled .tabStripButtonRtl .dijitTabInnerDiv {
-
- padding-bottom: 3px;
- padding-top: 1px;
-}
-.tundra .tabStripButtonRtl .dijitTabInnerDiv {
- padding: 3px 2px 4px 2px;
-}
-.tundra .dijitTabPaneWrapper {
- #zoom: 1;
-}
-.dj_ie-rtl .tundra .dijitTabContainerLeft-tabs {
- margin-left: 1px !important;
-}
-.dj_ie-rtl .tundra .dijitTabContainerRight-tabs {
- margin-right: 1px !important;
-}
-.tundra .dijitTabContainerLeft-tabs .dijitTabRtl,
-.tundra .dijitTabContainerRight-tabs .dijitTabRtl {
- margin-left:0px;
-}
-.dj_ie .tundra .dijitTabRtl .dijitTabInnerDiv {
-
- width : 0.1% !important;
-}
-.dj_iequirks-rtl .tundra .dijitTabContainerTopNone,
-.dj_iequirks-rtl .tundra .dijitTabContainerBottomNone {
-
- border-left: 1px solid #fff;
- border-right: 1px solid #fff;
-}
-.tundra .dijitSliderRtl .dijitSliderProgressBarH,
-.tundra .dijitSliderRtl .dijitSliderRemainingBarH,
-.tundra .dijitSliderRtl .dijitSliderLeftBumper,
-.tundra .dijitSliderRtl .dijitSliderRightBumper,
-.tundra .dijitSliderRtl .dijitSliderTopBumper {
- background-position: top right;
-}
-.tundra .dijitSliderRtl .dijitSliderProgressBarV,
-.tundra .dijitSliderRtl .dijitSliderRemainingBarV,
-.tundra .dijitSliderRtl .dijitSliderBottomBumper {
- background-position: bottom right;
-}
-.tundra .dijitSliderRtl .dijitSliderLeftBumper {
- border-left-width: 0px;
- border-right-width: 1px;
-}
-.tundra .dijitSliderRtl .dijitSliderRightBumper {
- border-left-width: 1px;
- border-right-width: 0px;
-}
-.tundra .dijitSliderRtl .dijitSliderIncrementIconH {
- background-position: -7px 0px;
-}
-.tundra .dijitSliderRtl .dijitSliderDecrementIconH {
- background-position: -14px 0px;
-}
+ NOTES:
+ ---
+ Dialog.css contains css classes for both Dialog and Tooltip!
+ This because currently a dijit.TooltipDialog exist. Until this is resolved
+ you need to include Dialog.css for both dijits
+ ---
+ Toolbar.css contains classes also used in Editor. Until this is resolved
+ you need to include Toolbar.css for both Toolbar and Editor
+ ---
+ Button.css contains classes for combobox,
+
+*/
+/* RTL files */
+@import url("../dijit_rtl.css");
+@import url("Calendar_rtl.css");
+@import url("TimePicker_rtl.css");
+@import url("Dialog_rtl.css");
+@import url("Editor_rtl.css");
+@import url("../../icons/editorIcons_rtl.css");/* RTL sprite for editor icons to be used by all themes*/
+@import url("Menu_rtl.css");
+@import url("Tree_rtl.css");
+@import url("TitlePane_rtl.css");
+@import url("layout/TabContainer_rtl.css");
+@import url("form/Slider_rtl.css");
diff --git a/lib/dijit/tree/ForestStoreModel.js b/lib/dijit/tree/ForestStoreModel.js
index aa51b0023..5e1b25efb 100644
--- a/lib/dijit/tree/ForestStoreModel.js
+++ b/lib/dijit/tree/ForestStoreModel.js
@@ -1,83 +1,280 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.tree.ForestStoreModel"]=true;
+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,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_1){
-this.root={store:this,root:true,id:_1.rootId,label:_1.rootLabel,children:_1.rootChildren};
-},mayHaveChildren:function(_2){
-return _2===this.root||this.inherited(arguments);
-},getChildren:function(_3,_4,_5){
-if(_3===this.root){
-if(this.root.children){
-_4(this.root.children);
-}else{
-this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_6){
-this.root.children=_6;
-_4(_6);
-}),onError:_5});
-}
-}else{
-this.inherited(arguments);
-}
-},isItem:function(_7){
-return (_7===this.root)?true:this.inherited(arguments);
-},fetchItemByIdentity:function(_8){
-if(_8.identity==this.root.id){
-var _9=_8.scope?_8.scope:dojo.global;
-if(_8.onItem){
-_8.onItem.call(_9,this.root);
-}
-}else{
-this.inherited(arguments);
-}
-},getIdentity:function(_a){
-return (_a===this.root)?this.root.id:this.inherited(arguments);
-},getLabel:function(_b){
-return (_b===this.root)?this.root.label:this.inherited(arguments);
-},newItem:function(_c,_d,_e){
-if(_d===this.root){
-this.onNewRootItem(_c);
-return this.store.newItem(_c);
-}else{
-return this.inherited(arguments);
-}
-},onNewRootItem:function(_f){
-},pasteItem:function(_10,_11,_12,_13,_14){
-if(_11===this.root){
-if(!_13){
-this.onLeaveRoot(_10);
-}
-}
-dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_10,_11===this.root?null:_11,_12===this.root?null:_12,_13,_14);
-if(_12===this.root){
-this.onAddToRoot(_10);
-}
-},onAddToRoot:function(_15){
-},onLeaveRoot:function(_16){
-},_requeryTop:function(){
-var _17=this.root.children||[];
-this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_18){
-this.root.children=_18;
-if(_17.length!=_18.length||dojo.some(_17,function(_19,idx){
-return _18[idx]!=_19;
-})){
-this.onChildrenChange(this.root,_18);
-}
-})});
-},onNewItem:function(_1a,_1b){
-this._requeryTop();
-this.inherited(arguments);
-},onDeleteItem:function(_1c){
-if(dojo.indexOf(this.root.children,_1c)!=-1){
-this._requeryTop();
-}
-this.inherited(arguments);
-}});
+
+
+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);
+ }
+
+});
+
}
diff --git a/lib/dijit/tree/TreeStoreModel.js b/lib/dijit/tree/TreeStoreModel.js
index c03bef526..5164176b7 100644
--- a/lib/dijit/tree/TreeStoreModel.js
+++ b/lib/dijit/tree/TreeStoreModel.js
@@ -1,145 +1,381 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.tree.TreeStoreModel"]=true;
+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,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(_1){
-dojo.mixin(this,_1);
-this.connects=[];
-var _2=this.store;
-if(!_2.getFeatures()["dojo.data.api.Identity"]){
-throw new Error("dijit.Tree: store must support dojo.data.Identity");
-}
-if(_2.getFeatures()["dojo.data.api.Notification"]){
-this.connects=this.connects.concat([dojo.connect(_2,"onNew",this,"onNewItem"),dojo.connect(_2,"onDelete",this,"onDeleteItem"),dojo.connect(_2,"onSet",this,"onSetItem")]);
-}
-},destroy:function(){
-dojo.forEach(this.connects,dojo.disconnect);
-},getRoot:function(_3,_4){
-if(this.root){
-_3(this.root);
-}else{
-this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_5){
-if(_5.length!=1){
-throw new Error(this.declaredClass+": query "+dojo.toJson(this.query)+" returned "+_5.length+" items, but must return exactly one item");
-}
-this.root=_5[0];
-_3(this.root);
-}),onError:_4});
-}
-},mayHaveChildren:function(_6){
-return dojo.some(this.childrenAttrs,function(_7){
-return this.store.hasAttribute(_6,_7);
-},this);
-},getChildren:function(_8,_9,_a){
-var _b=this.store;
-if(!_b.isItemLoaded(_8)){
-var _c=dojo.hitch(this,arguments.callee);
-_b.loadItem({item:_8,onItem:function(_d){
-_c(_d,_9,_a);
-},onError:_a});
-return;
-}
-var _e=[];
-for(var i=0;i<this.childrenAttrs.length;i++){
-var _f=_b.getValues(_8,this.childrenAttrs[i]);
-_e=_e.concat(_f);
-}
-var _10=0;
-if(!this.deferItemLoadingUntilExpand){
-dojo.forEach(_e,function(_11){
-if(!_b.isItemLoaded(_11)){
-_10++;
-}
-});
-}
-if(_10==0){
-_9(_e);
-}else{
-dojo.forEach(_e,function(_12,idx){
-if(!_b.isItemLoaded(_12)){
-_b.loadItem({item:_12,onItem:function(_13){
-_e[idx]=_13;
-if(--_10==0){
-_9(_e);
-}
-},onError:_a});
-}
-});
-}
-},isItem:function(_14){
-return this.store.isItem(_14);
-},fetchItemByIdentity:function(_15){
-this.store.fetchItemByIdentity(_15);
-},getIdentity:function(_16){
-return this.store.getIdentity(_16);
-},getLabel:function(_17){
-if(this.labelAttr){
-return this.store.getValue(_17,this.labelAttr);
-}else{
-return this.store.getLabel(_17);
-}
-},newItem:function(_18,_19,_1a){
-var _1b={parent:_19,attribute:this.childrenAttrs[0],insertIndex:_1a};
-if(this.newItemIdAttr&&_18[this.newItemIdAttr]){
-this.fetchItemByIdentity({identity:_18[this.newItemIdAttr],scope:this,onItem:function(_1c){
-if(_1c){
-this.pasteItem(_1c,null,_19,true,_1a);
-}else{
-this.store.newItem(_18,_1b);
-}
-}});
-}else{
-this.store.newItem(_18,_1b);
-}
-},pasteItem:function(_1d,_1e,_1f,_20,_21){
-var _22=this.store,_23=this.childrenAttrs[0];
-if(_1e){
-dojo.forEach(this.childrenAttrs,function(_24){
-if(_22.containsValue(_1e,_24,_1d)){
-if(!_20){
-var _25=dojo.filter(_22.getValues(_1e,_24),function(x){
-return x!=_1d;
-});
-_22.setValues(_1e,_24,_25);
-}
-_23=_24;
-}
-});
-}
-if(_1f){
-if(typeof _21=="number"){
-var _26=_22.getValues(_1f,_23).slice();
-_26.splice(_21,0,_1d);
-_22.setValues(_1f,_23,_26);
-}else{
-_22.setValues(_1f,_23,_22.getValues(_1f,_23).concat(_1d));
-}
-}
-},onChange:function(_27){
-},onChildrenChange:function(_28,_29){
-},onDelete:function(_2a,_2b){
-},onNewItem:function(_2c,_2d){
-if(!_2d){
-return;
-}
-this.getChildren(_2d.item,dojo.hitch(this,function(_2e){
-this.onChildrenChange(_2d.item,_2e);
-}));
-},onDeleteItem:function(_2f){
-this.onDelete(_2f);
-},onSetItem:function(_30,_31,_32,_33){
-if(dojo.indexOf(this.childrenAttrs,_31)!=-1){
-this.getChildren(_30,dojo.hitch(this,function(_34){
-this.onChildrenChange(_30,_34);
-}));
-}else{
-this.onChange(_30);
-}
-}});
+
+
+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);
+ }
+ }
+ });
+
}
diff --git a/lib/dijit/tree/_dndContainer.js b/lib/dijit/tree/_dndContainer.js
index e925283df..9ee8e32ba 100644
--- a/lib/dijit/tree/_dndContainer.js
+++ b/lib/dijit/tree/_dndContainer.js
@@ -1,49 +1,187 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.tree._dndContainer"]=true;
+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.declare("dijit.tree._dndContainer",null,{constructor:function(_1,_2){
-this.tree=_1;
-this.node=_1.domNode;
-dojo.mixin(this,_2);
-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(_3){
-var _4=this.selection[_3],_5={data:dijit.getEnclosingWidget(_4),type:["treeNode"]};
-return _5;
-},destroy:function(){
-dojo.forEach(this.events,dojo.disconnect);
-this.node=this.parent=null;
-},onMouseOver:function(_6,_7){
-this.current=_6.rowNode;
-this.currentWidget=_6;
-},onMouseOut:function(_8,_9){
-this.current=null;
-this.currentWidget=null;
-},_changeState:function(_a,_b){
-var _c="dojoDnd"+_a;
-var _d=_a.toLowerCase()+"State";
-dojo.removeClass(this.node,_c+this[_d]);
-dojo.addClass(this.node,_c+_b);
-this[_d]=_b;
-},_addItemClass:function(_e,_f){
-dojo.addClass(_e,"dojoDndItem"+_f);
-},_removeItemClass:function(_10,_11){
-dojo.removeClass(_10,"dojoDndItem"+_11);
-},onOverEvent:function(){
-this._changeState("Container","Over");
-},onOutEvent:function(){
-this._changeState("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", "");
+ }
+});
+
}
diff --git a/lib/dijit/tree/_dndSelector.js b/lib/dijit/tree/_dndSelector.js
index 3d7795598..5f9310e71 100644
--- a/lib/dijit/tree/_dndSelector.js
+++ b/lib/dijit/tree/_dndSelector.js
@@ -1,125 +1,287 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.tree._dndSelector"]=true;
+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,{constructor:function(_1,_2){
-this.selection={};
-this.anchor=null;
-this.simpleSelection=false;
-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,getSelectedNodes:function(){
-return this.selection;
-},selectNone:function(){
-return this._removeSelection()._removeAnchor();
-},destroy:function(){
-this.inherited(arguments);
-this.selection=this.anchor=null;
-},onMouseDown:function(e){
-if(!this.current){
-return;
-}
-if(e.button==dojo.mouseButtons.RIGHT){
-return;
-}
-var _3=dijit.getEnclosingWidget(this.current),id=_3.id+"-dnd";
-if(!dojo.hasAttr(this.current,"id")){
-dojo.attr(this.current,"id",id);
-}
-if(!this.singular&&!dojo.isCopyKey(e)&&!e.shiftKey&&(this.current.id in this.selection)){
-this.simpleSelection=true;
-dojo.stopEvent(e);
-return;
-}
-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]=this.current;
-}
-}else{
-if(!this.singular&&e.shiftKey){
-if(dojo.isCopyKey(e)){
-}else{
-}
-}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]=this.current;
-}
-}
-}else{
-if(!(id in this.selection)){
-this.selectNone();
-this.anchor=this.current;
-this._addItemClass(this.current,"Anchor");
-this.selection[id]=this.current;
-}
-}
-}
-}
-dojo.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]=this.current;
-}
-},onMouseMove:function(e){
-this.simpleSelection=false;
-},_removeSelection:function(){
-var e=dojo.dnd._empty;
-for(var i in this.selection){
-if(i in e){
-continue;
-}
-var _4=dojo.byId(i);
-if(_4){
-this._removeItemClass(_4,"Selected");
-}
-}
-this.selection={};
-return this;
-},_removeAnchor:function(){
-if(this.anchor){
-this._removeItemClass(this.anchor,"Anchor");
-this.anchor=null;
-}
-return this;
-},forInSelectedItems:function(f,o){
-o=o||dojo.global;
-for(var id in this.selection){
-f.call(o,this.getItem(id),id,this);
-}
-}});
+
+
+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);
+ }
+ }
+});
+
}
diff --git a/lib/dijit/tree/dndSource.js b/lib/dijit/tree/dndSource.js
index ef129d9cb..4fc4660cc 100644
--- a/lib/dijit/tree/dndSource.js
+++ b/lib/dijit/tree/dndSource.js
@@ -1,240 +1,544 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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"]){
-dojo._hasResource["dijit.tree.dndSource"]=true;
+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");
-dojo.declare("dijit.tree.dndSource",dijit.tree._dndSelector,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(_1,_2){
-if(!_2){
-_2={};
-}
-dojo.mixin(this,_2);
-this.isSource=typeof _2.isSource=="undefined"?true:_2.isSource;
-var _3=_2.accept instanceof Array?_2.accept:["text","treeNode"];
-this.accept=null;
-if(_3.length){
-this.accept={};
-for(var i=0;i<_3.length;++i){
-this.accept[_3[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(_4,_5){
-return true;
-},copyState:function(_6){
-return this.copyOnly||_6;
-},destroy:function(){
-this.inherited("destroy",arguments);
-dojo.forEach(this.topics,dojo.unsubscribe);
-this.targetAnchor=null;
-},_onDragMouse:function(e){
-var m=dojo.dnd.manager(),_7=this.targetAnchor,_8=this.current,_9=this.currentWidget,_a=this.dropPosition;
-var _b="Over";
-if(_8&&this.betweenThreshold>0){
-if(!this.targetBox||_7!=_8){
-this.targetBox=dojo.position(_8,true);
-}
-if((e.pageY-this.targetBox.y)<=this.betweenThreshold){
-_b="Before";
-}else{
-if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){
-_b="After";
-}
-}
-}
-if(_8!=_7||_b!=_a){
-if(_7){
-this._removeItemClass(_7,_a);
-}
-if(_8){
-this._addItemClass(_8,_b);
-}
-if(!_8){
-m.canDrop(false);
-}else{
-if(_9==this.tree.rootNode&&_b!="Over"){
-m.canDrop(false);
-}else{
-if(m.source==this&&(_8.id in this.selection)){
-m.canDrop(false);
-}else{
-if(this.checkItemAcceptance(_8,m.source,_b.toLowerCase())&&!this._isParentChildDrop(m.source,_8)){
-m.canDrop(true);
-}else{
-m.canDrop(false);
-}
-}
-}
-}
-this.targetAnchor=_8;
-this.dropPosition=_b;
-}
-},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 n=this.getSelectedNodes();
-var _c=[];
-for(var i in n){
-_c.push(n[i]);
-}
-if(_c.length){
-m.startDrag(this,_c,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("onMouseDown",arguments);
-},onMouseUp:function(e){
-if(this.mouseDown){
-this.mouseDown=false;
-this.inherited("onMouseUp",arguments);
-}
-},onMouseOut:function(){
-this.inherited(arguments);
-this._unmarkTargetAnchor();
-},checkItemAcceptance:function(_d,_e,_f){
-return true;
-},onDndSourceOver:function(_10){
-if(this!=_10){
-this.mouseDown=false;
-this._unmarkTargetAnchor();
-}else{
-if(this.isDragging){
-var m=dojo.dnd.manager();
-m.canDrop(false);
-}
-}
-},onDndStart:function(_11,_12,_13){
-if(this.isSource){
-this._changeState("Source",this==_11?(_13?"Copied":"Moved"):"");
-}
-var _14=this.checkAcceptance(_11,_12);
-this._changeState("Target",_14?"":"Disabled");
-if(this==_11){
-dojo.dnd.manager().overSource(this);
-}
-this.isDragging=true;
-},itemCreator:function(_15,_16,_17){
-return dojo.map(_15,function(_18){
-return {"id":_18.id,"name":_18.textContent||_18.innerText||""};
+
+
+/*=====
+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");
+ }
});
-},onDndDrop:function(_19,_1a,_1b){
-if(this.containerState=="Over"){
-var _1c=this.tree,_1d=_1c.model,_1e=this.targetAnchor,_1f=false;
-this.isDragging=false;
-var _20=dijit.getEnclosingWidget(_1e);
-var _21;
-var _22;
-_21=(_20&&_20.item)||_1c.item;
-if(this.dropPosition=="Before"||this.dropPosition=="After"){
-_21=(_20.getParent()&&_20.getParent().item)||_1c.item;
-_22=_20.getIndexInParent();
-if(this.dropPosition=="After"){
-_22=_20.getIndexInParent()+1;
-}
-}else{
-_21=(_20&&_20.item)||_1c.item;
-}
-var _23;
-dojo.forEach(_1a,function(_24,idx){
-var _25=_19.getItem(_24.id);
-if(dojo.indexOf(_25.type,"treeNode")!=-1){
-var _26=_25.data,_27=_26.item,_28=_26.getParent().item;
-}
-if(_19==this){
-if(typeof _22=="number"){
-if(_21==_28&&_26.getIndexInParent()<_22){
-_22-=1;
-}
-}
-_1d.pasteItem(_27,_28,_21,_1b,_22);
-}else{
-if(_1d.isItem(_27)){
-_1d.pasteItem(_27,_28,_21,_1b,_22);
-}else{
-if(!_23){
-_23=this.itemCreator(_1a,_1e,_19);
-}
-_1d.newItem(_23[idx],_21,_22);
-}
-}
-},this);
-this.tree._expandNode(_20);
-}
-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(_29,_2a){
-if(!_29.tree||_29.tree!=this.tree){
-return false;
-}
-var _2b=_29.tree.domNode;
-var ids={};
-for(var x in _29.selection){
-ids[_29.selection[x].parentNode.id]=true;
-}
-var _2c=_2a.parentNode;
-while(_2c!=_2b&&(!_2c.id||!ids[_2c.id])){
-_2c=_2c.parentNode;
-}
-return _2c.id&&ids[_2c.id];
-},_unmarkTargetAnchor:function(){
-if(!this.targetAnchor){
-return;
-}
-this._removeItemClass(this.targetAnchor,this.dropPosition);
-this.targetAnchor=null;
-this.targetBox=null;
-this.dropPosition=null;
-},_markDndStatus:function(_2d){
-this._changeState("Source",_2d?"Copied":"Moved");
-}});
+
}
diff --git a/lib/dijit/tree/model.js b/lib/dijit/tree/model.js
index 091d72fca..46b27c676 100644
--- a/lib/dijit/tree/model.js
+++ b/lib/dijit/tree/model.js
@@ -1,20 +1,135 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The 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,{destroy:function(){
-},getRoot:function(_1){
-},mayHaveChildren:function(_2){
-},getChildren:function(_3,_4){
-},isItem:function(_5){
-},fetchItemByIdentity:function(_6){
-},getIdentity:function(_7){
-},getLabel:function(_8){
-},newItem:function(_9,_a,_b){
-},pasteItem:function(_c,_d,_e,_f){
-},onChange:function(_10){
-},onChildrenChange:function(_11,_12){
-}});
+
+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
+ }
+});
+
diff --git a/lib/dojo-src/rebuild-dojo.sh b/lib/dojo-src/rebuild-dojo.sh
index 708627537..8ed5baba2 100755
--- a/lib/dojo-src/rebuild-dojo.sh
+++ b/lib/dojo-src/rebuild-dojo.sh
@@ -9,12 +9,13 @@
if [ -d util/buildscripts/ ]; then
pushd util/buildscripts
- ./build.sh profileFile=../../profile.js action=clean,release version=1.5.0 releaseName=
+ ./build.sh profileFile=../../profile.js action=clean,release version=1.6.1 releaseName=
popd
if [ -d release/dojo ]; then
- rm -rf ../dojo
+ rm -rf ../dojo ../dijit
cp -r release/dojo ..
+ cp -r release/dijit ..
else
echo $0: ERROR: Dojo build seems to have failed.
fi
diff --git a/lib/dojo/AdapterRegistry.js b/lib/dojo/AdapterRegistry.js
index bb6a60f41..1d688a3b1 100644
--- a/lib/dojo/AdapterRegistry.js
+++ b/lib/dojo/AdapterRegistry.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by b
dojo._hasResource["dojo.AdapterRegistry"] = true;
dojo.provide("dojo.AdapterRegistry");
+
dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
// summary:
// A registry to make contextual calling/searching easier.
@@ -40,11 +41,11 @@ dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
this.pairs = [];
this.returnWrappers = returnWrappers || false; // Boolean
-}
+};
dojo.extend(dojo.AdapterRegistry, {
register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
- // summary:
+ // summary:
// register a check function to determine if the wrap function or
// object gets selected
// name:
diff --git a/lib/dojo/DeferredList.js b/lib/dojo/DeferredList.js
index a8156aba2..afe6638a1 100644
--- a/lib/dojo/DeferredList.js
+++ b/lib/dojo/DeferredList.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,6 +8,8 @@
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.
@@ -65,7 +67,7 @@ dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*B
dojo.DeferredList.prototype = new dojo.Deferred();
dojo.DeferredList.prototype.gatherResults= function(deferredList){
- // summary:
+ // summary:
// Gathers the results of the deferreds for packaging
// as the parameters to the Deferred Lists' callback
diff --git a/lib/dojo/LICENSE b/lib/dojo/LICENSE
index 4c93ded6b..aa6b39f8c 100644
--- a/lib/dojo/LICENSE
+++ b/lib/dojo/LICENSE
@@ -13,7 +13,7 @@ The text of the AFL and BSD licenses is reproduced below.
The "New" BSD License:
**********************
-Copyright (c) 2005-2010, The Dojo Foundation
+Copyright (c) 2005-2011, The Dojo Foundation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/lib/dojo/NodeList-data.js b/lib/dojo/NodeList-data.js
new file mode 100644
index 000000000..0126448d2
--- /dev/null
+++ b/lib/dojo/NodeList-data.js
@@ -0,0 +1,175 @@
+/*
+ Copyright (c) 2004-2011, The 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.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);
+
+}
diff --git a/lib/dojo/NodeList-fx.js b/lib/dojo/NodeList-fx.js
index de2cc3255..b9ec76647 100644
--- a/lib/dojo/NodeList-fx.js
+++ b/lib/dojo/NodeList-fx.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,6 +10,7 @@ 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()
@@ -25,7 +26,7 @@ dojo.extend(dojo.NodeList, {
dojo.mixin(tmpArgs, args);
return obj[method](tmpArgs);
})
- );
+ );
return args.auto ? a.play() && this : a; // dojo.Animation|dojo.NodeList
},
@@ -34,7 +35,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -58,7 +59,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -77,7 +78,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -100,7 +101,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -119,7 +120,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -155,14 +156,14 @@ dojo.extend(dojo.NodeList, {
// example:
// | dojo.query(".zork").animateProperty({
// | duration: 500,
- // | properties: {
+ // | properties: {
// | color: { start: "black", end: "white" },
- // | left: { end: 300 }
- // | }
+ // | left: { end: 300 }
+ // | }
// | }).play();
//
// example:
- // | dojo.query(".grue").animateProperty({
+ // | dojo.query(".grue").animateProperty({
// | auto:true,
// | properties: {
// | height:240
@@ -171,9 +172,9 @@ dojo.extend(dojo.NodeList, {
return this._anim(dojo, "animateProperty", args); // dojo.Animation|dojo.NodeList
},
- anim: function( /*Object*/ properties,
- /*Integer?*/ duration,
- /*Function?*/ easing,
+ anim: function( /*Object*/ properties,
+ /*Integer?*/ duration,
+ /*Function?*/ easing,
/*Function?*/ onEnd,
/*Integer?*/ delay){
// summary:
@@ -181,8 +182,8 @@ dojo.extend(dojo.NodeList, {
// 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.
+ // 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?
@@ -207,7 +208,7 @@ dojo.extend(dojo.NodeList, {
easing: easing
});
})
- );
+ );
if(onEnd){
dojo.connect(canim, "onEnd", onEnd);
}
diff --git a/lib/dojo/NodeList-html.js b/lib/dojo/NodeList-html.js
index e8e0ac220..bc8da9d86 100644
--- a/lib/dojo/NodeList-html.js
+++ b/lib/dojo/NodeList-html.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,6 +10,7 @@ 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
@@ -21,15 +22,15 @@ dojo.extend(dojo.NodeList, {
// 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
+ // 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,
+ // | {
+ // | parseContent: true,
// | onBegin: function(){
// | this.content = this.content.replace(/([0-9])/g, this.id + ": $1");
// | this.inherited("onBegin", arguments);
@@ -38,7 +39,7 @@ dojo.extend(dojo.NodeList, {
var dhs = new dojo.html._ContentSetter(params || {});
this.forEach(function(elm){
- dhs.node = elm;
+ dhs.node = elm;
dhs.set(content);
dhs.tearDown();
});
diff --git a/lib/dojo/NodeList-manipulate.js b/lib/dojo/NodeList-manipulate.js
index 171540faf..8a4603843 100644
--- a/lib/dojo/NodeList-manipulate.js
+++ b/lib/dojo/NodeList-manipulate.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo.NodeList-manipulate"]){ //_hasResource checks added
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
@@ -51,7 +52,7 @@ dojo["NodeList-manipulate"] = {
}
function makeWrapNode(/*DOMNode||String*/html, /*DOMNode*/refNode){
- // summary:
+ // summary:
// convert HTML into nodes if it is not already a node.
if(typeof html == "string"){
html = dojo._toDom(html, (refNode && refNode.ownerDocument));
@@ -655,25 +656,25 @@ dojo["NodeList-manipulate"] = {
// example:
// assume a DOM created by this markup:
// | <div class="container">
- // | <div class="spacer">___</div>
+ // | <div class="spacer">___</div>
// | <div class="red">Red One</div>
- // | <div class="spacer">___</div>
+ // | <div class="spacer">___</div>
// | <div class="blue">Blue One</div>
- // | <div class="spacer">___</div>
+ // | <div class="spacer">___</div>
// | <div class="red">Red Two</div>
- // | <div class="spacer">___</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="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="spacer">___</div>
+ // | <div class="spacer">___</div>
// | <div class="red">Red One</div>
// | <div class="red">Red Two</div>
// | </div>
diff --git a/lib/dojo/NodeList-traverse.js b/lib/dojo/NodeList-traverse.js
index b5314eed6..b6167ad0e 100644
--- a/lib/dojo/NodeList-traverse.js
+++ b/lib/dojo/NodeList-traverse.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo.NodeList-traverse"]){ //_hasResource checks added by
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
@@ -28,18 +29,7 @@ dojo.extend(dojo.NodeList, {
ary = ary.concat(items);
}
}
- return ary;
- },
-
- _filterQueryResult: function(nodeList, query){
- // summmary:
- // Replacement for dojo._filterQueryResult that does a full
- // query. Slower, but allows for more types of queries.
- var filter = dojo.filter(nodeList, function(node){
- return dojo.query(query, node.parentNode).indexOf(node) != -1;
- });
- var result = this._wrap(filter);
- return result;
+ return ary;
},
_getUniqueAsNodeList: function(nodes){
@@ -65,7 +55,7 @@ dojo.extend(dojo.NodeList, {
// 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 ? this._filterQueryResult(ary, query) : ary);
+ ary = (query ? dojo._filterQueryResult(ary, query) : ary);
return ary._stash(this); //dojo.NodeList
},
@@ -73,7 +63,7 @@ dojo.extend(dojo.NodeList, {
// 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),
+ // 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
},
@@ -109,7 +99,7 @@ dojo.extend(dojo.NodeList, {
}); //dojo.NodeList
},
- closest: function(/*String*/query){
+ 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.
@@ -118,6 +108,8 @@ dojo.extend(dojo.NodeList, {
// 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.
@@ -133,13 +125,12 @@ dojo.extend(dojo.NodeList, {
// Running this code:
// | dojo.query(".red").closest(".container");
// returns the div with class "container".
- var self = this;
- return this._getRelatedUniqueNodes(query, function(node, ary){
+ return this._getRelatedUniqueNodes(null, function(node, ary){
do{
- if(self._filterQueryResult([node], query).length){
+ if(dojo._filterQueryResult([node], query, root).length){
return node;
}
- }while((node = node.parentNode) && node.nodeType == 1);
+ }while(node != root && (node = node.parentNode) && node.nodeType == 1);
return null; //To make rhino strict checking happy.
}); //dojo.NodeList
},
@@ -461,7 +452,7 @@ dojo.extend(dojo.NodeList, {
// | </div>
// Running this code:
// | dojo.query(".blue").last();
- // returns the last div with class "blue",
+ // returns the last div with class "blue",
return this._wrap((this.length ? [this[this.length - 1]] : []), this); //dojo.NodeList
},
diff --git a/lib/dojo/OpenAjax.js b/lib/dojo/OpenAjax.js
index c777f3ea8..f99af1a13 100644
--- a/lib/dojo/OpenAjax.js
+++ b/lib/dojo/OpenAjax.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,18 +9,18 @@
* OpenAjax.js
*
* Reference implementation of the OpenAjax Hub, as specified by OpenAjax Alliance.
- * Specification is under development at:
+ * Specification is under development at:
*
* http://www.openajax.org/member/wiki/OpenAjax_Hub_Specification
*
* Copyright 2006-2007 OpenAjax Alliance
*
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at http://www.apache.org/licenses/LICENSE-2.0 . Unless
- * required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- * CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0 . Unless
+ * required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ * CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
******************************************************************************/
@@ -51,7 +51,7 @@ if(!window["OpenAjax"]){
prefix: prefix,
namespaceURI: nsURL,
version: version,
- extraData: extra
+ extraData: extra
};
this.publish(ooh+"registerLibrary", libs[prefix]);
}
@@ -82,7 +82,7 @@ if(!window["OpenAjax"]){
this._publish(this._subscriptions, path, 0, name, message);
this._pubDepth--;
if((this._cleanup.length > 0) && (this._pubDepth == 0)){
- for(var i = 0; i < this._cleanup.length; i++){
+ for(var i = 0; i < this._cleanup.length; i++){
this.unsubscribe(this._cleanup[i].hdl);
}
delete(this._cleanup);
@@ -100,12 +100,12 @@ if(!window["OpenAjax"]){
var token = path[index];
if(index == path.length){
tree.s.push(sub);
- }else{
+ }else{
if(typeof tree.c == "undefined"){
tree.c = {};
}
if(typeof tree.c[token] == "undefined"){
- tree.c[token] = { c: {}, s: [] };
+ tree.c[token] = { c: {}, s: [] };
this._subscribe(tree.c[token], path, index + 1, sub);
}else{
this._subscribe( tree.c[token], path, index + 1, sub);
@@ -120,7 +120,7 @@ if(!window["OpenAjax"]){
node = tree;
}else{
this._publish(tree.c[path[index]], path, index + 1, name, msg);
- this._publish(tree.c["*"], path, index + 1, name, msg);
+ this._publish(tree.c["*"], path, index + 1, name, msg);
node = tree.c["**"];
}
if(typeof node != "undefined"){
@@ -140,7 +140,7 @@ if(!window["OpenAjax"]){
// get a function object
fcb = sc[fcb];
}
- if((!fcb) ||
+ if((!fcb) ||
(fcb.call(sc, name, msg, d))) {
cb.call(sc, name, msg, d);
}
@@ -156,24 +156,24 @@ if(!window["OpenAjax"]){
var childNode = tree.c[path[index]];
this._unsubscribe(childNode, path, index + 1, sid);
if(childNode.s.length == 0) {
- for(var x in childNode.c)
- return;
- delete tree.c[path[index]];
+ for(var x in childNode.c)
+ return;
+ delete tree.c[path[index]];
}
return;
}
else {
var callbacks = tree.s;
var max = callbacks.length;
- for(var i = 0; i < max; i++)
+ for(var i = 0; i < max; i++)
if(sid == callbacks[i].sid) {
if(this._pubDepth > 0) {
- callbacks[i].cb = null;
- this._cleanup.push(callbacks[i]);
+ callbacks[i].cb = null;
+ this._cleanup.push(callbacks[i]);
}
else
callbacks.splice(i, 1);
- return;
+ return;
}
}
}
diff --git a/lib/dojo/Stateful.js b/lib/dojo/Stateful.js
index e4f406309..147001962 100644
--- a/lib/dojo/Stateful.js
+++ b/lib/dojo/Stateful.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo.Stateful"]){ //_hasResource checks added by build. D
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
@@ -33,7 +34,7 @@ dojo.declare("dojo.Stateful", null, {
// 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.
+ // this just retrieves the object's property.
// For example:
// | stateful = new dojo.Stateful({foo: 3});
// | stateful.get("foo") // returns 3
@@ -45,11 +46,11 @@ dojo.declare("dojo.Stateful", null, {
// summary:
// Set a property on a Stateful instance
// name:
- // The property to set.
+ // 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
+ // 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();
@@ -66,7 +67,7 @@ dojo.declare("dojo.Stateful", null, {
// 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]);
+ this.set(x, name[x]);
}
return this;
}
@@ -81,17 +82,17 @@ dojo.declare("dojo.Stateful", null, {
// summary:
// Watches a property for changes
// name:
- // Indicates the property to watch. This is optional (the callback may be the
+ // 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
+ // 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
+ // 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;
@@ -99,15 +100,18 @@ dojo.declare("dojo.Stateful", null, {
var self = this;
callbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){
var notify = function(propertyCallbacks){
- for(var i = 0, l = propertyCallbacks && propertyCallbacks.length; i < l; i++){
- try{
- propertyCallbacks[i].call(self, name, oldValue, value);
- }catch(e){
- console.error(e);
+ 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]);
+ notify(callbacks['_' + name]);
if(!ignoreCatchall){
notify(callbacks["*"]); // the catch-all
}
@@ -116,6 +120,9 @@ dojo.declare("dojo.Stateful", null, {
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"){
diff --git a/lib/dojo/_base.js b/lib/dojo/_base.js
index c77266788..78fc6064a 100644
--- a/lib/dojo/_base.js
+++ b/lib/dojo/_base.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -15,6 +15,8 @@ dojo.require("dojo._base.connect");
dojo.require("dojo._base.Deferred");
dojo.require("dojo._base.json");
dojo.require("dojo._base.Color");
-dojo.requireIf(dojo.isBrowser, "dojo._base.browser");
+dojo.require("dojo._base.browser");
+
+
}
diff --git a/lib/dojo/_base/Color.js b/lib/dojo/_base/Color.js
index 5f5c5af9b..4707fa582 100644
--- a/lib/dojo/_base/Color.js
+++ b/lib/dojo/_base/Color.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -11,6 +11,7 @@ dojo.provide("dojo._base.Color");
dojo.require("dojo._base.array");
dojo.require("dojo._base.lang");
+
(function(){
var d = dojo;
@@ -199,7 +200,7 @@ dojo.require("dojo._base.lang");
// 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
+ // | 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();
diff --git a/lib/dojo/_base/Deferred.js b/lib/dojo/_base/Deferred.js
index 3193024ab..c5992c966 100644
--- a/lib/dojo/_base/Deferred.js
+++ b/lib/dojo/_base/Deferred.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,42 +10,43 @@ dojo._hasResource["dojo._base.Deferred"] = true;
dojo.provide("dojo._base.Deferred");
dojo.require("dojo._base.lang");
+
(function(){
- var mutator = 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.
+ // 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
+ // 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
+ //
+ // 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
+ //
+ // 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:
@@ -55,7 +56,7 @@ dojo.require("dojo._base.lang");
// * callback(result)
// * errback(result)
//
- // Callbacks are allowed to return promisesthemselves, so
+ // 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
@@ -115,7 +116,7 @@ dojo.require("dojo._base.lang");
// | renderDataitem(data[x]);
// | }
// | d.callback(true);
- // | }catch(e){
+ // | }catch(e){
// | d.errback(new Error("rendering failed"));
// | }
// | return d;
@@ -129,7 +130,7 @@ dojo.require("dojo._base.lang");
// | // 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 syncrhonous and so both
+ // 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:
//
@@ -142,7 +143,7 @@ dojo.require("dojo._base.lang");
// | renderDataitem(data[x]);
// | }
// | d.callback(true);
- // | }catch(e){
+ // | }catch(e){
// | d.errback(new Error("rendering failed"));
// | }
// | }, 100);
@@ -157,11 +158,11 @@ dojo.require("dojo._base.lang");
// 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 = {};
+ var promise = (this.promise = {});
function complete(value){
if(finished){
- throw new Error("This deferred has already been resolved");
+ throw new Error("This deferred has already been resolved");
}
result = value;
finished = true;
@@ -172,7 +173,7 @@ dojo.require("dojo._base.lang");
while(!mutated && nextListener){
var listener = nextListener;
nextListener = nextListener.next;
- if(mutated = (listener.progress == mutator)){ // assignment and check
+ if((mutated = (listener.progress == mutator))){ // assignment and check
finished = false;
}
var func = (isError ? listener.error : listener.resolved);
@@ -184,6 +185,9 @@ dojo.require("dojo._base.lang");
continue;
}
var unchanged = mutated && newResult === undefined;
+ if(mutated && !unchanged){
+ isError = newResult instanceof Error;
+ }
listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
}
catch (e) {
@@ -196,7 +200,7 @@ dojo.require("dojo._base.lang");
listener.deferred.resolve(result);
}
}
- }
+ }
}
// calling resolve will resolve the promise
this.resolve = this.callback = function(value){
@@ -211,7 +215,7 @@ dojo.require("dojo._base.lang");
// 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
+ // Fulfills the Deferred instance as an error with the provided error
isError = true;
this.fired = 1;
complete(error);
@@ -228,7 +232,7 @@ dojo.require("dojo._base.lang");
while(listener){
var progress = listener.progress;
progress && progress(update);
- listener = listener.next;
+ listener = listener.next;
}
};
this.addCallbacks = function(/*Function?*/callback, /*Function?*/errback){
@@ -237,35 +241,35 @@ dojo.require("dojo._base.lang");
};
// 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
+ // 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
+ //
+ // 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
- //
+ // | >44
+ //
var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
var listener = {
- resolved: resolvedCallback,
- error: errorCallback,
- progress: progressCallback,
+ resolved: resolvedCallback,
+ error: errorCallback,
+ progress: progressCallback,
deferred: returnDeferred
- };
+ };
if(nextListener){
head = head.next = listener;
}
@@ -291,7 +295,7 @@ dojo.require("dojo._base.lang");
deferred.reject(error);
}
}
- }
+ };
freeze(promise);
};
dojo.extend(dojo.Deferred, {
@@ -312,7 +316,7 @@ dojo.require("dojo._base.lang");
})();
dojo.when = function(promiseOrValue, /*Function?*/callback, /*Function?*/errback, /*Function?*/progressHandler){
// summary:
- // This provides normalization between normal synchronous values and
+ // This provides normalization between normal synchronous values and
// asynchronous promises, so you can interact with them in a common way
// example:
// | function printFirstAndList(items){
diff --git a/lib/dojo/_base/NodeList.js b/lib/dojo/_base/NodeList.js
index 12b631a4b..8cdc1c0f7 100644
--- a/lib/dojo/_base/NodeList.js
+++ b/lib/dojo/_base/NodeList.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,6 +10,9 @@ 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(){
@@ -248,7 +251,7 @@ dojo.require("dojo._base.array");
});
// add forEach actions
- d.forEach(["connect", "addClass", "removeClass", "toggleClass", "empty", "removeAttr"], function(name){
+ d.forEach(["connect", "addClass", "removeClass", "replaceClass", "toggleClass", "empty", "removeAttr"], function(name){
nlp[name] = adaptAsForEach(d[name]);
});
@@ -306,7 +309,7 @@ dojo.require("dojo._base.array");
_cloneNode: function(/*DOMNode*/ node){
// summary:
- // private utiltity to clone a node. Not very interesting in the vanilla
+ // 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);
@@ -400,7 +403,7 @@ dojo.require("dojo._base.array");
if(this._parent){
return this._parent;
}else{
- //Just return empy list.
+ //Just return empty list.
return new this._NodeListCtor();
}
},
@@ -468,12 +471,12 @@ dojo.require("dojo._base.array");
indexOf: function(value, fromIndex){
// summary:
- // see dojo.indexOf(). The primary difference is that the acted-on
+ // 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 loction to start searching from. Optional. Defaults to 0.
+ // The location to start searching from. Optional. Defaults to 0.
// description:
// For more details on the behavior of indexOf, see Mozilla's
// (indexOf
@@ -494,7 +497,7 @@ dojo.require("dojo._base.array");
// value: Object
// The value to search for.
// fromIndex: Integer?
- // The loction to start searching from. Optional. Defaults to 0.
+ // 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
@@ -572,12 +575,12 @@ dojo.require("dojo._base.array");
forEach: function(callback, thisObj){
// summary:
- // see `dojo.forEach()`. The primary difference is that the acted-on
+ // 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
+ return this; // dojo.NodeList
},
/*=====
@@ -594,7 +597,7 @@ dojo.require("dojo._base.array");
// 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.
+ // assumes the node passed is each node in this list.
return d.map(this, d.position); // Array
},
@@ -617,7 +620,7 @@ dojo.require("dojo._base.array");
// Disable a group of buttons:
// | dojo.query("button.group").attr("disabled", true);
// example:
- // innerHTML can be assigned or retreived as well:
+ // 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
@@ -682,7 +685,7 @@ dojo.require("dojo._base.array");
// 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
+ // (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
@@ -728,7 +731,7 @@ dojo.require("dojo._base.array");
// 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
+ // In the selector case, only the first matching element will be used
// for relative positioning.
// position:
// can be one of:
@@ -743,18 +746,15 @@ dojo.require("dojo._base.array");
return this.forEach(function(node){ d.place(node, item, position); }); // dojo.NodeList
},
- orphan: function(/*String?*/ simpleFilter){
+ orphan: function(/*String?*/ filter){
// summary:
- // removes elements in this list that match the simple filter
+ // removes elements in this list that match the filter
// from their parents and returns them as a new NodeList.
- // simpleFilter:
- // 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.
+ // filter:
+ // CSS selector like ".foo" or "div > span"
// returns:
- // `dojo.NodeList` containing the orpahned elements
- return (simpleFilter ? d._filterQueryResult(this, simpleFilter) : this).forEach(orphan); // dojo.NodeList
+ // `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){
@@ -781,7 +781,7 @@ dojo.require("dojo._base.array");
// FIXME: do we need this?
query: function(/*String*/ queryStr){
// summary:
- // Returns a new list whose memebers match the passed query,
+ // Returns a new list whose members match the passed query,
// assuming elements of the current NodeList as the root for
// each search.
// example:
@@ -792,9 +792,9 @@ dojo.require("dojo._base.array");
// | </p>
// | </div>
// | <div id="bar">
- // | <p>great commedians may not be funny <span>in person</span></p>
+ // | <p>great comedians may not be funny <span>in person</span></p>
// | </div>
- // If we are presented with the following defintion for a NodeList:
+ // 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:
@@ -809,18 +809,14 @@ dojo.require("dojo._base.array");
return this._wrap(apc.apply([], ret), this); // dojo.NodeList
},
- filter: function(/*String|Function*/ simpleFilter){
+ 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.
- // simpleFilter:
- // If a string, a 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.
+ // 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){
@@ -832,7 +828,7 @@ dojo.require("dojo._base.array");
// | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
var a = arguments, items = this, start = 0;
- if(typeof simpleFilter == "string"){ // inline'd type check
+ 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
@@ -880,10 +876,10 @@ dojo.require("dojo._base.array");
// | "before"
// | "after"
// | "replace" (replaces nodes in this NodeList with new content)
- // | "only" (removes other children of the nodes so new content is hte only child)
+ // | "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 ommitted
+ // 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
@@ -914,7 +910,7 @@ dojo.require("dojo._base.array");
// text: "Send"
// });
content = this._normalize(content, this[0]);
- for(var i = 0, node; node = this[i]; i++){
+ for(var i = 0, node; (node = this[i]); i++){
this._place(content, node, position, i > 0);
}
return this; //dojo.NodeList
@@ -943,11 +939,11 @@ dojo.require("dojo._base.array");
// 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.
+ // list and go backwards.
//
// example:
// Shorten the list to the first, second, and third elements
- // | dojo.query("a").at(0, 1, 2).forEach(fn);
+ // | dojo.query("a").at(0, 1, 2).forEach(fn);
//
// example:
// Retrieve the first and last elements of a unordered list:
@@ -957,13 +953,13 @@ dojo.require("dojo._base.array");
// 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.
- // | })
+ // | console.log(n); // all anchors on the page.
+ // | })
//
// returns:
// dojo.NodeList
var t = new this._NodeListCtor();
- d.forEach(arguments, function(i){
+ d.forEach(arguments, function(i){
if(i < 0){ i = this.length + i }
if(this[i]){ t.push(this[i]); }
}, this);
@@ -973,7 +969,8 @@ dojo.require("dojo._base.array");
});
nl.events = [
- // summary: list of all DOM events used in NodeList
+ // 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"
@@ -986,7 +983,7 @@ dojo.require("dojo._base.array");
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) :
diff --git a/lib/dojo/_base/_loader/bootstrap.js b/lib/dojo/_base/_loader/bootstrap.js
index 3ef3012a2..a1f99276a 100644
--- a/lib/dojo/_base/_loader/bootstrap.js
+++ b/lib/dojo/_base/_loader/bootstrap.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -76,7 +76,7 @@ djConfig = {
// of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
// modules may be configured via `djConfig.modulePaths`.
modulePaths: {},
- // afterOnLoad: Boolean
+ // 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
@@ -103,7 +103,7 @@ djConfig = {
// 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
+ // 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.
@@ -149,7 +149,7 @@ djConfig = {
"groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
"trace", "warn", "log"
];
- var i=0, tn;
+ var i = 0, tn;
while((tn=cn[i++])){
if(!console[tn]){
(function(){
@@ -209,9 +209,13 @@ dojo.global = {
debugAtAllCosts: false
};
- if(typeof djConfig != "undefined"){
- for(var opt in djConfig){
- d.config[opt] = djConfig[opt];
+ // 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];
}
}
@@ -223,7 +227,7 @@ dojo.global = {
=====*/
dojo.locale = d.config.locale;
- var rev = "$Rev: 22487 $".match(/\d+/);
+ var rev = "$Rev: 24595 $".match(/\d+/);
/*=====
dojo.version = function(){
@@ -247,7 +251,7 @@ dojo.global = {
}
=====*/
dojo.version = {
- major: 1, minor: 5, patch: 0, flag: "",
+ major: 1, minor: 6, patch: 1, flag: "",
revision: rev ? +rev[0] : NaN,
toString: function(){
with(d.version){
@@ -323,7 +327,7 @@ dojo.global = {
// | constructor: function(properties){
// | // property configuration:
// | dojo.mixin(this, properties);
- // |
+ // |
// | console.log(this.quip);
// | // ...
// | },
@@ -344,7 +348,7 @@ dojo.global = {
// | name: "Carl Brutanananadilewski"
// | }
// | );
- // |
+ // |
// | // will print "Carl Brutanananadilewski"
// | console.log(flattened.name);
// | // will print "true"
@@ -419,10 +423,7 @@ dojo.global = {
// 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 only for object and method detection.
- // Not useful for testing generic properties on an object.
- // In particular, dojo.exists("foo.bar") when foo.bar = ""
- // will return false. Use ("bar" in foo) to test for those cases.
+ // the chain. Useful for object and method detection.
// name:
// Path to an object, in the form "A.B.C".
// obj:
@@ -441,7 +442,7 @@ dojo.global = {
// | // search from a particular scope
// | dojo.exists("bar", foo); // true
// | dojo.exists("bar.baz", foo); // false
- return !!d.getObject(name, false, obj); // Boolean
+ return d.getObject(name, false, obj) !== undefined; // Boolean
}
dojo["eval"] = function(/*String*/ scriptFragment){
diff --git a/lib/dojo/_base/_loader/hostenv_browser.js b/lib/dojo/_base/_loader/hostenv_browser.js
index 7d92d70e3..b31bd77dc 100644
--- a/lib/dojo/_base/_loader/hostenv_browser.js
+++ b/lib/dojo/_base/_loader/hostenv_browser.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -26,9 +26,9 @@ dojo.isIE = {
dojo.isSafari = {
// example:
// | if(dojo.isSafari){ ... }
- // example:
+ // example:
// Detect iPhone:
- // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
+ // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
// | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test.
// | }
};
@@ -71,7 +71,6 @@ dojo = {
// True if the client runs on Mac
}
=====*/
-
if(typeof window != 'undefined'){
dojo.isBrowser = true;
dojo._name = "browser";
@@ -98,7 +97,7 @@ if(typeof window != 'undefined'){
d.config.baseUrl = src.substring(0, m.index);
}
// and find out if we need to modify our behavior
- var cfg = scripts[i].getAttribute("djConfig");
+ var cfg = (scripts[i].getAttribute("djConfig") || scripts[i].getAttribute("data-dojo-config"));
if(cfg){
var cfgo = eval("({ "+cfg+" })");
for(var x in cfgo){
@@ -172,7 +171,7 @@ if(typeof window != 'undefined'){
d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
d._xhrObj = function(){
- // summary:
+ // summary:
// does the work of portably generating a new XMLHTTPRequest object.
var http, last_e;
if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){
@@ -205,10 +204,11 @@ if(typeof window != 'undefined'){
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
+ 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:") );
+ (!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:"));
}
//See if base tag is in use.
@@ -303,7 +303,7 @@ if(typeof window != 'undefined'){
d.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
// summary:
// registers a function to be triggered when window.onunload
- // fires.
+ // fires.
// description:
// The first time that addOnWindowUnload is called Dojo
// will register a page listener to trigger your unload
@@ -334,7 +334,7 @@ if(typeof window != 'undefined'){
// description:
// The first time that addOnUnload is called Dojo will
// register a page listener to trigger your unload handler
- // with.
+ // with.
//
// In a browser enviroment, the functions will be triggered
// during the window.onbeforeunload event. Be careful of doing
@@ -347,7 +347,7 @@ if(typeof window != 'undefined'){
//
// Further note that calling dojo.addOnUnload will prevent
// browsers from using a "fast back" cache to make page
- // loading via back button instantaneous.
+ // loading via back button instantaneous.
// example:
// | dojo.addOnUnload(functionPointer)
// | dojo.addOnUnload(object, "functionName")
@@ -384,7 +384,7 @@ if(typeof window != 'undefined'){
}
}
- if(!dojo.config.afterOnLoad){
+ 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
@@ -401,10 +401,10 @@ if(typeof window != 'undefined'){
if(!dojo.config.skipIeDomLoaded && self === self.top){
dojo._scrollIntervalId = setInterval(function (){
try{
- //When dojo is loaded into an iframe in an IE HTML Application
+ //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
+ //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){
@@ -467,8 +467,11 @@ if(dojo.config.isDebug){
}
if(dojo.config.debugAtAllCosts){
- dojo.config.useXDomain = true;
- dojo.require("dojo._base._loader.loader_xd");
+ // 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_ff_ext.js b/lib/dojo/_base/_loader/hostenv_ff_ext.js
index 94a0a8046..ca47a4c1c 100644
--- a/lib/dojo/_base/_loader/hostenv_ff_ext.js
+++ b/lib/dojo/_base/_loader/hostenv_ff_ext.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -241,7 +241,7 @@ if(typeof window != 'undefined'){
return oc;
};
- // FIXME:
+ // FIXME:
// don't really like the current arguments and order to
// _inContext, so don't make it public until it's right!
dojo._inContext = function(g, d, f){
@@ -302,7 +302,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);
diff --git a/lib/dojo/_base/_loader/hostenv_rhino.js b/lib/dojo/_base/_loader/hostenv_rhino.js
index ee9ad8b43..e3aa78524 100644
--- a/lib/dojo/_base/_loader/hostenv_rhino.js
+++ b/lib/dojo/_base/_loader/hostenv_rhino.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -58,6 +58,9 @@ dojo._isLocalUrl = function(/*String*/ uri) {
// see comments in spidermonkey loadUri
dojo._loadUri = function(uri, cb){
+ if(dojo._loadedUrls[uri]){
+ return true; // Boolean
+ }
try{
var local;
try{
@@ -67,29 +70,32 @@ dojo._loadUri = function(uri, cb){
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 = String(contents).replace(/[\u200E\u200F\u202A-\u202E]/g, function(match){
+ return "\\u" + match.charCodeAt(0).toString(16);
})
}
-
- cb(eval('('+contents+')'));
+ 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){
+dojo.exit = function(exitcode){
quit(exitcode);
}
@@ -157,7 +163,7 @@ dojo._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
dojo.doc = typeof document != "undefined" ? document : null;
dojo.body = function(){
- return document.body;
+ return document.body;
}
// Supply setTimeout/clearTimeout implementations if they aren't already there
diff --git a/lib/dojo/_base/_loader/hostenv_spidermonkey.js b/lib/dojo/_base/_loader/hostenv_spidermonkey.js
index 17b21f5f0..a3d2dfc6f 100644
--- a/lib/dojo/_base/_loader/hostenv_spidermonkey.js
+++ b/lib/dojo/_base/_loader/hostenv_spidermonkey.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -19,13 +19,13 @@ dojo._name = 'spidermonkey';
/*=====
dojo.isSpidermonkey = {
- // summary: Detect spidermonkey
+ // summary: Detect spidermonkey
};
=====*/
dojo.isSpidermonkey = true;
-dojo.exit = function(exitcode){
- quit(exitcode);
+dojo.exit = function(exitcode){
+ quit(exitcode);
}
if(typeof print == "function"){
@@ -37,15 +37,15 @@ if(typeof line2pc == 'undefined'){
}
dojo._spidermonkeyCurrentFile = function(depth){
- //
+ //
// This is a hack that determines the current script file by parsing a
// generated stack trace (relying on the non-standard "stack" member variable
// of the SpiderMonkey Error object).
- //
+ //
// If param depth is passed in, it'll return the script file which is that far down
// the stack, but that does require that you know how deep your stack is when you are
// calling.
- //
+ //
var s = '';
try{
throw Error("whatever");
@@ -54,23 +54,23 @@ dojo._spidermonkeyCurrentFile = function(depth){
}
// lines are like: bu_getCurrentScriptURI_spidermonkey("ScriptLoader.js")@burst/Runtime.js:101
var matches = s.match(/[^@]*\.js/gi);
- if(!matches){
+ 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){
+ 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(dojo._spidermonkeyCurrentFile(0));
+// print(dojo._spidermonkeyCurrentFile(0));
dojo._loadUri = function(uri){
// spidermonkey load() evaluates the contents into the global scope (which
// is what we want).
- // TODO: sigh, load() does not return a useful value.
+ // TODO: sigh, load() does not return a useful value.
// Perhaps it is returning the value of the last thing evaluated?
var ok = load(uri);
// console.log("spidermonkey load(", uri, ") returned ", ok);
diff --git a/lib/dojo/_base/_loader/loader.js b/lib/dojo/_base/_loader/loader.js
index 9206de888..73df544fa 100644
--- a/lib/dojo/_base/_loader/loader.js
+++ b/lib/dojo/_base/_loader/loader.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -11,9 +11,8 @@ 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;
+ var d = dojo, currentModule;
d.mixin(d, {
_loadedModules: {},
@@ -45,11 +44,11 @@ dojo._hasResource["dojo.foo"] = true;
_loadedUrls: [],
- //WARNING:
+ //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: [],
@@ -68,21 +67,24 @@ dojo._hasResource["dojo.foo"] = true;
// not caught by us, so the caller will see it. We return a true
// value if and only if the script is found.
//
- // relpath:
+ // relpath:
// A relative path to a script (no leading '/', and typically ending
// in '.js').
- // module:
+ // module:
// A module whose existance to check for after loading a path. Can be
// used to determine success or failure of the load.
- // cb:
+ // 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;
}
}
@@ -95,7 +97,7 @@ dojo._hasResource["dojo.foo"] = true;
// 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:
+ // 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
@@ -109,7 +111,8 @@ dojo._hasResource["dojo.foo"] = true;
d._loadedUrls[uri] = true;
d._loadedUrls.push(uri);
if(cb){
- contents = '('+contents+')';
+ //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.
@@ -121,16 +124,16 @@ dojo._hasResource["dojo.foo"] = true;
}
// 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.
+ // 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
+ 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){
+ if(d._inFlightCount == 0){
d._callLoaded();
}
}, 0);
@@ -153,10 +156,10 @@ dojo._hasResource["dojo.foo"] = true;
dojo.loaded = function(){
// summary:
// signal fired when initial environment and package loading is
- // complete. You should use dojo.addOnLoad() instead of doing a
+ // 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
+ // initialized. In a browser host, declarative widgets will
// be constructed when this function finishes runing.
d._loadNotifying = true;
d._postLoad = true;
@@ -183,8 +186,8 @@ dojo._hasResource["dojo.foo"] = true;
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() 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){
@@ -203,13 +206,13 @@ dojo._hasResource["dojo.foo"] = true;
dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){
// summary:
- // Registers a function to be triggered after the DOM and dojo.require() calls
+ // 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.
+ // 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
@@ -252,7 +255,7 @@ dojo._hasResource["dojo.foo"] = true;
dojo._modulesLoaded = function(){
if(d._postLoad){ return; }
- if(d._inFlightCount > 0){
+ if(d._inFlightCount > 0){
console.warn("files still in flight!");
return;
}
@@ -284,8 +287,8 @@ dojo._hasResource["dojo.foo"] = true;
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
+ 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);
@@ -320,87 +323,95 @@ dojo._hasResource["dojo.foo"] = true;
dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){
// summary:
// loads a Javascript module from the appropriate URI
- // moduleName:
+ //
+ // 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:
+ //
+ // 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
+ // 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. Example:
- //
- // | <script type="text/javascript">
- // | dojo.require("foo");
- // | dojo.require("bar");
- // | dojo.addOnLoad(function(){
- // | //you can now safely do something with foo and bar
- // | });
- // | </script>
- //
+ // 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 excpetion if it cannot find a file
+ //
+ // `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. For example, to import all symbols into a
- // local block, you might write:
- //
+ // 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
+ //
+ // returns:
+ // the required namespace object
omitModuleCheck = d._global_omit_module_check || omitModuleCheck;
//Check if it is already loaded.
@@ -411,10 +422,8 @@ dojo._hasResource["dojo.foo"] = true;
// 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 + "'");
}
@@ -425,7 +434,7 @@ dojo._hasResource["dojo.foo"] = true;
// 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 + "'");
+ throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'");
}
}
@@ -446,14 +455,14 @@ dojo._hasResource["dojo.foo"] = true;
// 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
+ // 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
@@ -462,11 +471,11 @@ dojo._hasResource["dojo.foo"] = true;
// note that it includes multiple resources.
//
// resourceName: String
- // A dot-sperated string identifying a resource.
+ // A dot-sperated string identifying a resource.
//
// example:
// Safely create a `my` object, and make dojo.require("my.CustomModule") work
- // | dojo.provide("my.CustomModule");
+ // | dojo.provide("my.CustomModule");
//Make sure we have a string.
resourceName = resourceName + "";
@@ -523,7 +532,7 @@ dojo._hasResource["dojo.foo"] = true;
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++){
+ for(var i = 1; i < arguments.length; i++){
args.push(arguments[i]);
}
d.require.apply(d, args);
@@ -533,13 +542,13 @@ dojo._hasResource["dojo.foo"] = true;
dojo.requireAfterIf = d.requireIf;
dojo.registerModulePath = function(/*String*/module, /*String*/prefix){
- // summary:
+ // summary:
// Maps a module name to a path
- // description:
+ // 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.
+ // dojo.registerModulePath.
// example:
// If your dojo.js is located at this location in the web root:
// | /myapp/js/dojo/dojo/dojo.js
@@ -552,7 +561,7 @@ dojo._hasResource["dojo.foo"] = true;
// 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"
+ // | <script type="text/javascript"
// | src="/myapp/js/dojo/dojo/dojo.js"></script>
// | <script type="text/javascript">
// | dojo.registerModulePath("foo", "../../foo");
@@ -561,8 +570,8 @@ dojo._hasResource["dojo.foo"] = true;
// | 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
@@ -573,7 +582,7 @@ dojo._hasResource["dojo.foo"] = true;
// 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.
+ // 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.
@@ -588,21 +597,21 @@ dojo._hasResource["dojo.foo"] = true;
// preload the bundles to avoid data redundancy and the multiple
// network hits normally required to load these resources.
//
- // moduleName:
+ // moduleName:
// name of the package containing the "nls" directory in which the
// bundle is found
//
- // bundleName:
+ // 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:
+ // locale:
// the locale to load (optional) By default, the browser's user
// locale as defined by dojo.locale
//
- // availableFlatLocales:
+ // availableFlatLocales:
// A comma-separated list of the available, flattened locales for this
// bundle. This argument should only be set by the build process.
//
@@ -644,11 +653,11 @@ dojo._hasResource["dojo.foo"] = true;
ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
dojo._Url = function(/*dojo._Url|String...*/){
- // summary:
+ // summary:
// Constructor to create an object representing a URL.
// It is marked as private, since we might consider removing
// or simplifying it.
- // description:
+ // 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:
@@ -715,7 +724,7 @@ dojo._hasResource["dojo.foo"] = true;
}
uri = [];
- if(relobj.scheme){
+ if(relobj.scheme){
uri.push(relobj.scheme, ":");
}
if(relobj.authority){
@@ -755,7 +764,7 @@ dojo._hasResource["dojo.foo"] = true;
dojo._Url.prototype.toString = function(){ return this.uri; };
dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){
- // summary:
+ // summary:
// Returns a `dojo._Url` object relative to a module.
// example:
// | var pngPath = dojo.moduleUrl("acme","images/small.png");
@@ -763,10 +772,10 @@ dojo._hasResource["dojo.foo"] = true;
// | // 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();
+ // | img.src = pngPath.toString();
// | // add our image to the document
// | dojo.body().appendChild(img);
- // example:
+ // 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,
@@ -777,9 +786,9 @@ dojo._hasResource["dojo.foo"] = true;
// | // 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");
@@ -798,7 +807,10 @@ dojo._hasResource["dojo.foo"] = true;
}
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
index fa26d8efb..f2043e4de 100644
--- a/lib/dojo/_base/_loader/loader_debug.js
+++ b/lib/dojo/_base/_loader/loader_debug.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
diff --git a/lib/dojo/_base/_loader/loader_xd.js b/lib/dojo/_base/_loader/loader_xd.js
index c60b86b05..e59f814c0 100644
--- a/lib/dojo/_base/_loader/loader_xd.js
+++ b/lib/dojo/_base/_loader/loader_xd.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -170,23 +170,27 @@ dojo._xdIsXDomainPath = function(/*string*/relpath) {
var colonIndex = relpath.indexOf(":");
var slashIndex = relpath.indexOf("/");
- if(colonIndex > 0 && colonIndex < slashIndex){
+ 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) or if the baseUrl does not match the
- //current window's domain.
+ //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(colonIndex > 0 && colonIndex < slashIndex && (!location.host || url.indexOf("http://" + location.host) != 0)){
+ if(url.indexOf("//") === 0 || (colonIndex > 0 && colonIndex < slashIndex && (!location.host || url.indexOf("http://" + location.host) != 0))){
return true;
}
}
- return false;
+ return false;
}
dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){
@@ -218,8 +222,8 @@ dojo._loadUri = function(/*String*/uri, /*Function?*/cb, /*boolean*/currentIsXDo
}
//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
+ //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"){
@@ -386,7 +390,7 @@ dojo._xdResourceLoaded = function(/*Object*/res){
}
//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
+ //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;
@@ -490,7 +494,7 @@ dojo.xdRequireLocalization = function(/*String*/moduleName, /*String*/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
+ // 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();
@@ -525,7 +529,7 @@ dojo._xdUnpackDependency = function(/*Array*/dep){
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"]||[]);
+ 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.
@@ -562,7 +566,7 @@ dojo._xdUnpackDependency = function(/*Array*/dep){
}
dojo._xdWalkReqs = function(){
- //summary: Internal xd loader function.
+ //summary: Internal xd loader function.
//Walks the requires and evaluates module resource contents in
//the right order.
var reqChain = null;
@@ -578,7 +582,7 @@ dojo._xdWalkReqs = function(){
}
dojo._xdEvalReqs = function(/*Array*/reqChain){
- //summary: Internal xd loader function.
+ //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];
@@ -673,7 +677,7 @@ dojo._xdWatchInFlight = function(){
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.
+ //Pass in scope args to allow multiple versions of modules in a page.
content.apply(dojo.global, dojo._scopeArgs);
}
}
@@ -685,7 +689,7 @@ dojo._xdWatchInFlight = function(){
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.
+ //Pass in scope args to allow multiple versions of modules in a page.
current.content.apply(dojo.global, dojo._scopeArgs);
}
}
@@ -712,10 +716,10 @@ dojo._xdNotifyLoaded = function(){
}
}
- dojo._inFlightCount = 0;
+ dojo._inFlightCount = 0;
- //Only trigger call loaded if dj_load_init has run.
- if(dojo._initFired && !dojo._loadNotifying){
+ //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 26fa1900d..57cea4229 100644
--- a/lib/dojo/_base/array.js
+++ b/lib/dojo/_base/array.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -7,13 +7,14 @@
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.require("dojo._base.lang");
dojo.provide("dojo._base.array");
+dojo.require("dojo._base.lang");
+
(function(){
var _getParts = function(arr, obj, cb){
- return [
- (typeof arr == "string") ? arr.split("") : arr,
+ 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
@@ -32,7 +33,7 @@ dojo.provide("dojo._base.array");
};
dojo.mixin(dojo, {
- indexOf: function( /*Array*/ array,
+ indexOf: function( /*Array*/ array,
/*Object*/ value,
/*Integer?*/ fromIndex,
/*Boolean?*/ findLast){
@@ -41,7 +42,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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
@@ -66,7 +67,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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
@@ -85,7 +86,7 @@ dojo.provide("dojo._base.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
+ // 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:
@@ -108,21 +109,21 @@ dojo.provide("dojo._base.array");
// | );
// example:
// | // use a scoped object member as the callback
- // |
+ // |
// | var obj = {
- // | prefix: "logged via obj.callback:",
+ // | 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 ],
@@ -135,7 +136,7 @@ dojo.provide("dojo._base.array");
// 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){
+ for(var i=0,l=arr.length; i<l; ++i){
_p[2].call(_p[1], arr[i], i, arr);
}
},
@@ -152,7 +153,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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:
@@ -161,7 +162,7 @@ dojo.provide("dojo._base.array");
// | // returns false
// | dojo.every([1, 2, 3, 4], function(item){ return item>1; });
// example:
- // | // returns true
+ // | // returns true
// | dojo.every([1, 2, 3, 4], function(item){ return item>0; });
return everyOrSome(true, arr, callback, thisObject); // Boolean
},
@@ -178,7 +179,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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:
@@ -205,7 +206,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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:
@@ -236,9 +237,9 @@ dojo.provide("dojo._base.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
+ // 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.
+ // 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:
diff --git a/lib/dojo/_base/browser.js b/lib/dojo/_base/browser.js
index 496fe46b3..209330f0d 100644
--- a/lib/dojo/_base/browser.js
+++ b/lib/dojo/_base/browser.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,7 +8,6 @@
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");
@@ -18,12 +17,12 @@ 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);
-});
+ //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);
+ });
}
diff --git a/lib/dojo/_base/connect.js b/lib/dojo/_base/connect.js
index f37af65b2..7e8006221 100644
--- a/lib/dojo/_base/connect.js
+++ b/lib/dojo/_base/connect.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,27 +10,28 @@ 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
+ // 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
+ // - 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
+ // 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;
+ var ap = Array.prototype, c = arguments.callee, ls = c._listeners, t = c.target,
// return value comes from original target function
- var r = t && t.apply(this, arguments);
+ r = t && t.apply(this, arguments),
// make local copy of listener array so it is immutable during processing
- var i, lls;
- lls = [].concat(ls);
-
+ i, lls = [].concat(ls)
+ ;
+
// invoke listeners after target function
for(i in lls){
if(!(i in ap)){
@@ -44,12 +45,12 @@ dojo._listener = {
// 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.
+ // 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.
+ // be equivalent.
source = source || dojo.global;
// The source method is either null, a dispatcher, or some other function
var f = source[method];
@@ -59,15 +60,15 @@ dojo._listener = {
// original target function is special
d.target = f;
// dispatcher holds a list of listeners
- d._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 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
+ // 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.
@@ -89,9 +90,9 @@ dojo._listener = {
// 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,
+dojo.connect = function(/*Object|null*/ obj,
+ /*String*/ event,
+ /*Object|null*/ context,
/*String|Function*/ method,
/*Boolean?*/ dontFix){
// summary:
@@ -126,37 +127,37 @@ dojo.connect = function(/*Object|null*/ obj,
// 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
+ // The return value is a handle that is needed to
// remove this connection with `dojo.disconnect`.
//
- // obj:
- // The source object for the event function.
+ // obj:
+ // The source object for the event function.
// Defaults to `dojo.global` if null.
- // If obj is a DOM node, the connection is delegated
+ // 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.
+ // String name of the event function in obj.
// I.e. identifies a property `obj[event]`.
//
- // context:
+ // 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
+ //
+ // 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.
+ // 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
+ // If obj is a DOM node, set dontFix to true to prevent delegation
// of this connection to the DOM event manager.
//
// example:
@@ -206,9 +207,9 @@ dojo.connect = function(/*Object|null*/ obj,
// 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));
+ 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:
@@ -222,11 +223,11 @@ dojo.disconnect = function(/*Handle*/ 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
@@ -244,15 +245,15 @@ dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Fu
// 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.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.
+ // Remove a topic listener.
// handle:
// The handle returned from a call to subscribe.
// example:
@@ -262,7 +263,7 @@ dojo.unsubscribe = function(/*Handle*/ handle){
if(handle){
dojo._listener.remove(dojo._topics, handle[0], handle[1]);
}
-}
+};
dojo.publish = function(/*String*/ topic, /*Array*/ args){
// summary:
@@ -270,11 +271,11 @@ dojo.publish = function(/*String*/ topic, /*Array*/ args){
// topic:
// The name of the topic to publish.
// args:
- // An array of arguments. The arguments will be applied
+ // 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.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
@@ -283,10 +284,10 @@ dojo.publish = function(/*String*/ topic, /*Array*/ args){
if(f){
f.apply(this, args||[]);
}
-}
+};
-dojo.connectPublisher = function( /*String*/ topic,
- /*Object|null*/ obj,
+dojo.connectPublisher = function( /*String*/ topic,
+ /*Object|null*/ obj,
/*String*/ event){
// summary:
// Ensure that every time obj.event() is called, a message is published
@@ -295,11 +296,11 @@ dojo.connectPublisher = function( /*String*/ topic,
// the topic.
// topic:
// The name of the topic to publish.
- // obj:
+ // obj:
// The source object for the event function. Defaults to dojo.global
// if null.
// event:
- // The name of the event function in obj.
+ // The name of the event function in obj.
// I.e. identifies a property obj[event].
// example:
// | dojo.connectPublisher("/ajax/start", dojo, "xhrGet");
diff --git a/lib/dojo/_base/declare.js b/lib/dojo/_base/declare.js
index 8e46b12c0..437914870 100644
--- a/lib/dojo/_base/declare.js
+++ b/lib/dojo/_base/declare.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,18 +8,18 @@
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){ throw new Error("declare: " + msg); }
+ 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){
+ 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;
@@ -27,9 +27,9 @@ dojo.require("dojo._base.array");
for(; i < l; ++i){
base = bases[i];
if(!base){
- err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?");
+ 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.");
+ err("mixin #" + i + " is not a callable constructor.", className);
}
lin = base._meta ? base._meta.bases : [base];
top = 0;
@@ -82,7 +82,7 @@ dojo.require("dojo._base.array");
}
}
if(clsCount){
- err("can't build consistent linearization");
+ err("can't build consistent linearization", className);
}
// calculate the superclass offset
@@ -109,7 +109,7 @@ dojo.require("dojo._base.array");
caller = args.callee;
name = name || caller.nom;
if(!name){
- err("can't deduce a name to call inherited()");
+ err("can't deduce a name to call inherited()", this.declaredClass);
}
meta = this.constructor._meta;
@@ -127,7 +127,7 @@ dojo.require("dojo._base.array");
// error detection
chains = meta.chains;
if(chains && typeof chains[name] == "string"){
- err("calling chained method with inherited: " + name);
+ err("calling chained method with inherited: " + name, this.declaredClass);
}
// find caller
do{
@@ -168,7 +168,7 @@ dojo.require("dojo._base.array");
// error detection
chains = meta.chains;
if(!chains || chains.constructor !== "manual"){
- err("calling chained constructor with inherited");
+ err("calling chained constructor with inherited", this.declaredClass);
}
// find caller
while(base = bases[++pos]){ // intentional assignment
@@ -464,7 +464,7 @@ dojo.require("dojo._base.array");
// build a prototype
if(opts.call(superclass) == "[object Array]"){
// C3 MRO
- bases = c3mro(superclass);
+ bases = c3mro(superclass, className);
t = bases[0];
mixins = bases.length - t;
superclass = bases[mixins];
@@ -475,10 +475,10 @@ dojo.require("dojo._base.array");
t = superclass._meta;
bases = bases.concat(t ? t.bases : superclass);
}else{
- err("base class is not a callable constructor.");
+ 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?")
+ err("unknown base class. Did you use dojo.require to pull it in?", className);
}
}
if(superclass){
diff --git a/lib/dojo/_base/event.js b/lib/dojo/_base/event.js
index 5268c6cff..65239bf50 100644
--- a/lib/dojo/_base/event.js
+++ b/lib/dojo/_base/event.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,27 +10,26 @@ 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;}
+ if(!node){return;}
name = del._normalizeEventName(name);
fp = del._fixCallback(name, fp);
- var oname = name;
if(
- !dojo.isIE &&
+ !dojo.isIE &&
(name == "mouseenter" || name == "mouseleave")
){
var ofp = fp;
- //oname = name;
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);
+ return ofp.call(this, e);
}
}
}
@@ -71,7 +70,7 @@ dojo.require("dojo._base.connect");
},
_fixEvent: function(evt, sender){
// _fixCallback only attaches us to keypress.
- // Switch on evt.type anyway because we might
+ // Switch on evt.type anyway because we might
// be called directly from dojo.fixEvent.
switch(evt.type){
case "keypress":
@@ -81,26 +80,26 @@ dojo.require("dojo._base.connect");
return evt;
},
_setKeyChar: function(evt){
- evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';
+ 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
+ _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
}
});
@@ -115,7 +114,7 @@ dojo.require("dojo._base.connect");
// sender: DOMNode
// node to treat as "currentTarget"
return del._fixEvent(evt, sender);
- }
+ };
dojo.stopEvent = function(/*Event*/ evt){
// summary:
@@ -126,7 +125,7 @@ dojo.require("dojo._base.connect");
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;
@@ -141,16 +140,16 @@ dojo.require("dojo._base.connect");
// 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"
+ // 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
@@ -280,7 +279,7 @@ dojo.require("dojo._base.connect");
};
=====*/
- if(dojo.isIE){
+ if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
dojo.mouseButtons = {
LEFT: 1,
MIDDLE: 4,
@@ -305,7 +304,7 @@ dojo.require("dojo._base.connect");
}
// IE event normalization
- if(dojo.isIE){
+ if(dojo.isIE){
var _trySetKeyCode = function(e, code){
try{
// squelch errors when keyCode is read-only
@@ -314,7 +313,7 @@ dojo.require("dojo._base.connect");
}catch(e){
return 0;
}
- }
+ };
// by default, use the standard listener
var iel = dojo._listener;
@@ -323,7 +322,7 @@ dojo.require("dojo._base.connect");
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
+ // support handler indirection: event handler functions are
// referenced here. Event dispatchers hold only indices.
handlers: [],
// add a listener to an object
@@ -376,7 +375,7 @@ dojo.require("dojo._base.connect");
},
remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
event = del._normalizeEventName(event);
- iel.remove(node, event, handle);
+ iel.remove(node, event, handle);
if(event=="onkeypress"){
var kd = node.onkeydown;
if(--kd._stealthKeydownRefs <= 0){
@@ -402,11 +401,11 @@ dojo.require("dojo._base.connect");
// node to treat as "currentTarget"
if(!evt){
var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window;
- evt = w.event;
+ evt = w.event;
}
if(!evt){return(evt);}
- evt.target = evt.srcElement;
- evt.currentTarget = (sender || evt.srcElement);
+ 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
@@ -419,14 +418,16 @@ dojo.require("dojo._base.connect");
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"){
+ if(evt.type == "mouseover"){
evt.relatedTarget = evt.fromElement;
}
- if(evt.type == "mouseout"){
+ if(evt.type == "mouseout"){
evt.relatedTarget = evt.toElement;
}
- evt.stopPropagation = del._stopPropagation;
- evt.preventDefault = del._preventDefault;
+ if (dojo.isIE < 9 || dojo.isQuirks) {
+ evt.stopPropagation = del._stopPropagation;
+ evt.preventDefault = del._preventDefault;
+ }
return del._fixKeys(evt);
},
_fixKeys: function(evt){
@@ -460,38 +461,41 @@ dojo.require("dojo._base.connect");
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!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222);
+ 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){
+ 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)){
+ }else if((!evt.shiftKey)&&(c>=65&&c<=90)){
c += 32; // map CTRL-[A-Z] to lowercase
- }else{
+ }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);
- evt.cancelBubble = faux.cancelBubble;
+ 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;
+ 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
+ // 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;
@@ -501,23 +505,23 @@ dojo.require("dojo._base.connect");
});
// override stopEvent for IE
- dojo.stopEvent = function(evt){
+ 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);
+ // 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(); };
+ faux.preventDefault = function(){ evt.preventDefault(); };
+ faux.stopPropagation = function(){ evt.stopPropagation(); };
return faux;
- }
+ };
// Opera event normalization
if(dojo.isOpera){
@@ -568,12 +572,12 @@ dojo.require("dojo._base.connect");
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){
+ 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){
+ }else if(!evt.shiftKey && c>=65 && c<=90){
c += 32; // map CTRL-[A-Z] to lowercase
- }else{
+ }else{
c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII
}
}
@@ -630,16 +634,16 @@ if(dojo.isIE){
}
}
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)); };
- }
+ };
}
}
diff --git a/lib/dojo/_base/fx.js b/lib/dojo/_base/fx.js
index 21243c1c9..860e0e18b 100644
--- a/lib/dojo/_base/fx.js
+++ b/lib/dojo/_base/fx.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -13,6 +13,7 @@ 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
diff --git a/lib/dojo/_base/html.js b/lib/dojo/_base/html.js
index be5fd2aaa..8661b2b12 100644
--- a/lib/dojo/_base/html.js
+++ b/lib/dojo/_base/html.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -7,8 +7,9 @@
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.require("dojo._base.lang");
dojo.provide("dojo._base.html");
+dojo.require("dojo._base.lang");
+
// FIXME: need to add unit tests for all the semi-public methods
@@ -53,13 +54,13 @@ dojo.byId = function(id, doc){
// | }
=====*/
-if(dojo.isIE || dojo.isOpera){
+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
+ // 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;
@@ -80,8 +81,9 @@ if(dojo.isIE || dojo.isOpera){
};
}else{
dojo.byId = function(id, doc){
- // inline'd type check
- return (typeof id == "string") ? (doc || dojo.doc).getElementById(id) : id; // DomNode
+ // 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
};
}
/*=====
@@ -164,16 +166,16 @@ if(dojo.isIE || dojo.isOpera){
};
dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){
- // summary:
+ // 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
+ // state to put the node in. false indicates unselectable, true
// allows selection.
// example:
// Make the node id="bar" unselectable
- // | dojo.setSelectable("bar");
+ // | dojo.setSelectable("bar");
// example:
// Make the node id="bar" selectable
// | dojo.setSelectable("bar", true);
@@ -256,7 +258,7 @@ if(dojo.isIE || dojo.isOpera){
refNode = byId(refNode);
if(typeof node == "string"){ // inline'd type check
- node = node.charAt(0) == "<" ? d._toDom(node, refNode.ownerDocument) : byId(node);
+ node = /^\s*</.test(node) ? d._toDom(node, refNode.ownerDocument) : byId(node);
}
if(typeof position == "number"){ // inline'd type check
var cn = refNode.childNodes;
@@ -291,7 +293,7 @@ if(dojo.isIE || dojo.isOpera){
}
}
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.
@@ -303,7 +305,7 @@ if(dojo.isIE || dojo.isOpera){
dojo.boxModel = "content-box";
// We punt per-node box mode testing completely.
- // If anybody cares, we can provide an additional (optional) unit
+ // 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.
@@ -323,10 +325,10 @@ if(dojo.isIE || dojo.isOpera){
// getComputedStyle drives most of the style code.
// Wherever possible, reuse the returned object.
//
- // API functions below that need to access computed styles accept an
+ // 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
+ // This way, calling code can access computedStyle once, and then pass the reference to
// multiple API functions.
/*=====
@@ -365,7 +367,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // it is frequently sent to this function even
// though it is not Element.
var gcs;
if(d.isWebKit){
@@ -426,7 +428,7 @@ if(dojo.isIE || dojo.isOpera){
runtimeStyle.left = rsLeft;
}
return avalue;
- }
+ };
}
var px = d._toPixelValue;
@@ -454,7 +456,7 @@ if(dojo.isIE || dojo.isOpera){
};
dojo._getOpacity =
- d.isIE ? function(node){
+ d.isIE < 9 ? function(node){
try{
return af(node).Opacity / 100; // Number
}catch(e){
@@ -481,7 +483,7 @@ if(dojo.isIE || dojo.isOpera){
=====*/
dojo._setOpacity =
- d.isIE ? function(/*DomNode*/node, /*Number*/opacity){
+ d.isIE < 9 ? function(/*DomNode*/node, /*Number*/opacity){
var ov = opacity * 100, opaque = opacity == 1;
node.style.zoom = opaque ? "" : 1;
@@ -553,7 +555,7 @@ if(dojo.isIE || dojo.isOpera){
// 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()`,
+ // 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
@@ -622,7 +624,7 @@ if(dojo.isIE || dojo.isOpera){
return s;
}
return (args == 1) ? s : _toStyleValue(n, style, s[style] || n.style[style]); /* CSS2Properties||String||Number */
- }
+ };
// =============================
// Box Functions
@@ -635,13 +637,13 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // | 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
+ var
s = computedStyle||gcs(n),
l = px(n, s.paddingLeft),
t = px(n, s.paddingTop);
@@ -651,7 +653,7 @@ if(dojo.isIE || dojo.isOpera){
w: l+px(n, s.paddingRight),
h: t+px(n, s.paddingBottom)
};
- }
+ };
dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){
// summary:
@@ -665,7 +667,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ var
ne = "none",
s = computedStyle||gcs(n),
bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0),
@@ -676,7 +678,7 @@ if(dojo.isIE || dojo.isOpera){
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:
@@ -690,7 +692,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ var
s = computedStyle||gcs(n),
p = d._getPadExtents(n, s),
b = d._getBorderExtents(n, s);
@@ -700,7 +702,7 @@ if(dojo.isIE || dojo.isOpera){
w: p.w + b.w,
h: p.h + b.h
};
- }
+ };
dojo._getMarginExtents = function(n, computedStyle){
// summary:
@@ -714,7 +716,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ var
s = computedStyle||gcs(n),
l = px(n, s.marginLeft),
t = px(n, s.marginTop),
@@ -722,9 +724,9 @@ if(dojo.isIE || dojo.isOpera){
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
+ // 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
+ // 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;
@@ -735,7 +737,7 @@ if(dojo.isIE || dojo.isOpera){
w: l+r,
h: t+b
};
- }
+ };
// Box getters work in any box context because offsetWidth/clientWidth
// are invariant wrt box context
@@ -743,10 +745,10 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // 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
+ // 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)
@@ -790,9 +792,23 @@ if(dojo.isIE || dojo.isOpera){
l: l,
t: t,
w: node.offsetWidth + me.w,
- h: node.offsetHeight + me.h
+ 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:
@@ -821,7 +837,7 @@ if(dojo.isIE || dojo.isOpera){
w: w - pe.w - be.w,
h: h - pe.h - be.h
};
- }
+ };
dojo._getBorderBox = function(node, computedStyle){
var s = computedStyle || gcs(node),
@@ -834,7 +850,7 @@ if(dojo.isIE || dojo.isOpera){
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.
@@ -845,12 +861,12 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // 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
+ // 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){
@@ -876,14 +892,14 @@ if(dojo.isIE || dojo.isOpera){
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:
@@ -898,7 +914,7 @@ if(dojo.isIE || dojo.isOpera){
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:
@@ -910,7 +926,7 @@ if(dojo.isIE || dojo.isOpera){
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,
@@ -942,7 +958,7 @@ if(dojo.isIE || dojo.isOpera){
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 };
@@ -977,7 +993,7 @@ if(dojo.isIE || dojo.isOpera){
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:
@@ -1002,14 +1018,14 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // Positioning
// =============================
var _sumAncestorProperties = function(node, prop){
- if(!(node = (node||0).parentNode)){return 0}
+ if(!(node = (node||0).parentNode)){return 0;}
var val, retVal = 0, _b = d.body();
while(node && node.style){
if(gcs(node).position == "fixed"){
@@ -1025,19 +1041,19 @@ if(dojo.isIE || dojo.isOpera){
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.doc.documentElement, n.clientHeight? { x:d._fixIeBiDiScrollLeft(n.scrollLeft), y:n.scrollTop } :
- (n=d.body(), { x:n.scrollLeft||0, y:n.scrollTop||0 }));
+ 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
- }
+ d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean
+ };
dojo._getIeDocumentElementOffset = function(){
// summary:
@@ -1058,7 +1074,7 @@ if(dojo.isIE || dojo.isOpera){
//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 = 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+
@@ -1083,18 +1099,22 @@ if(dojo.isIE || dojo.isOpera){
};
dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){
- // In RTL direction, scrollLeft should be a negative value, but IE < 8
+ // 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 dd = d.doc;
- if(d.isIE < 8 && !d._isBodyLtr()){
- var de = d.isQuirks ? dd.body : dd.documentElement;
- return scrollLeft + de.clientWidth - de.scrollWidth; // Integer
+ 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){
@@ -1112,10 +1132,9 @@ if(dojo.isIE || dojo.isOpera){
// Uses the border-box model (inclusive of border and padding but
// not margin). Does not act as a setter.
- var db = d.body(), dh = db.parentNode, ret;
node = byId(node);
- if(node["getBoundingClientRect"]){
- // IE6+, FF3+, super-modern WebKit, and Opera 9.6+ all take this branch
+ 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){
@@ -1132,60 +1151,7 @@ if(dojo.isIE || dojo.isOpera){
ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
}
- }else{
- // FF2 and older WebKit
- ret = {
- x: 0,
- y: 0,
- w: node.offsetWidth,
- h: node.offsetHeight
- };
- if(node["offsetParent"]){
- ret.x -= _sumAncestorProperties(node, "scrollLeft");
- ret.y -= _sumAncestorProperties(node, "scrollTop");
-
- var curnode = node;
- do{
- var n = curnode.offsetLeft,
- t = curnode.offsetTop;
- ret.x += isNaN(n) ? 0 : n;
- ret.y += isNaN(t) ? 0 : t;
-
- cs = gcs(curnode);
- if(curnode != node){
- if(d.isMoz){
- // tried left+right with differently sized left/right borders
- // it really is 2xleft border in FF, not left+right, even in RTL!
- ret.x += 2 * px(curnode,cs.borderLeftWidth);
- ret.y += 2 * px(curnode,cs.borderTopWidth);
- }else{
- ret.x += px(curnode, cs.borderLeftWidth);
- ret.y += px(curnode, cs.borderTopWidth);
- }
- }
- // static children in a static div in FF2 are affected by the div's border as well
- // but offsetParent will skip this div!
- if(d.isMoz && cs.position=="static"){
- var parent=curnode.parentNode;
- while(parent!=curnode.offsetParent){
- var pcs=gcs(parent);
- if(pcs.position=="static"){
- ret.x += px(curnode,pcs.borderLeftWidth);
- ret.y += px(curnode,pcs.borderTopWidth);
- }
- parent=parent.parentNode;
- }
- }
- curnode = curnode.offsetParent;
- }while((curnode != dh) && curnode);
- }else if(node.x && node.y){
- ret.x += isNaN(node.x) ? 0 : node.x;
- ret.y += isNaN(node.y) ? 0 : node.y;
- }
- }
- // 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
+ // account for document scrolling
if(includeScroll){
var scroll = d._docScroll();
ret.x += scroll.x;
@@ -1193,7 +1159,7 @@ if(dojo.isIE || dojo.isOpera){
}
return ret; // Object
- }
+ };
dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){
// summary:
@@ -1215,7 +1181,7 @@ if(dojo.isIE || dojo.isOpera){
mb.x = abs.x;
mb.y = abs.y;
return mb;
- }
+ };
// =============================
// Element attribute Functions
@@ -1277,7 +1243,7 @@ if(dojo.isIE || dojo.isOpera){
// 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",
@@ -1447,7 +1413,7 @@ if(dojo.isIE || dojo.isOpera){
// 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:
@@ -1457,7 +1423,7 @@ if(dojo.isIE || dojo.isOpera){
// name:
// the name of the attribute to remove
byId(node).removeAttribute(_fixAttrName(name));
- }
+ };
dojo.getNodeProp = function(/*DomNode|String*/ node, /*String*/ name){
// summary:
@@ -1476,7 +1442,7 @@ if(dojo.isIE || dojo.isOpera){
// 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:
@@ -1491,7 +1457,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // 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
@@ -1529,7 +1495,7 @@ if(dojo.isIE || dojo.isOpera){
// | 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
+ // 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"];
@@ -1559,7 +1525,7 @@ if(dojo.isIE || dojo.isOpera){
if(attrs){ d.attr(tag, attrs); }
if(refNode){ d.place(tag, refNode, pos); }
return tag; // DomNode
- }
+ };
/*=====
dojo.empty = function(node){
@@ -1627,11 +1593,13 @@ if(dojo.isIE || dojo.isOpera){
// generate start/end tag strings to use
// for the injection for each special tag wrap case.
for(var param in tagWrap){
- 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
+ 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){
@@ -1674,7 +1642,7 @@ if(dojo.isIE || dojo.isOpera){
df.appendChild(fc);
}
return df; // DOMNode
- }
+ };
// =============================
// (CSS) Class Functions
@@ -1700,6 +1668,7 @@ if(dojo.isIE || dojo.isOpera){
};
var spaces = /\s+/, a1 = [""],
+ fakeNode = {},
str2array = function(s){
if(typeof s == "string" || s instanceof String){
if(s.indexOf(" ") < 0){
@@ -1805,6 +1774,39 @@ if(dojo.isIE || dojo.isOpera){
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.
diff --git a/lib/dojo/_base/json.js b/lib/dojo/_base/json.js
index 4d50400c9..4267c225e 100644
--- a/lib/dojo/_base/json.js
+++ b/lib/dojo/_base/json.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build.
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.
@@ -16,12 +17,12 @@ dojo.fromJson = function(/*String*/ json){
// 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:
+ // 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:
@@ -31,7 +32,7 @@ dojo._escapeString = function(/*String*/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"); // string
-}
+};
dojo.toJsonIndentStr = "\t";
dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){
@@ -75,8 +76,8 @@ dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _ind
if(it === null){
return "null";
}
- if(dojo.isString(it)){
- return dojo._escapeString(it);
+ if(dojo.isString(it)){
+ return dojo._escapeString(it);
}
// recurse
var recurse = arguments.callee;
@@ -149,6 +150,6 @@ dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _ind
output.push(newLine + nextIndent + keyStr + ":" + sep + val);
}
return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String
-}
+};
}
diff --git a/lib/dojo/_base/lang.js b/lib/dojo/_base/lang.js
index 0e9c7c2f9..9061de01e 100644
--- a/lib/dojo/_base/lang.js
+++ b/lib/dojo/_base/lang.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build.
dojo._hasResource["dojo._base.lang"] = true;
dojo.provide("dojo._base.lang");
+
(function(){
var d = dojo, opts = Object.prototype.toString;
@@ -18,14 +19,14 @@ dojo.provide("dojo._base.lang");
// 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:
@@ -39,7 +40,7 @@ dojo.provide("dojo._base.lang");
// or null)
return it !== undefined &&
(it === null || typeof it == "object" || d.isArray(it) || d.isFunction(it)); // Boolean
- }
+ };
dojo.isArrayLike = function(/*anything*/ it){
// summary:
@@ -58,14 +59,14 @@ dojo.provide("dojo._base.lang");
!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:
@@ -76,7 +77,7 @@ dojo.provide("dojo._base.lang");
d._mixin(constructor.prototype, arguments[i]);
}
return constructor; // Object
- }
+ };
dojo._hitchArgs = function(scope, method /*,...*/){
var pre = d._toArray(arguments, 2);
@@ -88,8 +89,8 @@ dojo.provide("dojo._base.lang");
var f = named ? (scope||d.global)[method] : method;
// invoke with collected args
return f && f.apply(scope || this, pre.concat(args)); // mixed
- } // Function
- }
+ }; // Function
+ };
dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){
// summary:
@@ -97,7 +98,7 @@ dojo.provide("dojo._base.lang");
// 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
+ // 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.
@@ -137,7 +138,7 @@ dojo.provide("dojo._base.lang");
return function(){ return scope[method].apply(scope, arguments || []); }; // Function
}
return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
- }
+ };
/*=====
dojo.delegate = function(obj, props){
@@ -181,7 +182,7 @@ dojo.provide("dojo._base.lang");
d._mixin(tmp, props);
}
return tmp; // Object
- }
+ };
})();
/*=====
@@ -230,7 +231,7 @@ dojo.provide("dojo._base.lang");
// | 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 = {};
@@ -250,6 +251,10 @@ dojo.provide("dojo._base.lang");
// 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
@@ -288,7 +293,7 @@ dojo.provide("dojo._base.lang");
}
}
return r; // Object
- }
+ };
/*=====
dojo.trim = function(str){
@@ -317,7 +322,7 @@ dojo.provide("dojo._base.lang");
dojo.replace = function(tmpl, map, pattern){
// summary:
// Performs parameterized substitutions on a string. Throws an
- // exception if any parameter is unmatched.
+ // exception if any parameter is unmatched.
// tmpl: String
// String to be used as a template.
// map: Object|Function
diff --git a/lib/dojo/_base/query-sizzle.js b/lib/dojo/_base/query-sizzle.js
index 5d160ec55..aad4e824d 100644
--- a/lib/dojo/_base/query-sizzle.js
+++ b/lib/dojo/_base/query-sizzle.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -20,11 +20,7 @@ dojo._hasResource["dojo._base.query"] = true;
* Finally, dojo.provide/require added.
*/
-//This file gets copied to dojo/_base/query.js, so set the provide accordingly.
-if(typeof dojo != "undefined"){
- dojo.provide("dojo._base.query");
- dojo.require("dojo._base.NodeList");
-
+var startDojoMappings= function(dojo) {
//Start Dojo mappings.
dojo.query = function(/*String*/ query, /*String|DOMNode?*/ root, /*Function?*/listCtor){
listCtor = listCtor || dojo.NodeList;
@@ -45,16 +41,16 @@ if(typeof dojo != "undefined"){
}
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.
-;(function(ns){
+var defineSizzle= function(ns){
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,
done = 0,
@@ -862,8 +858,20 @@ var contains = document.compareDocumentPosition ? function(a, b){
// EXPOSE
-(ns || window).Sizzle = Sizzle;
+ns.Sizzle = Sizzle;
-})(typeof dojo == "undefined" ? null : dojo);
+};
+
+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 7b9878e47..59411952f 100644
--- a/lib/dojo/_base/query.js
+++ b/lib/dojo/_base/query.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -7,12 +7,7 @@
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;
-if(typeof dojo != "undefined"){
- dojo.provide("dojo._base.query");
- dojo.require("dojo._base.NodeList");
- dojo.require("dojo._base.lang");
-
-}
+(function(){
/*
dojo.query() architectural overview:
@@ -46,7 +41,7 @@ if(typeof dojo != "undefined"){
5.) matched nodes are pruned to ensure they are unique (if necessary)
*/
-;(function(d){
+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").
@@ -54,7 +49,7 @@ if(typeof dojo != "undefined"){
// Toolkit aliases
////////////////////////////////////////////////////////////////////////
- // if you are extracing dojo.query for use in your own system, you will
+ // 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
@@ -65,7 +60,7 @@ if(typeof dojo != "undefined"){
// d.isOpera; // float
// d.isWebKit; // float
// d.doc ; // document element
- var qlc = d._NodeListCtor = d.NodeList;
+ 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
@@ -96,7 +91,7 @@ if(typeof dojo != "undefined"){
////////////////////////////////////////////////////////////////////////
var getQueryParts = function(query){
- // summary:
+ // summary:
// state machine for query tokenization
// description:
// instead of using a brittle and slow regex-based CSS parser,
@@ -105,16 +100,16 @@ if(typeof dojo != "undefined"){
// 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) charachter and returns an
+ // 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:
+ // NOTE:
// this code is designed to run fast and compress well. Sacrifices
- // to readibility and maintainability have been made. Your best
+ // 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
@@ -130,7 +125,7 @@ if(typeof dojo != "undefined"){
}
var ts = function(/*Integer*/ s, /*Integer*/ e){
- // trim and slice.
+ // 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
@@ -138,12 +133,12 @@ if(typeof dojo != "undefined"){
}
// the overall data graph of the full query, as represented by queryPart objects
- var queryParts = [];
+ var queryParts = [];
// state keeping vars
- var inBrackets = -1, inParens = -1, inMatchFor = -1,
- inPseudo = -1, inClass = -1, inId = -1, inTag = -1,
+ var inBrackets = -1, inParens = -1, inMatchFor = -1,
+ inPseudo = -1, inClass = -1, inId = -1, inTag = -1,
lc = "", cc = "", pStart;
// iteration vars
@@ -152,7 +147,7 @@ if(typeof dojo != "undefined"){
currentPart = null, // data structure representing the entire clause
_cp = null; // the current pseudo or attr matcher
- // several temporary variables are assigned to this structure durring a
+ // 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
@@ -207,9 +202,9 @@ if(typeof dojo != "undefined"){
// 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.loops = (
+ currentPart.pseudos.length ||
+ currentPart.attrs.length ||
currentPart.classes.length );
currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string
@@ -239,9 +234,9 @@ if(typeof dojo != "undefined"){
currentPart.infixOper = queryParts.pop();
currentPart.query = currentPart.infixOper.query + " " + currentPart.query;
/*
- console.debug( "swapping out the infix",
- currentPart.infixOper,
- "and attaching it to",
+ console.debug( "swapping out the infix",
+ currentPart.infixOper,
+ "and attaching it to",
currentPart);
*/
}
@@ -250,15 +245,15 @@ if(typeof dojo != "undefined"){
currentPart = null;
}
- // iterate over the query, charachter by charachter, building up a
+ // 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 charachter (if any)
+ // 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(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;
@@ -301,7 +296,7 @@ if(typeof dojo != "undefined"){
// 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;
+ inTag = x;
}
if(inBrackets >= 0){
@@ -309,7 +304,7 @@ if(typeof dojo != "undefined"){
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 existance match in the
+ // assume this is an attribute existence match in the
// form of [someAttributeName]
_cp.attr = ts(inBrackets+1, x);
}else{
@@ -320,19 +315,19 @@ if(typeof dojo != "undefined"){
var cmf = _cp.matchFor;
if(cmf){
// try to strip quotes from the matchFor value. We want
- // [attrName=howdy] to match the same
+ // [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.
+ // 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.
+ // record it along with the "=" operator.
var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : "";
_cp.type = addToCc+cc;
_cp.attr = ts(inBrackets+1, x-addToCc.length);
@@ -341,7 +336,7 @@ if(typeof dojo != "undefined"){
// 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 pseduo-selector rule like
+ // out if it's attached to a pseudo-selector rule like
// :nth-child(1)
if(cc == ")"){
if(inPseudo >= 0){
@@ -362,7 +357,7 @@ if(typeof dojo != "undefined"){
endAll();
inPseudo = x;
}else if(cc == "["){
- // start of an attribute match.
+ // start of an attribute match.
endAll();
inBrackets = x;
// provide a new structure for the attribute match to fill-in
@@ -376,15 +371,15 @@ if(typeof dojo != "undefined"){
// 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),
+ _cp = {
+ name: ts(inPseudo+1, x),
value: null
}
currentPart.pseudos.push(_cp);
}
inParens = x;
}else if(
- (cc == " ") &&
+ (cc == " ") &&
// if it's a space char and the last char is too, consume the
// current one without doing more work
(lc != cc)
@@ -404,7 +399,7 @@ if(typeof dojo != "undefined"){
// 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 possed, the other is used exclusively.
+ // either are not passed, the other is used exclusively.
if(!first){ return second; }
if(!second){ return first; }
@@ -456,7 +451,7 @@ if(typeof dojo != "undefined"){
}
},
"$=": function(attr, value){
- // E[foo$="bar"]
+ // E[foo$="bar"]
// an E element whose "foo" attribute value ends exactly
// with the string "bar"
var tval = " "+value;
@@ -466,7 +461,7 @@ if(typeof dojo != "undefined"){
}
},
"~=": function(attr, value){
- // E[foo~="bar"]
+ // 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"
@@ -532,7 +527,7 @@ if(typeof dojo != "undefined"){
if(!tret){ return -1; }
var l = tret.length;
- // we calcuate the parent length as a cheap way to invalidate the
+ // 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 ){
@@ -544,11 +539,11 @@ if(typeof dojo != "undefined"){
root["_l"] = l;
ci = -1;
for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){
- if(_simpleNodeTest(te)){
+ if(_simpleNodeTest(te)){
te["_i"] = ++i;
- if(node === te){
+ if(node === te){
// NOTE:
- // shortcuting the return at this step in indexing works
+ // 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
@@ -579,7 +574,7 @@ if(typeof dojo != "undefined"){
"first-child": function(){ return _lookLeft; },
"last-child": function(){ return _lookRight; },
"only-child": function(name, condition){
- return function(node){
+ return function(node){
if(!_lookLeft(node)){ return false; }
if(!_lookRight(node)){ return false; }
return true;
@@ -610,7 +605,7 @@ if(typeof dojo != "undefined"){
},
"not": function(name, condition){
var p = getQueryParts(condition)[0];
- var ignores = { el: 1 };
+ var ignores = { el: 1 };
if(p.tag != "*"){
ignores.tag = 1;
}
@@ -670,7 +665,7 @@ if(typeof dojo != "undefined"){
}
};
- var defaultGetter = (d.isIE) ? function(cond){
+ var defaultGetter = (d.isIE < 9 || (dojo.isIE && dojo.isQuirks)) ? function(cond){
var clc = cond.toLowerCase();
if(clc == "class"){ cond = "className"; }
return function(elem){
@@ -684,7 +679,7 @@ if(typeof dojo != "undefined"){
var getSimpleFilterFunc = function(query, ignores){
// generates a node tester function based on the passed query part. The
- // query part is one of the structures generatd by the query parser
+ // 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
@@ -715,7 +710,7 @@ if(typeof dojo != "undefined"){
if(isWildcard){
cname = cname.substr(0, cname.length-1);
}
- // I dislike the regex thing, even if memozied in a cache, but it's VERY short
+ // 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|$)");
@@ -753,7 +748,7 @@ if(typeof dojo != "undefined"){
if(!("id" in ignores)){
if(query.id){
- ff = agree(ff, function(elem){
+ ff = agree(ff, function(elem){
return (!!elem && (elem.id == query.id));
});
}
@@ -761,7 +756,7 @@ if(typeof dojo != "undefined"){
if(!ff){
if(!("default" in ignores)){
- ff = yesman;
+ ff = yesman;
}
}
return ff;
@@ -812,7 +807,7 @@ if(typeof dojo != "undefined"){
_simpleNodeTest(te) &&
(!bag || _isUnique(te, bag)) &&
(filterFunc(te, x))
- ){
+ ){
ret.push(te);
}
}
@@ -854,7 +849,7 @@ if(typeof dojo != "undefined"){
// 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
- // founde, a test function is applied to weed out the ones we
+ // 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
@@ -907,7 +902,7 @@ if(typeof dojo != "undefined"){
var filterFunc = getSimpleFilterFunc(query, { el: 1 });
var qt = query.tag;
var wildcardTag = ("*" == qt);
- var ecs = getDoc()["getElementsByClassName"];
+ var ecs = getDoc()["getElementsByClassName"];
if(!oper){
// if there's no infix operator, then it's a descendant query. ID
@@ -917,8 +912,8 @@ if(typeof dojo != "undefined"){
// 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 :
+ filterFunc = (!query.loops && wildcardTag) ?
+ yesman :
getSimpleFilterFunc(query, { el: 1, id: 1 });
retFunc = function(root, arr){
@@ -933,9 +928,9 @@ if(typeof dojo != "undefined"){
}
}
}else if(
- ecs &&
+ ecs &&
// isAlien check. Workaround for Prototype.js being totally evil/dumb.
- /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
+ /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
query.classes.length &&
!cssCaseBug
){
@@ -1101,8 +1096,8 @@ if(typeof dojo != "undefined"){
// We need te detect the right "internal" webkit version to make this work.
var wk = "WebKit/";
var is525 = (
- d.isWebKit &&
- (nua.indexOf(wk) > 0) &&
+ d.isWebKit &&
+ (nua.indexOf(wk) > 0) &&
(parseFloat(nua.split(wk)[1]) > 528)
);
@@ -1113,7 +1108,7 @@ if(typeof dojo != "undefined"){
var qsa = "querySelectorAll";
var qsaAvail = (
- !!getDoc()[qsa] &&
+ !!getDoc()[qsa] &&
// see #5832
(!d.isSafari || (d.isSafari > 3.1) || is525 )
);
@@ -1142,7 +1137,7 @@ if(typeof dojo != "undefined"){
var domCached = _queryFuncCacheDOM[query];
if(domCached){ return domCached; }
- // TODO:
+ // 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.
@@ -1156,11 +1151,11 @@ if(typeof dojo != "undefined"){
forceDOM = true;
}
- var useQSA = (
+ 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) &&
+ (specials.indexOf(qcz) == -1) &&
// IE's QSA impl sucks on pseudos
(!d.isIE || (query.indexOf(":") == -1)) &&
@@ -1173,11 +1168,11 @@ if(typeof dojo != "undefined"){
// 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(":contains") == -1) && (query.indexOf(":checked") == -1) &&
(query.indexOf("|=") == -1) // some browsers don't grok it
);
- // TODO:
+ // 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
@@ -1186,7 +1181,7 @@ if(typeof dojo != "undefined"){
if(useQSA){
- var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ?
+ var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ?
(query + " *") : query;
return _queryFuncCacheQSA[query] = function(root){
try{
@@ -1213,9 +1208,9 @@ if(typeof dojo != "undefined"){
}else{
// DOM branch
var parts = query.split(/\s*,\s*/);
- return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
+ return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
// if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher
- getStepQueryFunc(query) :
+ 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
@@ -1245,7 +1240,7 @@ if(typeof dojo != "undefined"){
}else{
return node.uniqueID;
}
- } :
+ } :
function(node){
return (node._uid || (node._uid = ++_zipIdx));
};
@@ -1254,7 +1249,7 @@ if(typeof dojo != "undefined"){
// 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.
+ // the upside, it gives us a built in unique ID function.
var _isUnique = function(node, bag){
if(!bag){ return 1; }
var id = _nodeUID(node);
@@ -1266,7 +1261,7 @@ if(typeof dojo != "undefined"){
// returning a list of "uniques", hopefully in doucment order
var _zipIdxName = "_zipIdx";
var _zip = function(arr){
- if(arr && arr.nozip){
+ if(arr && arr.nozip){
return (qlc._wrap) ? qlc._wrap(arr) : arr;
}
// var ret = new d._NodeListCtor();
@@ -1285,7 +1280,7 @@ if(typeof dojo != "undefined"){
var szidx = _zipIdx+"";
arr[0].setAttribute(_zipIdxName, szidx);
for(var x = 1, te; te = arr[x]; x++){
- if(arr[x].getAttribute(_zipIdxName) != szidx){
+ if(arr[x].getAttribute(_zipIdxName) != szidx){
ret.push(te);
}
te.setAttribute(_zipIdxName, szidx);
@@ -1293,7 +1288,7 @@ if(typeof dojo != "undefined"){
}else if(d.isIE && arr.commentStrip){
try{
for(var x = 1, te; te = arr[x]; x++){
- if(_isElement(te)){
+ if(_isElement(te)){
ret.push(te);
}
}
@@ -1301,7 +1296,7 @@ if(typeof dojo != "undefined"){
}else{
if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; }
for(var x = 1, te; te = arr[x]; x++){
- if(arr[x][_zipIdxName] != _zipIdx){
+ if(arr[x][_zipIdxName] != _zipIdx){
ret.push(te);
}
te[_zipIdxName] = _zipIdx;
@@ -1331,11 +1326,11 @@ if(typeof dojo != "undefined"){
// * class selectors (e.g., `.foo`)
// * node type selectors like `span`
// * ` ` descendant selectors
- // * `>` child element selectors
+ // * `>` child element selectors
// * `#foo` style ID selectors
// * `*` universal selector
- // * `~`, the immediately preceeded-by sibling selector
- // * `+`, the preceeded-by sibling selector
+ // * `~`, the preceded-by sibling selector
+ // * `+`, the immediately preceded-by sibling selector
// * attribute queries:
// | * `[foo]` attribute presence selector
// | * `[foo='bar']` attribute value exact match
@@ -1356,14 +1351,14 @@ if(typeof dojo != "undefined"){
// 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 resaonable for a programmatic node querying engine to
+ // 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:
@@ -1372,10 +1367,10 @@ if(typeof dojo != "undefined"){
// | * `: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
@@ -1485,12 +1480,12 @@ if(typeof dojo != "undefined"){
// 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") ||
+ caseSensitive = (root.contentType && root.contentType=="application/xml") ||
(d.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) ||
- (!!od) &&
+ (!!od) &&
(d.isIE ? od.xml : (root.xmlVersion||od.xmlVersion));
- // NOTE:
+ // 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.
@@ -1507,16 +1502,98 @@ if(typeof dojo != "undefined"){
// FIXME: need to add infrastructure for post-filtering pseudos, ala :last
d.query.pseudos = pseudos;
- // one-off function for filtering a NodeList based on a simple selector
- d._filterQueryResult = function(nodeList, simpleFilter){
- var tmpNodeList = new d._NodeListCtor();
- var filterFunc = getSimpleFilterFunc(getQueryParts(simpleFilter)[0]);
+ // 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;
}
-})(this["queryPortability"]||this["acme"]||dojo);
+};//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());
+ }
+
+})();
/*
*/
diff --git a/lib/dojo/_base/window.js b/lib/dojo/_base/window.js
index 5c6e2e952..143bad610 100644
--- a/lib/dojo/_base/window.js
+++ b/lib/dojo/_base/window.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo._base.window"]){ //_hasResource checks added by buil
dojo._hasResource["dojo._base.window"] = true;
dojo.provide("dojo._base.window");
+
/*=====
dojo.doc = {
// summary:
@@ -34,7 +35,7 @@ dojo.body = function(){
// 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:
@@ -47,9 +48,9 @@ dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocu
dojo.doc = globalDocument;
};
-dojo.withGlobal = function( /*Object*/globalObject,
- /*Function*/callback,
- /*Object?*/thisObject,
+dojo.withGlobal = function( /*Object*/globalObject,
+ /*Function*/callback,
+ /*Object?*/thisObject,
/*Array?*/cbArguments){
// summary:
// Invoke callback with globalObject as dojo.global and
@@ -68,11 +69,11 @@ dojo.withGlobal = function( /*Object*/globalObject,
}finally{
dojo.global = oldGlob;
}
-}
+};
-dojo.withDoc = function( /*DocumentElement*/documentObject,
- /*Function*/callback,
- /*Object?*/thisObject,
+dojo.withDoc = function( /*DocumentElement*/documentObject,
+ /*Function*/callback,
+ /*Object?*/thisObject,
/*Array?*/cbArguments){
// summary:
// Invoke callback with documentObject as dojo.doc.
@@ -103,6 +104,5 @@ dojo.withDoc = function( /*DocumentElement*/documentObject,
dojo.isQuirks = oldQ;
}
};
-
}
diff --git a/lib/dojo/_base/xhr.js b/lib/dojo/_base/xhr.js
index 818f8e418..58f1fdb62 100644
--- a/lib/dojo/_base/xhr.js
+++ b/lib/dojo/_base/xhr.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -13,6 +13,7 @@ dojo.require("dojo._base.json");
dojo.require("dojo._base.lang");
dojo.require("dojo._base.query");
+
(function(){
var _d = dojo, cfg = _d.config;
@@ -53,7 +54,7 @@ dojo.require("dojo._base.query");
var type = (item.type||"").toLowerCase();
if(_in && type && !item.disabled){
if(type == "radio" || type == "checkbox"){
- if(item.checked){ ret = item.value }
+ if(item.checked){ ret = item.value; }
}else if(item.multiple){
ret = [];
_d.query("option", item).forEach(function(opt){
@@ -67,7 +68,7 @@ dojo.require("dojo._base.query");
}
}
return ret; // Object
- }
+ };
dojo.formToObject = function(/*DOMNode||String*/ formNode){
// summary:
@@ -94,7 +95,7 @@ dojo.require("dojo._base.query");
// yields this object structure as the result of a call to
// formToObject():
//
- // | {
+ // | {
// | blah: "blah",
// | multi: [
// | "thud",
@@ -115,7 +116,7 @@ dojo.require("dojo._base.query");
}
});
return ret; // Object
- }
+ };
dojo.objectToQuery = function(/*Object*/ map){
// summary:
@@ -124,7 +125,7 @@ dojo.require("dojo._base.query");
// example:
// this object:
//
- // | {
+ // | {
// | blah: "blah",
// | multi: [
// | "thud",
@@ -133,7 +134,7 @@ dojo.require("dojo._base.query");
// | };
//
// yields the following query string:
- //
+ //
// | "blah=blah&multi=thud&multi=thonk"
// FIXME: need to implement encodeAscii!!
@@ -154,21 +155,21 @@ dojo.require("dojo._base.query");
}
}
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:
@@ -179,7 +180,7 @@ dojo.require("dojo._base.query");
// This string:
//
// | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
- //
+ //
// results in this object structure:
//
// | {
@@ -187,7 +188,7 @@ dojo.require("dojo._base.query");
// | thinger: " spaces =blah",
// | zonk: "blarg"
// | }
- //
+ //
// Note that spaces and other urlencoded entities are correctly
// handled.
@@ -212,7 +213,7 @@ dojo.require("dojo._base.query");
}
});
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
@@ -222,7 +223,7 @@ dojo.require("dojo._base.query");
// MOW: remove dojo._contentHandlers alias in 2.0
var handlers = _d._contentHandlers = dojo.contentHandlers = {
- // summary:
+ // summary:
// A map of availble XHR transport handle types. Name matches the
// `handleAs` attribute passed to XHR calls.
//
@@ -230,41 +231,41 @@ dojo.require("dojo._base.query");
// 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.
- //
+ // 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({
+ // | dojo.xhrGet({
// | url:"foo.txt",
// | handleAs:"makeCaps",
// | 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;
+ 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.
+ "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 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."
@@ -282,7 +283,7 @@ dojo.require("dojo._base.query");
}
return _d.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?
@@ -294,7 +295,7 @@ dojo.require("dojo._base.query");
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 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{
@@ -309,7 +310,7 @@ dojo.require("dojo._base.query");
return result; // DOMDocument
},
"json-comment-optional": function(xhr){
- // summary: A contentHandler which checks the presence of comment-filtered JSON and
+ // 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);
@@ -341,7 +342,7 @@ dojo.require("dojo._base.query");
// handleAs: String?
// Acceptable values depend on the type of IO
// transport (see specific IO calls for more information).
- // rawBody: String?
+ // 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
@@ -486,7 +487,7 @@ dojo.require("dojo._base.query");
/*Function*/canceller,
/*Function*/okHandler,
/*Function*/errHandler){
- // summary:
+ // summary:
// sets up the Deferred and ioArgs property on the Deferred so it
// can be used in an io call.
// args:
@@ -502,19 +503,19 @@ dojo.require("dojo._base.query");
// 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
+ // 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){
+ if(args.form){
var form = _d.byId(args.form);
- //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
+ //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);
+ ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null);
formObject = _d.formToObject(form);
}
@@ -587,7 +588,7 @@ dojo.require("dojo._base.query");
// 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.
@@ -604,13 +605,13 @@ dojo.require("dojo._base.query");
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.
@@ -618,7 +619,7 @@ dojo.require("dojo._base.query");
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.
@@ -642,7 +643,7 @@ dojo.require("dojo._base.query");
};
var _watchInFlight = function(){
- //summary:
+ //summary:
// internal method that checks each inflight XMLHttpRequest to see
// if it has completed or if the timeout situation applies.
@@ -657,7 +658,7 @@ dojo.require("dojo._base.query");
var dfd = tif.dfd;
var func = function(){
if(!dfd || dfd.canceled || !tif.validCheck(dfd)){
- _inFlight.splice(i--, 1);
+ _inFlight.splice(i--, 1);
_pubCount -= 1;
}else if(tif.ioCheck(dfd)){
_inFlight.splice(i--, 1);
@@ -695,7 +696,7 @@ dojo.require("dojo._base.query");
_inFlightIntvl = null;
return;
}
- }
+ };
dojo._ioCancelAll = function(){
//summary: Cancels all pending IO requests, regardless of IO type
@@ -707,7 +708,7 @@ dojo.require("dojo._base.query");
}catch(e){/*squelch*/}
});
}catch(e){/*squelch*/}
- }
+ };
//Automatically call cancel all io calls on unload
//in IE for trac issue #2357.
@@ -730,10 +731,10 @@ dojo.require("dojo._base.query");
_pubCount += 1;
_d.publish("/dojo/io/send", [dfd]);
}
- }
+ };
_d._ioWatch = function(dfd, validCheck, ioCheck, resHandle){
- // summary:
+ // summary:
// Watches the io request represented by dfd to see if it completes.
// dfd: Deferred
// The Deferred object to watch.
@@ -763,16 +764,16 @@ dojo.require("dojo._base.query");
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)){
@@ -783,7 +784,7 @@ dojo.require("dojo._base.query");
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.
@@ -791,8 +792,8 @@ dojo.require("dojo._base.query");
if(ioArgs.query.length){
ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query;
ioArgs.query = null;
- }
- }
+ }
+ };
/*=====
dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, {
@@ -893,13 +894,13 @@ dojo.require("dojo._base.query");
_d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle);
xhr = null;
return dfd; // dojo.Deferred
- }
+ };
dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){
- // summary:
+ // 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:
@@ -908,7 +909,7 @@ dojo.require("dojo._base.query");
// 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:
@@ -917,13 +918,13 @@ dojo.require("dojo._base.query");
// 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){
diff --git a/lib/dojo/_firebug/firebug.js b/lib/dojo/_firebug/firebug.js
index d1f112f69..c78b50fa6 100644
--- a/lib/dojo/_firebug/firebug.js
+++ b/lib/dojo/_firebug/firebug.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,13 +8,14 @@
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:
+ // summary:
// Log a debug message to indicate that a behavior has been
// deprecated.
// extra: Text to append to the message.
- // removal:
+ // removal:
// Text to indicate when in the future the behavior will be removed.
var message = "DEPRECATED: " + behaviour;
if(extra){ message += " " + extra; }
@@ -24,16 +25,16 @@ dojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/
dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
// summary: Marks code as experimental.
- // description:
+ // 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:
+ // moduleName:
// The name of a module, or the name of a module file or a specific
// function
- // extra:
+ // extra:
// some additional message for the user
// example:
// | dojo.experimental("dojo.data.Result");
@@ -49,10 +50,10 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
// description:
// Opens a console for logging, debugging, and error messages.
// Contains partial functionality to Firebug. See function list below.
- // NOTE:
+ // 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
+ // 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:
@@ -80,13 +81,13 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
var calls = ["log", "info", "debug", "warn", "error"];
for(var i=0;i<calls.length;i++){
var m = calls[i];
- var n = "_"+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.
@@ -96,8 +97,8 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
if(
!dojo.isFF && // Firefox has Firebug
- (!dojo.isChrome || dojo.isChrome < 3) &&
- (!dojo.isSafari || dojo.isSafari < 4) && // Safari 4 has a console
+ !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
@@ -108,17 +109,17 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
// don't build firebug in iframes
try{
- if(window != window.parent){
+ 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;
+ return;
}
}catch(e){/*squelch*/}
// ***************************************************************************
- // Placing these variables before the functions that use them to avoid a
+ // 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
@@ -155,38 +156,38 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
window.console = {
_connects: [],
log: function(){
- // summary:
+ // summary:
// Sends arguments to console.
logFormatted(arguments, "");
},
debug: function(){
- // summary:
+ // summary:
// Sends arguments to console. Missing finctionality to show script line of trace.
logFormatted(arguments, "debug");
},
info: function(){
- // summary:
+ // summary:
// Sends arguments to console, highlighted with (I) icon.
logFormatted(arguments, "info");
},
warn: function(){
- // summary:
+ // summary:
// Sends warning arguments to console, highlighted with (!) icon and blue style.
logFormatted(arguments, "warning");
},
error: function(){
- // summary:
+ // 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:
+ // summary:
// Tests for true. Throws exception if false.
if(!truth){
var args = [];
@@ -207,7 +208,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
},
dirxml: function(node){
- // summary:
+ // summary:
//
var html = [];
appendNode(node, html);
@@ -215,20 +216,20 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
},
group: function(){
- // summary:
- // collects log messages into a group, starting with this call and ending with
+ // 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:
+ // summary:
// Closes group. See above
logRow(arguments, "", popGroup);
},
time: function(name){
- // summary:
+ // summary:
// Starts timers assigned to name given in argument. Timer stops and displays on timeEnd(title);
// example:
// | console.time("load");
@@ -239,7 +240,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
},
timeEnd: function(name){
- // summary:
+ // summary:
// See above.
if(name in timeMap){
var delta = (new Date()).getTime() - timeMap[name];
@@ -249,7 +250,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
},
count: function(name){
- // summary:
+ // summary:
// Not supported
if(!countMap[name]) countMap[name] = 0;
countMap[name]++;
@@ -264,20 +265,20 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
var func = f.toString();
var args=[];
for (var a = 0; a < f.arguments.length; a++) {
- args.push(f.arguments[a])
+ args.push(f.arguments[a]);
}
if(f.arguments.length){
- console.dir({"function":func, "arguments":args});
+ console.dir({"function":func, "arguments":args});
}else{
console.dir({"function":func});
}
f = f.caller;
- }
+ }
},
profile: function(){
- // summary:
+ // summary:
// Not supported
this.warn(["profile() not supported."]);
},
@@ -285,24 +286,24 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
profileEnd: function(){ },
clear: function(){
- // summary:
+ // summary:
// Clears message console. Do not call this directly
if(consoleBody){
while(consoleBody.childNodes.length){
- dojo.destroy(consoleBody.firstChild);
+ dojo.destroy(consoleBody.firstChild);
}
}
dojo.forEach(this._connects,dojo.disconnect);
},
- open: function(){
- // summary:
+ open: function(){
+ // summary:
// Opens message console. Do not call this directly
- toggleConsole(true);
+ toggleConsole(true);
},
close: function(){
- // summary:
+ // summary:
// Closes message console. Do not call this directly
if(frameVisible){
toggleConsole();
@@ -343,7 +344,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
setTimeout(function(){
_inspectionClickConnection = dojo.connect(document, "click", function(evt){
document.body.style.cursor = "";
- _inspectionEnabled = !_inspectionEnabled;
+ _inspectionEnabled = !_inspectionEnabled;
dojo.disconnect(_inspectionClickConnection);
// console._restoreBorder();
});
@@ -357,7 +358,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
console._restoreBorder();
},
openConsole:function(){
- // summary:
+ // summary:
// Closes object inspector and opens message console. Do not call this directly
consoleBody.style.display = "block";
consoleDomInspector.style.display = "none";
@@ -383,7 +384,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
}
}
}
- }
+ };
// ***************************************************************************
@@ -448,7 +449,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
}
- window.onFirebugResize = function(){
+ window.onFirebugResize = function(){
//resize the height of the console log body
layout(getViewport().h);
@@ -520,12 +521,12 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
}
consoleFrame.className += " firebug";
consoleFrame.style.height = containerHeight;
- consoleFrame.style.display = (frameVisible ? "block" : "none");
+ 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 =
+ consoleFrame.innerHTML =
'<div id="firebugToolbar">'
+ ' <ul id="fireBugTabs" class="tabs">'
@@ -598,8 +599,8 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
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" :
+ var height = h ?
+ h - (tHeight + commandLine.offsetHeight +25 + (h*.01)) + "px" :
(consoleFrame.offsetHeight - tHeight - commandLine.offsetHeight) + "px";
consoleBody.style.top = tHeight + "px";
@@ -610,7 +611,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
consoleDomInspector.style.top = tHeight + "px";
commandLine.style.bottom = 0;
- dojo.addOnWindowUnload(clearFrame)
+ dojo.addOnWindowUnload(clearFrame);
}
function logRow(message, className, handler){
@@ -755,7 +756,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
function parseFormat(format){
var parts = [];
- var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
+ 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)){
@@ -900,7 +901,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
appendNode(child, html);
}
- html.push('</div><div class="objectBox-element">&lt;/<span class="nodeTag">',
+ html.push('</div><div class="objectBox-element">&lt;/<span class="nodeTag">',
node.nodeName.toLowerCase(), '&gt;</span></div>');
}else{
html.push('/&gt;</div>');
@@ -933,7 +934,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
if(document.all){
event.cancelBubble = true;
}else{
- event.stopPropagation();
+ event.stopPropagation();
}
}
@@ -942,7 +943,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1);
var html = [
- '<span class="errorMessage">', msg, '</span>',
+ '<span class="errorMessage">', msg, '</span>',
'<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>'
];
@@ -965,7 +966,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
toggleConsole();
}else if(
(ekc == keys.NUMPAD_ENTER || ekc == 76) &&
- event.shiftKey &&
+ event.shiftKey &&
(event.metaKey || event.ctrlKey)
){
focusCommandLine();
@@ -1072,7 +1073,7 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
function objectLength(o){
var cnt = 0;
for(var nm in o){
- cnt++
+ cnt++;
}
return cnt;
}
@@ -1222,5 +1223,4 @@ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
})();
-
}
diff --git a/lib/dojo/back.js b/lib/dojo/back.js
index 5e2998c97..0bb4817b4 100644
--- a/lib/dojo/back.js
+++ b/lib/dojo/back.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.back"]){ //_hasResource checks added by build. Do no
dojo._hasResource["dojo.back"] = true;
dojo.provide("dojo.back");
+dojo.getObject("back", true, dojo);
+
/*=====
dojo.back = {
// summary: Browser history management resources
@@ -16,29 +18,23 @@ dojo.back = {
=====*/
-(function(){
- var back = dojo.back;
+(function(){
+ var back = dojo.back,
// everyone deals with encoding the hash slightly differently
- function getHash(){
+ getHash= back.getHash= function(){
var h = window.location.hash;
if(h.charAt(0) == "#"){ h = h.substring(1); }
- return dojo.isMozilla ? h : decodeURIComponent(h);
- }
+ return dojo.isMozilla ? h : decodeURIComponent(h);
+ },
- function setHash(h){
+ setHash= back.setHash= function(h){
if(!h){ h = ""; }
window.location.hash = encodeURIComponent(h);
historyCounter = history.length;
- }
-
- // if we're in the test for these methods, expose them on dojo.back. ok'd with alex.
- if(dojo.exists("tests.back-hash")){
- back.getHash = getHash;
- back.setHash = setHash;
- }
-
+ };
+
var initialHref = (typeof(window) !== "undefined") ? window.location.href : "";
var initialHash = (typeof(window) !== "undefined") ? getHash() : "";
var initialState = null;
@@ -150,18 +146,11 @@ dojo.back = {
return;
}
}
-
- if(dojo.isSafari && dojo.isSafari < 3){
- var hisLen = history.length;
- if(hisLen > historyCounter) handleForwardButton();
- else if(hisLen < historyCounter) handleBackButton();
- historyCounter = hisLen;
- }
}
};
back.init = function(){
- //summary: Initializes the undo stack. This must be called from a <script>
+ //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
@@ -179,7 +168,7 @@ dojo.back = {
};
back.setInitialState = function(/*Object*/args){
- //summary:
+ //summary:
// Sets the state object and back callback for the very first page
// that is loaded.
//description:
@@ -213,14 +202,14 @@ dojo.back = {
=====*/
back.addToHistory = function(/*dojo.__backArgs*/ args){
- // summary:
- // adds a state object (args) to the history list.
+ // 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
@@ -247,7 +236,7 @@ dojo.back = {
// | });
// BROWSER NOTES:
- // Safari 1.2:
+ // 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.
@@ -261,10 +250,10 @@ dojo.back = {
// 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
+ // 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
@@ -276,7 +265,7 @@ dojo.back = {
//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 = [];
+ forwardStack = [];
var hash = null;
var url = null;
@@ -310,9 +299,9 @@ dojo.back = {
}
changingUrl = true;
- setTimeout(function() {
- setHash(hash);
- changingUrl = false;
+ setTimeout(function() {
+ setHash(hash);
+ changingUrl = false;
}, 1);
bookmarkAnchor.href = hash;
@@ -380,10 +369,10 @@ dojo.back = {
};
back._iframeLoaded = function(evt, ifrLoc){
- //summary:
+ //summary:
// private method. Do not call this directly.
var query = getUrlQuery(ifrLoc.href);
- if(query == null){
+ if(query == null){
// alert("iframeLoaded");
// we hit the end of the history, so we should go back
if(historyStack.length == 1){
diff --git a/lib/dojo/behavior.js b/lib/dojo/behavior.js
index 15f1f23a3..8b058892f 100644
--- a/lib/dojo/behavior.js
+++ b/lib/dojo/behavior.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,23 +9,24 @@ if(!dojo._hasResource["dojo.behavior"]){ //_hasResource checks added by build. D
dojo._hasResource["dojo.behavior"] = true;
dojo.provide("dojo.behavior");
+
dojo.behavior = new function(){
- // summary:
+ // 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,
+ //
+ // 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
+ //
+ // 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.
- //
+ // matching only new nodes found since .apply() was last called.
+ //
function arrIn(obj, name){
if(!obj[name]){ obj[name] = []; }
return obj[name];
@@ -51,7 +52,7 @@ dojo.behavior = new function(){
this.add = function(/* Object */behaviorObj){
// summary:
// Add the specified behavior to the list of behaviors, ignoring existing
- // matches.
+ // matches.
//
// description:
// Add the specified behavior to the list of behaviors which will
@@ -59,26 +60,26 @@ dojo.behavior = new function(){
// 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
+ //
+ // 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
+ // 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
+ // 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({
@@ -95,7 +96,7 @@ dojo.behavior = new function(){
// | }
// | });
//
- // example:
+ // example:
// If property is a string, a dojo.publish will be issued on the channel:
//
// | dojo.behavior.add({
@@ -106,15 +107,15 @@ dojo.behavior = new function(){
// | }
// | });
// | dojo.subscribe("/got/newAnchor", function(node){
- // | // handle node finding when dojo.behavior.apply() is called,
+ // | // 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
+ // Scoping can be accomplished by passing an object as a property to
// a connection handle (on*):
- //
- // | dojo.behavior.add({
+ //
+ // | dojo.behavior.add({
// | "#id": {
// | // like calling dojo.hitch(foo,"bar"). execute foo.bar() in scope of foo
// | "onmouseenter": { targetObj: foo, targetFunc: "bar" },
@@ -122,7 +123,7 @@ dojo.behavior = new function(){
// | }
// | });
//
- // example:
+ // example:
// Bahaviors match on CSS3 Selectors, powered by dojo.query. Example selectors:
//
// | dojo.behavior.add({
@@ -130,31 +131,31 @@ dojo.behavior = new function(){
// | "#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){
@@ -171,7 +172,7 @@ dojo.behavior = new function(){
arrIn(cversion, ruleName).push(rule);
});
});
- }
+ };
var _applyToNode = function(node, action, ruleSetName){
if(dojo.isString(action)){
@@ -189,33 +190,33 @@ dojo.behavior = new function(){
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.
- //
+ // 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
+ // 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
+ //
+ // 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
+ // nodes that match existing behaviors when those nodes are added to
// the DOM.
- //
+ //
forIn(this._behaviors, function(tBehavior, id){
- dojo.query(id).forEach(
+ dojo.query(id).forEach(
function(elem){
var runFrom = 0;
var bid = "_dj_behavior_"+tBehavior.id;
@@ -242,8 +243,8 @@ dojo.behavior = new function(){
}
);
});
- }
-}
+ };
+};
dojo.addOnLoad(dojo.behavior, "apply");
diff --git a/lib/dojo/build.txt b/lib/dojo/build.txt
index bc58b776f..6f15de0c4 100644
--- a/lib/dojo/build.txt
+++ b/lib/dojo/build.txt
@@ -12,7 +12,6 @@ dojo.js:
./../../release/dojo/_base/Deferred.js
./../../release/dojo/_base/json.js
./../../release/dojo/_base/Color.js
-./../../release/dojo/_base.js
./../../release/dojo/_base/window.js
./../../release/dojo/_base/event.js
./../../release/dojo/_base/html.js
@@ -21,6 +20,7 @@ dojo.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:
@@ -39,6 +39,8 @@ tt-rss-layer.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
@@ -65,6 +67,7 @@ tt-rss-layer.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
@@ -112,10 +115,10 @@ tt-rss-layer.js:
./../../release/dojo/DeferredList.js
./../../release/dijit/tree/TreeStoreModel.js
./../../release/dijit/tree/ForestStoreModel.js
-./../../release/dijit/Tree.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
diff --git a/lib/dojo/cache.js b/lib/dojo/cache.js
index da237c767..887a7f2e5 100644
--- a/lib/dojo/cache.js
+++ b/lib/dojo/cache.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,14 +9,14 @@ if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do n
dojo._hasResource["dojo.cache"] = true;
dojo.provide("dojo.cache");
+
/*=====
-dojo.cache = {
+dojo.cache = {
// summary:
// A way to cache string content that is fetchable via `dojo.moduleUrl`.
};
=====*/
-(function(){
var cache = {};
dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
// summary:
@@ -55,7 +55,7 @@ dojo.cache = {
// | 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
+ // (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
@@ -105,7 +105,7 @@ dojo.cache = {
};
dojo.cache._sanitize = function(/*String*/val){
- // summary:
+ // 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.
@@ -122,6 +122,5 @@ dojo.cache = {
}
return val; //String
};
-})();
}
diff --git a/lib/dojo/cldr/monetary.js b/lib/dojo/cldr/monetary.js
index 0380055c4..498e437ab 100644
--- a/lib/dojo/cldr/monetary.js
+++ b/lib/dojo/cldr/monetary.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.cldr.monetary"]){ //_hasResource checks added by bui
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
diff --git a/lib/dojo/cldr/nls/ar/buddhist.js b/lib/dojo/cldr/nls/ar/buddhist.js
new file mode 100644
index 000000000..68708e9af
--- /dev/null
+++ b/lib/dojo/cldr/nls/ar/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/ar/gregorian.js b/lib/dojo/cldr/nls/ar/gregorian.js
index c25f80231..a3d0e9ddd 100644
--- a/lib/dojo/cldr/nls/ar/gregorian.js
+++ b/lib/dojo/cldr/nls/ar/gregorian.js
@@ -1 +1 @@
-({"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-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
+({"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
diff --git a/lib/dojo/cldr/nls/ar/number.js b/lib/dojo/cldr/nls/ar/number.js
index 543ccb3e1..e9a48164a 100644
--- a/lib/dojo/cldr/nls/ar/number.js
+++ b/lib/dojo/cldr/nls/ar/number.js
@@ -1 +1 @@
-({"group":"٬","percentSign":"٪","exponential":"اس","list":"؛","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":"٫","nan":"ليس رقم","nativeZeroDigit":"٠","perMille":"؉","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/ca/number.js b/lib/dojo/cldr/nls/ca/number.js
index da4300c27..4f0befd38 100644
--- a/lib/dojo/cldr/nls/ca/number.js
+++ b/lib/dojo/cldr/nls/ca/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/cs/gregorian.js b/lib/dojo/cldr/nls/cs/gregorian.js
index 3b9752ce9..d7abc9b5e 100644
--- a/lib/dojo/cldr/nls/cs/gregorian.js
+++ b/lib/dojo/cldr/nls/cs/gregorian.js
@@ -1 +1 @@
-({"dayPeriods-format-wide-pm":"odp.","eraNames":["př.Kr.","po Kr."],"field-day-relative+-1":"Včera","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","months-standAlone-abbr":["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],"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ří","dateFormat-long":"d. MMMM y","timeFormat-medium":"H:mm:ss","dateFormatItem-Hm":"H:mm","dateFormat-medium":"d.M.yyyy","dateFormatItem-Hms":"H:mm:ss","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"],"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"],"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","dateFormat-full":"EEEE, d. MMMM y","months-format-wide":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"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","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-era":"Era","dateFormatItem-yM":"y-M","field-year":"Year","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-M":"L","field-minute":"Minute","field-dayperiod":"Dayperiod","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}","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","dateFormatItem-yMMMEd":"EEE, y MMM d","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
+({"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
diff --git a/lib/dojo/cldr/nls/cs/number.js b/lib/dojo/cldr/nls/cs/number.js
index f9a71abd6..9dcfdd4d9 100644
--- a/lib/dojo/cldr/nls/cs/number.js
+++ b/lib/dojo/cldr/nls/cs/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/da/buddhist.js b/lib/dojo/cldr/nls/da/buddhist.js
new file mode 100644
index 000000000..d6d4ca3a7
--- /dev/null
+++ b/lib/dojo/cldr/nls/da/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/da/gregorian.js b/lib/dojo/cldr/nls/da/gregorian.js
index 08e431184..1dffad552 100644
--- a/lib/dojo/cldr/nls/da/gregorian.js
+++ b/lib/dojo/cldr/nls/da/gregorian.js
@@ -1 +1 @@
-({"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","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
+({"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
diff --git a/lib/dojo/cldr/nls/da/islamic.js b/lib/dojo/cldr/nls/da/islamic.js
new file mode 100644
index 000000000..a6bda975d
--- /dev/null
+++ b/lib/dojo/cldr/nls/da/islamic.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/da/number.js b/lib/dojo/cldr/nls/da/number.js
index 2f5fc8e30..a0aa79acc 100644
--- a/lib/dojo/cldr/nls/da/number.js
+++ b/lib/dojo/cldr/nls/da/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/de/buddhist.js b/lib/dojo/cldr/nls/de/buddhist.js
new file mode 100644
index 000000000..c1dc677bc
--- /dev/null
+++ b/lib/dojo/cldr/nls/de/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/de/gregorian.js b/lib/dojo/cldr/nls/de/gregorian.js
index 0a2720a81..4a1395dd5 100644
--- a/lib/dojo/cldr/nls/de/gregorian.js
+++ b/lib/dojo/cldr/nls/de/gregorian.js
@@ -1 +1 @@
-({"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","dateFormatItem-EEEd":"d. EEE","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","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}","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
+({"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
diff --git a/lib/dojo/cldr/nls/de/islamic.js b/lib/dojo/cldr/nls/de/islamic.js
new file mode 100644
index 000000000..1f3b7a879
--- /dev/null
+++ b/lib/dojo/cldr/nls/de/islamic.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/de/number.js b/lib/dojo/cldr/nls/de/number.js
index 90861a091..5fbf57bf2 100644
--- a/lib/dojo/cldr/nls/de/number.js
+++ b/lib/dojo/cldr/nls/de/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/el/buddhist.js b/lib/dojo/cldr/nls/el/buddhist.js
new file mode 100644
index 000000000..4715b4650
--- /dev/null
+++ b/lib/dojo/cldr/nls/el/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/el/gregorian.js b/lib/dojo/cldr/nls/el/gregorian.js
index 047e5d54d..87644f661 100644
--- a/lib/dojo/cldr/nls/el/gregorian.js
+++ b/lib/dojo/cldr/nls/el/gregorian.js
@@ -1 +1 @@
-({"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":"MMM y","dateFormatItem-yQ":"y Q","dateFormatItem-yyyyMMMM":"MMMM 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":"MMM 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","dateFormatItem-yMMMM":"LLLL y","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
+({"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
diff --git a/lib/dojo/cldr/nls/el/hebrew.js b/lib/dojo/cldr/nls/el/hebrew.js
new file mode 100644
index 000000000..840b1d154
--- /dev/null
+++ b/lib/dojo/cldr/nls/el/hebrew.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/el/number.js b/lib/dojo/cldr/nls/el/number.js
index ff419fb45..75198a1d8 100644
--- a/lib/dojo/cldr/nls/el/number.js
+++ b/lib/dojo/cldr/nls/el/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","decimalFormat":"#,##0.###","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/en-au/currency.js b/lib/dojo/cldr/nls/en-au/currency.js
index 94324942e..aad096762 100644
--- a/lib/dojo/cldr/nls/en-au/currency.js
+++ b/lib/dojo/cldr/nls/en-au/currency.js
@@ -1 +1 @@
-({"AUD_symbol":"$","USD_symbol":"US$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","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
+({"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
diff --git a/lib/dojo/cldr/nls/en-au/number.js b/lib/dojo/cldr/nls/en-au/number.js
index 748ea804a..70e56f471 100644
--- a/lib/dojo/cldr/nls/en-au/number.js
+++ b/lib/dojo/cldr/nls/en-au/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/en-ca/currency.js b/lib/dojo/cldr/nls/en-ca/currency.js
index 4e950ec5b..a0a0b2446 100644
--- a/lib/dojo/cldr/nls/en-ca/currency.js
+++ b/lib/dojo/cldr/nls/en-ca/currency.js
@@ -1 +1 @@
-({"CAD_symbol":"$","USD_symbol":"US$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","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
+({"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
diff --git a/lib/dojo/cldr/nls/en-gb/buddhist.js b/lib/dojo/cldr/nls/en-gb/buddhist.js
new file mode 100644
index 000000000..9e4575c4f
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-gb/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/en-gb/islamic.js b/lib/dojo/cldr/nls/en-gb/islamic.js
new file mode 100644
index 000000000..8774cbb03
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-gb/islamic.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/en-gb/number.js b/lib/dojo/cldr/nls/en-gb/number.js
index 748ea804a..70e56f471 100644
--- a/lib/dojo/cldr/nls/en-gb/number.js
+++ b/lib/dojo/cldr/nls/en-gb/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/en/buddhist.js b/lib/dojo/cldr/nls/en/buddhist.js
new file mode 100644
index 000000000..2e3ea93fc
--- /dev/null
+++ b/lib/dojo/cldr/nls/en/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/en/currency.js b/lib/dojo/cldr/nls/en/currency.js
index e9729d96a..4f780c154 100644
--- a/lib/dojo/cldr/nls/en/currency.js
+++ b/lib/dojo/cldr/nls/en/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","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
+({"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
diff --git a/lib/dojo/cldr/nls/en/islamic.js b/lib/dojo/cldr/nls/en/islamic.js
new file mode 100644
index 000000000..5d8f34bd8
--- /dev/null
+++ b/lib/dojo/cldr/nls/en/islamic.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/en/number.js b/lib/dojo/cldr/nls/en/number.js
index 92b2e32bf..9c2a23153 100644
--- a/lib/dojo/cldr/nls/en/number.js
+++ b/lib/dojo/cldr/nls/en/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/es/buddhist.js b/lib/dojo/cldr/nls/es/buddhist.js
new file mode 100644
index 000000000..eadddb3e7
--- /dev/null
+++ b/lib/dojo/cldr/nls/es/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/es/islamic.js b/lib/dojo/cldr/nls/es/islamic.js
new file mode 100644
index 000000000..906accde0
--- /dev/null
+++ b/lib/dojo/cldr/nls/es/islamic.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/es/number.js b/lib/dojo/cldr/nls/es/number.js
index be433d85a..4a31948c4 100644
--- a/lib/dojo/cldr/nls/es/number.js
+++ b/lib/dojo/cldr/nls/es/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/fi/buddhist.js b/lib/dojo/cldr/nls/fi/buddhist.js
new file mode 100644
index 000000000..2598108a3
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/fi/gregorian.js b/lib/dojo/cldr/nls/fi/gregorian.js
index db2ffc7c1..c9ca4b9b3 100644
--- a/lib/dojo/cldr/nls/fi/gregorian.js
+++ b/lib/dojo/cldr/nls/fi/gregorian.js
@@ -1 +1 @@
-({"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"],"dateFormatItem-EEEd":"EEE d.","dayPeriods-format-wide-pm":"ip.","dateFormat-full":"EEEE 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","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}","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
+({"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
diff --git a/lib/dojo/cldr/nls/fi/hebrew.js b/lib/dojo/cldr/nls/fi/hebrew.js
new file mode 100644
index 000000000..77443f061
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/hebrew.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/fi/islamic.js b/lib/dojo/cldr/nls/fi/islamic.js
new file mode 100644
index 000000000..33eff8f87
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/islamic.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/fi/number.js b/lib/dojo/cldr/nls/fi/number.js
index aa0fee6ef..1713de48a 100644
--- a/lib/dojo/cldr/nls/fi/number.js
+++ b/lib/dojo/cldr/nls/fi/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/fr-ch/gregorian.js b/lib/dojo/cldr/nls/fr-ch/gregorian.js
new file mode 100644
index 000000000..9c5c08432
--- /dev/null
+++ b/lib/dojo/cldr/nls/fr-ch/gregorian.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/fr-ch/number.js b/lib/dojo/cldr/nls/fr-ch/number.js
new file mode 100644
index 000000000..8d9a79e56
--- /dev/null
+++ b/lib/dojo/cldr/nls/fr-ch/number.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/fr/gregorian.js b/lib/dojo/cldr/nls/fr/gregorian.js
index 052b03393..0d0983d49 100644
--- a/lib/dojo/cldr/nls/fr/gregorian.js
+++ b/lib/dojo/cldr/nls/fr/gregorian.js
@@ -1 +1 @@
-({"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"],"dateFormatItem-EEEd":"d EEE","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","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}","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
+({"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
diff --git a/lib/dojo/cldr/nls/fr/number.js b/lib/dojo/cldr/nls/fr/number.js
index f9a71abd6..9dcfdd4d9 100644
--- a/lib/dojo/cldr/nls/fr/number.js
+++ b/lib/dojo/cldr/nls/fr/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/he/number.js b/lib/dojo/cldr/nls/he/number.js
index 23e6fa4e2..565c899fe 100644
--- a/lib/dojo/cldr/nls/he/number.js
+++ b/lib/dojo/cldr/nls/he/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/hu/gregorian.js b/lib/dojo/cldr/nls/hu/gregorian.js
index 0418bd716..a8cc39a09 100644
--- a/lib/dojo/cldr/nls/hu/gregorian.js
+++ b/lib/dojo/cldr/nls/hu/gregorian.js
@@ -1 +1 @@
-({"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"],"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."],"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.","dateFormat-full":"y. MMMM d., EEEE","dateFormatItem-Md":"M. d.","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","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","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})","dateFormatItem-yMMMEd":"EEE, y MMM d","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
+({"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
diff --git a/lib/dojo/cldr/nls/hu/number.js b/lib/dojo/cldr/nls/hu/number.js
index 472a2c86d..8ce153f8a 100644
--- a/lib/dojo/cldr/nls/hu/number.js
+++ b/lib/dojo/cldr/nls/hu/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/it/gregorian.js b/lib/dojo/cldr/nls/it/gregorian.js
index dbd7207e2..118b60b45 100644
--- a/lib/dojo/cldr/nls/it/gregorian.js
+++ b/lib/dojo/cldr/nls/it/gregorian.js
@@ -1 +1 @@
-({"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","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
+({"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
diff --git a/lib/dojo/cldr/nls/it/number.js b/lib/dojo/cldr/nls/it/number.js
index d878fb383..4fc6202a5 100644
--- a/lib/dojo/cldr/nls/it/number.js
+++ b/lib/dojo/cldr/nls/it/number.js
@@ -1 +1 @@
-({"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤ #,##0.00","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","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
+({"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
diff --git a/lib/dojo/cldr/nls/ja/gregorian.js b/lib/dojo/cldr/nls/ja/gregorian.js
index 412613187..faea6fc9b 100644
--- a/lib/dojo/cldr/nls/ja/gregorian.js
+++ b/lib/dojo/cldr/nls/ja/gregorian.js
@@ -1 +1 @@
-({"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":"L","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
+({"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
diff --git a/lib/dojo/cldr/nls/ja/number.js b/lib/dojo/cldr/nls/ja/number.js
index 90d87b946..dbde35c64 100644
--- a/lib/dojo/cldr/nls/ja/number.js
+++ b/lib/dojo/cldr/nls/ja/number.js
@@ -1 +1 @@
-({"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","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
+({"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
diff --git a/lib/dojo/cldr/nls/ko/gregorian.js b/lib/dojo/cldr/nls/ko/gregorian.js
index b10bdbf17..8f52d1c6f 100644
--- a/lib/dojo/cldr/nls/ko/gregorian.js
+++ b/lib/dojo/cldr/nls/ko/gregorian.js
@@ -1 +1 @@
-({"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":"모레","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":"L","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})","dateFormatItem-H":"HH","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
+({"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
diff --git a/lib/dojo/cldr/nls/ko/number.js b/lib/dojo/cldr/nls/ko/number.js
index b155b913d..70be2f666 100644
--- a/lib/dojo/cldr/nls/ko/number.js
+++ b/lib/dojo/cldr/nls/ko/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/nb/gregorian.js b/lib/dojo/cldr/nls/nb/gregorian.js
index 008dd84dd..409a7cc48 100644
--- a/lib/dojo/cldr/nls/nb/gregorian.js
+++ b/lib/dojo/cldr/nls/nb/gregorian.js
@@ -1 +1 @@
-({"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
+({"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
diff --git a/lib/dojo/cldr/nls/nb/number.js b/lib/dojo/cldr/nls/nb/number.js
index 2904b4ba2..058217994 100644
--- a/lib/dojo/cldr/nls/nb/number.js
+++ b/lib/dojo/cldr/nls/nb/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/nl/gregorian.js b/lib/dojo/cldr/nls/nl/gregorian.js
index 32eb4aa0b..9e3ba2c1c 100644
--- a/lib/dojo/cldr/nls/nl/gregorian.js
+++ b/lib/dojo/cldr/nls/nl/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M-y","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"PM","field-minute":"Minuut","eraNames":["Voor Christus","na Christus"],"dateFormatItem-MMMEd":"E d MMM","field-day-relative+-1":"gisteren","field-weekday":"Dag van de week","dateFormatItem-yQQQ":"QQQ y","field-day-relative+-2":"eergisteren","dateFormatItem-MMdd":"dd-MM","field-day-relative+-3":"eereergisteren","days-standAlone-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-era":"Tijdperk","field-hour":"Uur","dayPeriods-format-wide-am":"AM","quarters-standAlone-abbr":["K1","K2","K3","K4"],"dateFormatItem-y":"y","timeFormat-full":"HH:mm:ss zzzz","months-standAlone-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"dateFormatItem-yMMM":"MMM y","field-day-relative+0":"vandaag","field-day-relative+1":"morgen","days-standAlone-narrow":["Z","M","D","W","D","V","Z"],"eraAbbr":["v. Chr.","n. Chr."],"field-day-relative+2":"overmorgen","field-day-relative+3":"overovermorgen","dateFormatItem-yyyyMMMM":"MMMM y","dateFormat-long":"d MMMM y","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d-MM","dateFormat-medium":"d MMM y","dateFormatItem-yyMM":"MM-yy","dateFormatItem-yyMMM":"MMM yy","dateFormatItem-yyQQQQ":"QQQQ yy","quarters-standAlone-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-ms":"mm:ss","field-year":"Jaar","field-week":"Week","months-standAlone-wide":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"dateFormatItem-MMMd":"d-MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"HH:mm:ss z","months-format-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"timeFormat-short":"HH:mm","field-month":"Maand","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["K1","K2","K3","K4"],"days-format-abbr":["zo","ma","di","wo","do","vr","za"],"dateFormatItem-M":"L","days-format-narrow":["Z","M","D","W","D","V","Z"],"field-second":"Seconde","field-day":"Dag","dateFormatItem-MEd":"E d-M","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"days-standAlone-abbr":["zo","ma","di","wo","do","vr","za"],"dateFormat-short":"dd-MM-yy","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":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"dateFormatItem-d":"d","quarters-format-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"days-format-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"eraNarrow":["v. Chr.","n. Chr."],"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
+({"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
diff --git a/lib/dojo/cldr/nls/nl/number.js b/lib/dojo/cldr/nls/nl/number.js
index 6e47a0a58..3edd9e714 100644
--- a/lib/dojo/cldr/nls/nl/number.js
+++ b/lib/dojo/cldr/nls/nl/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/number.js b/lib/dojo/cldr/nls/number.js
index 8f762162f..ee347cd0b 100644
--- a/lib/dojo/cldr/nls/number.js
+++ b/lib/dojo/cldr/nls/number.js
@@ -1 +1 @@
-({"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","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
+({"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
diff --git a/lib/dojo/cldr/nls/pl/gregorian.js b/lib/dojo/cldr/nls/pl/gregorian.js
index 661278f71..ca45fcf4e 100644
--- a/lib/dojo/cldr/nls/pl/gregorian.js
+++ b/lib/dojo/cldr/nls/pl/gregorian.js
@@ -1 +1 @@
-({"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-M-y","dateFormatItem-MMMEd":"d MMM E","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-M","dayPeriods-format-wide-noon":"w południe","field-era":"Era","dateFormatItem-yM":"M-y","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":"dd-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-M","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":"yyyy-MM","dateFormatItem-y":"y","months-standAlone-narrow":["s","l","m","k","m","c","l","s","w","p","l","g"],"dateFormatItem-yyMM":"MM/yy","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","field-week":"Tydzień","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}","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
+({"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
diff --git a/lib/dojo/cldr/nls/pl/number.js b/lib/dojo/cldr/nls/pl/number.js
index ad7c86955..66776161f 100644
--- a/lib/dojo/cldr/nls/pl/number.js
+++ b/lib/dojo/cldr/nls/pl/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/pt-pt/gregorian.js b/lib/dojo/cldr/nls/pt-pt/gregorian.js
index 010820010..ce4e079af 100644
--- a/lib/dojo/cldr/nls/pt-pt/gregorian.js
+++ b/lib/dojo/cldr/nls/pt-pt/gregorian.js
@@ -1 +1 @@
-({"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"],"dayPeriods-standAlone-abbr-pm":"p.m.","dateFormatItem-hm":"h:mm","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","dayPeriods-format-abbr-pm":"p.m.","dateFormatItem-yyQ":"QQQ 'de' yy","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"],"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-yQ":"QQQ 'de' yyyy","dateFormatItem-hms":"h:mm:ss","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-HHmmss":"HH'h'mm'min'ss's'","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","dateFormatItem-Hm":"HH'h'mm","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","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","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","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","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}","dateFormatItem-Hms":"HH:mm:ss"}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/pt-pt/number.js b/lib/dojo/cldr/nls/pt-pt/number.js
index e06fd94c1..3dc20dbe4 100644
--- a/lib/dojo/cldr/nls/pt-pt/number.js
+++ b/lib/dojo/cldr/nls/pt-pt/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/pt/number.js b/lib/dojo/cldr/nls/pt/number.js
index f10fcfa2f..8323386bb 100644
--- a/lib/dojo/cldr/nls/pt/number.js
+++ b/lib/dojo/cldr/nls/pt/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/ro/buddhist.js b/lib/dojo/cldr/nls/ro/buddhist.js
new file mode 100644
index 000000000..7f27100b5
--- /dev/null
+++ b/lib/dojo/cldr/nls/ro/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/ro/currency.js b/lib/dojo/cldr/nls/ro/currency.js
new file mode 100644
index 000000000..63a82a5ea
--- /dev/null
+++ b/lib/dojo/cldr/nls/ro/currency.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/ro/gregorian.js b/lib/dojo/cldr/nls/ro/gregorian.js
new file mode 100644
index 000000000..a5f14eda5
--- /dev/null
+++ b/lib/dojo/cldr/nls/ro/gregorian.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/ro/number.js b/lib/dojo/cldr/nls/ro/number.js
new file mode 100644
index 000000000..4f0befd38
--- /dev/null
+++ b/lib/dojo/cldr/nls/ro/number.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/ru/gregorian.js b/lib/dojo/cldr/nls/ru/gregorian.js
index 8eadf9d28..7d91ce88e 100644
--- a/lib/dojo/cldr/nls/ru/gregorian.js
+++ b/lib/dojo/cldr/nls/ru/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M.y","field-dayperiod":"AM/PM","field-minute":"Минута","eraNames":["до н.э.","н.э."],"dateFormatItem-MMMEd":"E 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
+({"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
diff --git a/lib/dojo/cldr/nls/ru/number.js b/lib/dojo/cldr/nls/ru/number.js
index 55fbdf8ca..be45af22b 100644
--- a/lib/dojo/cldr/nls/ru/number.js
+++ b/lib/dojo/cldr/nls/ru/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/sk/number.js b/lib/dojo/cldr/nls/sk/number.js
index f4095fdc6..8d495cd0f 100644
--- a/lib/dojo/cldr/nls/sk/number.js
+++ b/lib/dojo/cldr/nls/sk/number.js
@@ -1 +1 @@
-({"currencyFormat":"#,##0.00 ¤","group":" ","decimal":",","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","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
+({"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
diff --git a/lib/dojo/cldr/nls/sl/gregorian.js b/lib/dojo/cldr/nls/sl/gregorian.js
index 15bc1846e..52562be1a 100644
--- a/lib/dojo/cldr/nls/sl/gregorian.js
+++ b/lib/dojo/cldr/nls/sl/gregorian.js
@@ -1 +1 @@
-({"field-dayperiod":"Čas dneva","dayPeriods-format-wide-pm":"pop.","field-minute":"Minuta","eraNames":["pred našim štetjem","naše štetje"],"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"],"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","months-standAlone-wide":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"field-week":"Teden","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","dateFormatItem-MMMMd":"d. MMMM","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["ned","pon","tor","sre","čet","pet","sob"],"dateFormatItem-MMMMdd":"dd. MMMM","dateFormatItem-mmss":"mm:ss","days-format-narrow":["n","p","t","s","č","p","s"],"field-second":"Sekunda","field-day":"Dan","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","dateFormat-full":"EEEE, dd. MMMM y","dateFormatItem-Md":"d. M.","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","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","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-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","dateFormatItem-MMMd":"MMM d","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","dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-yMMMEd":"EEE, y MMM d","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
+({"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
diff --git a/lib/dojo/cldr/nls/sl/number.js b/lib/dojo/cldr/nls/sl/number.js
index cc627888e..2d85e97a1 100644
--- a/lib/dojo/cldr/nls/sl/number.js
+++ b/lib/dojo/cldr/nls/sl/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/sv/gregorian.js b/lib/dojo/cldr/nls/sv/gregorian.js
index b92d4fe93..757dfade2 100644
--- a/lib/dojo/cldr/nls/sv/gregorian.js
+++ b/lib/dojo/cldr/nls/sv/gregorian.js
@@ -1 +1 @@
-({"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":"y MMM","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
+({"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
diff --git a/lib/dojo/cldr/nls/sv/number.js b/lib/dojo/cldr/nls/sv/number.js
index de83eac0d..eedc15d2e 100644
--- a/lib/dojo/cldr/nls/sv/number.js
+++ b/lib/dojo/cldr/nls/sv/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/th/number.js b/lib/dojo/cldr/nls/th/number.js
index 9d4a2504c..393dd6cbd 100644
--- a/lib/dojo/cldr/nls/th/number.js
+++ b/lib/dojo/cldr/nls/th/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/tr/number.js b/lib/dojo/cldr/nls/tr/number.js
index 0be46063b..7a3e4ea80 100644
--- a/lib/dojo/cldr/nls/tr/number.js
+++ b/lib/dojo/cldr/nls/tr/number.js
@@ -1 +1 @@
-({"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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/zh-hant/buddhist.js b/lib/dojo/cldr/nls/zh-hant/buddhist.js
new file mode 100644
index 000000000..5e8a565ad
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/buddhist.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/zh-hant/currency.js b/lib/dojo/cldr/nls/zh-hant/currency.js
new file mode 100644
index 000000000..289e9bb5f
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/currency.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/zh-hant/gregorian.js b/lib/dojo/cldr/nls/zh-hant/gregorian.js
new file mode 100644
index 000000000..a32d30434
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/gregorian.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/zh-hant/islamic.js b/lib/dojo/cldr/nls/zh-hant/islamic.js
new file mode 100644
index 000000000..e46d2179d
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/islamic.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/zh-hant/number.js b/lib/dojo/cldr/nls/zh-hant/number.js
new file mode 100644
index 000000000..159717470
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/number.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/zh-hk/currency.js b/lib/dojo/cldr/nls/zh-hk/currency.js
new file mode 100644
index 000000000..aab119f0a
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hk/currency.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/zh-hk/gregorian.js b/lib/dojo/cldr/nls/zh-hk/gregorian.js
new file mode 100644
index 000000000..fe3a9a00d
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hk/gregorian.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/zh-hk/number.js b/lib/dojo/cldr/nls/zh-hk/number.js
new file mode 100644
index 000000000..159717470
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hk/number.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/cldr/nls/zh-tw/currency.js b/lib/dojo/cldr/nls/zh-tw/currency.js
index a57f458d1..4622f4a29 100644
--- a/lib/dojo/cldr/nls/zh-tw/currency.js
+++ b/lib/dojo/cldr/nls/zh-tw/currency.js
@@ -1 +1 @@
-({"BRE_displayName":"巴西克魯賽羅 (1990-1993)","DEM_displayName":"德國馬克","KGS_symbol":"som","CUP_displayName":"古巴披索","HUF_symbol":"Ft","BDT_symbol":"Tk","LSL_symbol":"M","VEF_symbol":"BsF","MDL_displayName":"摩杜雲列伊","DOP_displayName":"多明尼加披索","MTL_symbol":"Lm","NGN_displayName":"奈及利亞奈拉","KZT_displayName":"卡扎克斯坦坦吉","BGL_symbol":"lev","LTT_displayName":"立陶宛特羅","LAK_displayName":"寮國基普","LKR_displayName":"斯里蘭卡盧布","AOR_displayName":"安哥拉新寬扎 Reajustado (1995-1999)","XEU_displayName":"歐洲貨幣單位 XEU","SYP_symbol":"LS","USS_displayName":"美元 (同一天)","MNT_displayName":"蒙古圖格里克","AMD_symbol":"dram","MOP_displayName":"澳門元","TJR_displayName":"塔吉克斯坦盧布","LUC_displayName":"盧森堡可兌換法郎","LUL_displayName":"盧森堡金融法郎","MRO_symbol":"UM","AON_displayName":"安哥拉新寬扎 (1990-2000)","BEF_displayName":"比利時法郎","IEP_displayName":"愛爾蘭鎊","SBD_displayName":"索羅門群島元","GRD_displayName":"希臘德拉克馬","AZM_displayName":"阿塞拜彊馬特納","MTP_displayName":"馬爾他鎊","UGX_symbol":"U Sh","ARS_symbol":"Arg$","LVR_displayName":"拉脫維亞盧布","GNF_displayName":"幾內亞法郎","GIP_displayName":"直布羅陀鎊","SRG_displayName":"蘇里南盾","BAD_displayName":"波士尼亞-黑塞哥維那第納爾","FJD_displayName":"斐濟元","BAM_displayName":"波士尼亞-黑塞哥維那可轉換馬克","XBB_displayName":"歐洲貨幣單位 XBB","CDF_displayName":"剛果法郎","HRD_displayName":"克羅地亞第納爾","EQE_displayName":"埃奎維勒","BZD_displayName":"伯利茲元","MLF_displayName":"馬里法郎","VEB_symbol":"Be","EGP_displayName":"埃及鎊","MVR_displayName":"馬爾地夫海島盧非亞","KWD_symbol":"KD","TRL_symbol":"TL","ALL_symbol":"lek","SDP_displayName":"蘇丹鎊","NPR_displayName":"尼泊爾盧布","PHP_displayName":"菲律賓披索","DJF_symbol":"DF","WST_displayName":"西薩摩亞塔拉","JPY_displayName":"日圓","TMM_displayName":"土庫曼馬納特","STD_symbol":"Db","BGN_displayName":"保加利亞新列弗","KYD_displayName":"開曼群島美元","VUV_displayName":"萬那杜萬杜","IRR_displayName":"伊朗里亞爾","DJF_displayName":"吉布地法郎","BTN_symbol":"Nu","XDR_displayName":"特殊提款權","ECS_displayName":"厄瓜多蘇克雷","LSM_displayName":"馬洛蒂","MNT_symbol":"Tug","NLG_displayName":"荷蘭盾","MWK_displayName":"馬拉維克瓦查","IRR_symbol":"RI","OMR_symbol":"RO","JMD_symbol":"J$","PES_displayName":"秘魯太陽幣","SRG_symbol":"Sf","LYD_displayName":"利比亞第納爾","BRR_displayName":"巴西克魯賽羅","ETB_symbol":"Br","KMF_symbol":"CF","DKK_symbol":"DKr","XXX_displayName":"XXX","IDR_displayName":"印尼 - 盧布","DZD_symbol":"DA","TZS_symbol":"T Sh","SGD_symbol":"SGD","KGS_displayName":"吉爾吉斯索馬","BRN_displayName":"巴西克如爾達農瓦","AFN_symbol":"Af","ISK_displayName":"冰島克朗","LUF_displayName":"盧森堡法郎","MXN_symbol":"MEX$","GYD_symbol":"G$","TOP_symbol":"T$","SVC_displayName":"薩爾瓦多科郎","ZMK_displayName":"尚比亞克瓦查","TOP_displayName":"東加潘加","ITL_displayName":"義大利里拉","USN_displayName":"美元 (第二天)","KWD_displayName":"科威特第納爾","GEL_symbol":"lari","KMF_displayName":"科摩羅法郎","COP_symbol":"Col$","MYR_displayName":"馬來西亞 - 林吉特","XFU_displayName":"法國 UIC 法郎","GMD_displayName":"甘比亞達拉西","LVL_displayName":"拉脫維亞拉特銀幣","AUD_displayName":"澳幣","XPF_displayName":"CFP 法郎","LBP_displayName":"黎巴嫩鎊","SKK_symbol":"Sk","BYB_displayName":"白俄羅斯新盧布 (1994-1999)","MKD_displayName":"馬其頓第納爾","GWP_displayName":"幾內亞披索披索","CNY_displayName":"人民幣","HNL_symbol":"L","BOB_symbol":"Bs","JOD_displayName":"約旦第納爾","OMR_displayName":"阿曼里奧","BOV_displayName":"玻利維亞幕多","XPT_displayName":"白金","AUD_symbol":"AU$","NOK_displayName":"挪威克羅納","SCR_displayName":"塞舌爾群島盧布","XBA_displayName":"歐洲綜合單位","CSK_displayName":"捷克斯洛伐克硬克朗","PLZ_displayName":"波蘭茲羅提 (1950-1995)","UAK_displayName":"烏克蘭卡本瓦那茲","MGF_displayName":"馬達加斯加法郎","GNS_displayName":"幾內亞西里","YUN_displayName":"南斯拉夫 可轉換第納爾","UYU_symbol":"Ur$","GYD_displayName":"圭亞那元","QAR_displayName":"卡達爾里亞爾","BZD_symbol":"BZ$","JOD_symbol":"JD","ALL_displayName":"阿爾巴尼亞列克","BBD_displayName":"巴貝多元","RON_displayName":"羅馬尼亞列伊","XCD_symbol":"EC$","AMD_displayName":"亞美尼亞德拉姆","CYP_displayName":"賽浦路斯鎊","GBP_symbol":"£","SEK_displayName":"瑞典克羅納","MZN_symbol":"MTn","MMK_displayName":"緬甸元","ZAR_displayName":"南非蘭特","ECV_displayName":"厄瓜多爾由里達瓦康斯坦 (UVC)","LYD_symbol":"LD","VUV_symbol":"VT","AWG_displayName":"阿魯巴盾","CVE_symbol":"CVEsc","STD_displayName":"聖多美島和普林西比島多布拉","CAD_displayName":"加幣","ADP_displayName":"安道爾陪士特","MRO_displayName":"茅利塔尼亞烏吉亞","LSL_displayName":"賴索托羅蒂","TND_displayName":"突尼西亞第納爾","USD_symbol":"$","BMD_symbol":"Ber$","BAM_symbol":"KM","BRC_displayName":"巴西克魯賽羅 (1986-1989)","BMD_displayName":"百慕達幣","BRL_displayName":"巴西里拉","JMD_displayName":"牙買加元","SOS_displayName":"索馬利亞先令","SAR_displayName":"沙烏地里雅","PEI_displayName":"祕魯因蒂","ESP_displayName":"西班牙陪士特","HKD_displayName":"港幣","ESP_symbol":"₧","BWP_displayName":"波札那 - 普拉","TTD_displayName":"千里達及托巴哥元","BSD_displayName":"巴哈馬元","BIF_displayName":"蒲隆地法郎","FRF_displayName":"法國法郎","DKK_displayName":"丹麥克羅納","AED_displayName":"阿拉伯聯合大公國迪爾汗","GHS_symbol":"GH¢","AOK_displayName":"安哥拉寬扎(1977-1990)","ATS_displayName":"奧地利先令","PEN_displayName":"秘魯新太陽幣","CRC_displayName":"哥斯大黎加科郎","PAB_displayName":"巴拿馬巴波亞","CHE_displayName":"WIR 歐元","GQE_displayName":"赤道幾內亞埃奎勒","DZD_displayName":"阿爾及利亞第納爾","EEK_displayName":"愛沙尼亞克朗","YDD_displayName":"葉門第納爾","GHC_displayName":"迦納仙蔕","YER_symbol":"YRl","PLN_symbol":"Zl","NPR_symbol":"Nrs","MXP_displayName":"墨西哥銀披索 (1861-1992)","XAG_displayName":"XAG","XFO_displayName":"法國金法郎","GWE_displayName":"葡屬幾內亞埃斯庫多","BOB_displayName":"玻利維亞貨幣單位","CAD_symbol":"CA$","ZWD_displayName":"辛巴威元","SRD_displayName":"蘇利南元","ZRN_displayName":"薩伊新扎伊爾","XAU_displayName":"黃金","GTQ_symbol":"Q","KRW_symbol":"KRW","BOP_displayName":"玻利維亞披索","LBP_symbol":"LL","XBD_displayName":"歐洲會計單位(XBD)","TZS_displayName":"坦尚尼亞先令","XPF_symbol":"CFPF","TTD_symbol":"TT$","LRD_displayName":"賴比瑞亞元","KRW_displayName":"韓國圜","SHP_displayName":"聖赫勒拿鎊","NAD_symbol":"N$","MZE_displayName":"莫桑比克埃斯庫多","SDD_displayName":"蘇丹第納爾","HRK_displayName":"克羅地亞庫納","FKP_displayName":"福克蘭群島鎊","COP_displayName":"哥倫比亞披索","YUD_displayName":"南斯拉夫第納爾硬幣","YUM_displayName":"南斯拉夫挪威亞第納爾","BYR_symbol":"Rbl","THB_displayName":"泰銖","MGA_displayName":"馬達加斯加艾瑞爾","TWD_displayName":"新臺幣","UGS_displayName":"烏干達先令 (1966-1987)","SBD_symbol":"SI$","ZAL_displayName":"南非 - 蘭特 (金融)","GEL_displayName":"喬治拉里","ILP_displayName":"以色列鎊","MKD_symbol":"MDen","KES_displayName":"肯尼亞先令","CZK_displayName":"捷克克朗","UGX_displayName":"烏干達先令","KZT_symbol":"T","BGL_displayName":"保加利亞硬列弗","ARP_displayName":"阿根廷披索(1983-1985)","BBD_symbol":"BDS$","MYR_symbol":"RM","RUR_displayName":"俄羅斯盧布 (1991-1998)","ERN_displayName":"厄立特里亞納克法","BEF_symbol":"BF","CLF_displayName":"卡林油達佛曼跎","BRB_displayName":"巴西克魯薩多農瓦(1967-1986)","IDR_symbol":"Rp","IEP_symbol":"IR£","BHD_displayName":"巴林第納爾","SYP_displayName":"敘利亞鎊","BIF_symbol":"Fbu","SZL_displayName":"史瓦濟蘭里朗吉尼","INR_displayName":"印度盧布","PTE_displayName":"葡萄牙埃斯庫多","KPW_displayName":"北朝鮮幣","XOF_displayName":"西非法郎 BCEAO","DOP_symbol":"RD$","MXN_displayName":"墨西哥 - 披索","RWF_displayName":"盧安達法郎","ETB_displayName":"衣索比亞比爾","LTL_displayName":"立陶宛里塔","SZL_symbol":"E","QAR_symbol":"QR","SOS_symbol":"Sh.","BND_displayName":"汶萊元","SUR_displayName":"蘇聯盧布","AOA_displayName":"安哥拉寬扎","FJD_symbol":"F$","CVE_displayName":"維德角埃斯庫多","XTS_displayName":"XTS","CLP_displayName":"智利披索","HUF_displayName":"匈牙利 - 福林","LKR_symbol":"SL Re","SCR_symbol":"SR","TJS_displayName":"塔吉克索莫尼","MWK_symbol":"MK","GBP_displayName":"英鎊","TPE_displayName":"帝汶埃斯庫多","GNF_symbol":"GF","SGD_displayName":"新加坡幣","SLL_displayName":"獅子山利昂","MZM_symbol":"Mt","PHP_symbol":"Php","CYP_symbol":"£C","XAF_displayName":"西非法郎 BEAC","MTL_displayName":"馬爾他里拉","KHR_displayName":"柬埔寨瑞爾","ZRZ_displayName":"扎伊爾扎伊爾","KES_symbol":"K Sh","PKR_symbol":"Pra","IQD_symbol":"ID","BEC_displayName":"比利時法郎 (可轉換)","BEL_displayName":"比利時法郎 (金融)","AZN_displayName":"亞塞拜然蒙納特","FIM_displayName":"芬蘭馬克","PKR_displayName":"巴基斯坦盧布","UYP_displayName":"烏拉圭披索 (1975-1993)","ANG_symbol":"NA f.","CHW_displayName":"WIR 法郎","PLN_displayName":"波蘭茲羅提","RON_symbol":"0≤lei|1≤leu|1","BTN_displayName":"不丹那特倫","UAH_displayName":"烏克蘭格里夫那","YER_displayName":"也門里亞爾","UYU_displayName":"烏拉圭披索","CRC_symbol":"C","PGK_displayName":"巴布亞紐幾內亞基那","XBC_displayName":"歐洲會計單位(XBC)","EUR_displayName":"歐元","MUR_displayName":"模里西斯盧布","BYR_displayName":"白俄羅斯盧布","SEK_symbol":"SKr","BHD_symbol":"BD","IQD_displayName":"伊拉克第納爾","VEB_displayName":"委內瑞拉博利瓦","CLP_symbol":"Ch$","MZM_displayName":"莫三比克梅蒂卡爾","NZD_symbol":"$NZ","CHF_symbol":"Fr.","SIT_displayName":"斯洛維尼亞托勒","NOK_symbol":"NKr","XCD_displayName":"格瑞那達元","RUB_displayName":"俄羅斯盧布","BUK_displayName":"緬甸元 BUK","ILS_displayName":"以色列新謝克爾","KHR_symbol":"CR","NAD_displayName":"納米比亞元","HNL_displayName":"洪都拉斯倫皮拉","GTQ_displayName":"瓜地馬拉格查爾","EUR_symbol":"€","NZD_displayName":"紐西蘭幣","ARA_displayName":"阿根廷奧斯特納爾","ARS_displayName":"阿根廷披索","ANG_displayName":"荷屬安地列斯盾","MOP_symbol":"MOP","ZWD_symbol":"Z$","ITL_symbol":"₤","ZAR_symbol":"R","CHF_displayName":"瑞士法郎","USD_displayName":"美元","CNY_symbol":"¥","HKD_symbol":"HK$","JPY_symbol":"JP¥"}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/cldr/nls/zh-tw/gregorian.js b/lib/dojo/cldr/nls/zh-tw/gregorian.js
index 78165cb92..be7dfc659 100644
--- a/lib/dojo/cldr/nls/zh-tw/gregorian.js
+++ b/lib/dojo/cldr/nls/zh-tw/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"yyyy/M","field-minute":"分鐘","eraNames":["西元前","西元"],"field-weekday":"週天","dateFormatItem-MMdd":"MM/dd","field-day-relative+-3":"大前天","field-relative-day":"大後天","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"field-era":"年代","field-hour":"小時","quarters-standAlone-abbr":["第1季","第2季","第3季","第4季"],"timeFormat-full":"zzzzah時mm分ss秒","months-standAlone-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"y年M月","eraAbbr":["西元前","西元"],"field-day-relative+2":"後天","field-day-relative+3":"大後天","timeFormat-medium":"ah:mm:ss","field-zone":"區域","dateFormatItem-yyMM":"yy-MM","dateFormat-medium":"yyyy/M/d","quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"dateFormatItem-yMMMM":"y年M月","dateFormatItem-HHmmss":"H:mm:ss","months-standAlone-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"field-week":"週","dateFormatItem-HHmm":"H:mm","timeFormat-long":"zah時mm分ss秒","dateFormatItem-H":"H時","quarters-format-abbr":["第1季","第2季","第3季","第4季"],"days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"field-second":"秒","dateFormatItem-MEd":"M/d(E)","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"days-standAlone-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormat-short":"yy/M/d","dateFormatItem-yMMMEd":"y年M月d日EEE","dateFormatItem-Md":"M/d","dateFormatItem-yMEd":"yyyy/M/d(EEE)","dateTimeAvailableFormats":["d日(E)","H:mm","H:mm:ss","M-d(E)","MM/dd","M/d","yyyy/M","yyyy/M/d(EEE)","yyyy年M月","yyyy年M月","yyyy/MM","MMMMdd日","MMMd日","MM-dd","M-d","d日","mm:ss","mm:ss","yyyy年","yyyy-M","yyyy年M月d日,E","yyyy年MMM","yyyy年MMMd日EEE","yyyy年MMMM","yyyy年QQQ","y年QQQ","yy-MM","yy年MMM","yy年第Q季度","yyyy年","yyyy年M月","yyyy年MMMM"],"quarters-format-wide":["第1季","第2季","第3季","第4季"],"eraNarrow":["西元前","西元"],"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","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":"明天","dateFormatItem-M":"L","days-standAlone-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-yyMMM":"yy年MMM","dateFormatItem-Hm":"H:mm","field-dayperiod":"上午/下午","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":"中午","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-y":"y年","dateFormatItem-hm":"ah:mm","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
+({"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
diff --git a/lib/dojo/cldr/nls/zh/gregorian.js b/lib/dojo/cldr/nls/zh/gregorian.js
index 4c5993f43..9509b4364 100644
--- a/lib/dojo/cldr/nls/zh/gregorian.js
+++ b/lib/dojo/cldr/nls/zh/gregorian.js
@@ -1 +1 @@
-({"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":"L","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
+({"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
diff --git a/lib/dojo/cldr/nls/zh/number.js b/lib/dojo/cldr/nls/zh/number.js
index 90d87b946..dbde35c64 100644
--- a/lib/dojo/cldr/nls/zh/number.js
+++ b/lib/dojo/cldr/nls/zh/number.js
@@ -1 +1 @@
-({"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","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
+({"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
diff --git a/lib/dojo/cldr/supplemental.js b/lib/dojo/cldr/supplemental.js
index f887e3a99..4ceef4f78 100644
--- a/lib/dojo/cldr/supplemental.js
+++ b/lib/dojo/cldr/supplemental.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,9 +8,10 @@
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:
@@ -20,11 +21,11 @@ dojo.cldr.supplemental.getFirstDayOfWeek = function(/*String?*/locale){
// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/firstDay
var firstDay = {/*default is 1=Monday*/
mv:5,
- 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,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,ie:0,
- il:0,'in':0,is: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,sy:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,
+ 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,
};
@@ -49,7 +50,7 @@ dojo.cldr.supplemental._region = function(/*String?*/locale){
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
diff --git a/lib/dojo/colors.js b/lib/dojo/colors.js
index 1f41dc3c7..dfb8f89e6 100644
--- a/lib/dojo/colors.js
+++ b/lib/dojo/colors.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.colors"]){ //_hasResource checks added by build. Do
dojo._hasResource["dojo.colors"] = true;
dojo.provide("dojo.colors");
+dojo.getObject("colors", true, dojo);
+
//TODO: this module appears to break naming conventions
/*=====
@@ -55,9 +57,9 @@ dojo.colors = {
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,
+ // 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,
diff --git a/lib/dojo/cookie.js b/lib/dojo/cookie.js
index 67d2cdc6a..32d2718d9 100644
--- a/lib/dojo/cookie.js
+++ b/lib/dojo/cookie.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,9 +8,9 @@
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?
@@ -33,7 +33,7 @@ dojo.__cookieProps = function(){
dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){
- // summary:
+ // summary:
// Get or set a cookie.
// description:
// If one argument is passed, returns the value of the cookie
@@ -42,17 +42,17 @@ dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/
// Name of the cookie
// value:
// Value for the cookie
- // props:
+ // 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});
@@ -64,7 +64,7 @@ dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/
props = props || {};
// FIXME: expires=0 seems to disappear right away, not on close? (FF3) Change docs?
var exp = props.expires;
- if(typeof exp == "number"){
+ if(typeof exp == "number"){
var d = new Date();
d.setTime(d.getTime() + exp*24*60*60*1000);
exp = props.expires = d;
@@ -85,7 +85,7 @@ dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/
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.
diff --git a/lib/dojo/currency.js b/lib/dojo/currency.js
index 53833344d..8ae564618 100644
--- a/lib/dojo/currency.js
+++ b/lib/dojo/currency.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,12 +8,13 @@
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,ru,sk,sl,sv,th,tr,zh,zh-tw");
+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
@@ -47,7 +48,7 @@ dojo.currency._mixInDefaults = function(options){
// Mixin with provided options
return dojo.mixin(data, options);
-}
+};
/*=====
dojo.declare("dojo.currency.__FormatOptions", [dojo.number.__FormatOptions], {
@@ -82,7 +83,7 @@ dojo.currency.format = function(/*Number*/value, /*dojo.currency.__FormatOptions
// the number to be formatted.
return dojo.number.format(value, dojo.currency._mixInDefaults(options));
-}
+};
dojo.currency.regexp = function(/*dojo.number.__RegexpOptions?*/options){
//
@@ -93,7 +94,7 @@ dojo.currency.regexp = function(/*dojo.number.__RegexpOptions?*/options){
// 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], {
@@ -134,6 +135,6 @@ dojo.currency.parse = function(/*String*/expression, /*dojo.currency.__ParseOpti
// expression: A string representation of a currency value
return dojo.number.parse(expression, dojo.currency._mixInDefaults(options));
-}
+};
}
diff --git a/lib/dojo/data/ItemFileReadStore.js b/lib/dojo/data/ItemFileReadStore.js
index 1faed3c7d..9d175ca2c 100644
--- a/lib/dojo/data/ItemFileReadStore.js
+++ b/lib/dojo/data/ItemFileReadStore.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,11 +8,11 @@
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
@@ -22,7 +22,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// { 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
+ // 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){
@@ -37,7 +37,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// ...
// typeN: function || object
// }
- // Where if it is a function, it is assumed to be an object constructor that takes the
+ // 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:
// {
@@ -103,7 +103,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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.
+ //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,
@@ -111,19 +111,19 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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
+ //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:
+ // item:
// The item to test for being contained by the store.
- if(!this.isItem(item)){
+ if(!this.isItem(item)){
throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
}
},
@@ -131,25 +131,25 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
_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:
+ // attribute:
// The attribute to test for being contained by the store.
- if(typeof attribute !== "string"){
+ if(typeof attribute !== "string"){
throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");
}
},
- getValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
+ getValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
/* value? */ defaultValue){
- // summary:
+ // 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,
+ getValues: function(/* item */ item,
/* attribute-name-string */ attribute){
- // summary:
+ // summary:
// See dojo.data.api.Read.getValues()
this._assertIsItem(item);
@@ -159,7 +159,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
getAttributes: function(/* item */ item){
- // summary:
+ // summary:
// See dojo.data.api.Read.getAttributes()
this._assertIsItem(item);
var attributes = [];
@@ -174,17 +174,17 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
hasAttribute: function( /* item */ item,
/* attribute-name-string */ attribute){
- // summary:
+ // 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,
+ containsValue: function(/* item */ item,
+ /* attribute-name-string */ attribute,
/* anything */ value){
- // summary:
+ // summary:
// See dojo.data.api.Read.containsValue()
var regexp = undefined;
if(typeof value === "string"){
@@ -193,22 +193,22 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
return this._containsValue(item, attribute, value, regexp); //boolean.
},
- _containsValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
+ _containsValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
/* anything */ value,
/* RegExp?*/ regexp){
- // summary:
+ // 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
+ // 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:
+ // value:
// The value to match.
// regexp:
// Optional regular expression generated off value if value was of string type to handle wildcarding.
@@ -225,7 +225,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
isItem: function(/* anything */ something){
- // summary:
+ // summary:
// See dojo.data.api.Read.isItem()
if(something && something[this._storeRefPropName] === this){
if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){
@@ -236,25 +236,25 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
isItemLoaded: function(/* anything */ something){
- // summary:
+ // summary:
// See dojo.data.api.Read.isItemLoaded()
return this.isItem(something); //boolean
},
loadItem: function(/* object */ keywordArgs){
- // summary:
+ // summary:
// See dojo.data.api.Read.loadItem()
this._assertIsItem(keywordArgs.item);
},
getFeatures: function(){
- // summary:
+ // summary:
// See dojo.data.api.Read.getFeatures()
return this._features; //Object
},
getLabel: function(/* item */ item){
- // summary:
+ // summary:
// See dojo.data.api.Read.getLabel()
if(this._labelAttr && this.isItem(item)){
return this.getValue(item,this._labelAttr); //String
@@ -263,7 +263,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
getLabelAttributes: function(/* item */ item){
- // summary:
+ // summary:
// See dojo.data.api.Read.getLabelAttributes()
if(this._labelAttr){
return [this._labelAttr]; //array
@@ -271,10 +271,10 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
return null; //null
},
- _fetchItems: function( /* Object */ keywordArgs,
- /* Function */ findCallback,
+ _fetchItems: function( /* Object */ keywordArgs,
+ /* Function */ findCallback,
/* Function */ errorCallback){
- // summary:
+ // summary:
// See dojo.data.util.simpleFetch.fetch()
var self = this,
filter = function(requestArgs, arrayOfItems){
@@ -314,8 +314,8 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}
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
+ // 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.
@@ -335,11 +335,11 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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
+ //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: ",
+ 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;
@@ -350,21 +350,21 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}
//See if there was any forced reset of data.
- if(this.data != null && this._jsonData == null){
+ 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
+ //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,
+ url: self._jsonFileUrl,
handleAs: "json-comment-optional",
preventCache: this.urlPreventCache,
failOk: this.failOk
@@ -424,7 +424,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
_handleQueuedFetches: function(){
- // summary:
+ // summary:
// Internal function to execute delayed request in the store.
//Execute any deferred fetches now.
if(this._queuedFetches.length > 0){
@@ -433,7 +433,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
delayedQuery = fData.args,
delayedFilter = fData.filter;
if(delayedFilter){
- delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions));
+ delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions));
}else{
this.fetchItemByIdentity(delayedQuery);
}
@@ -443,31 +443,31 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
_getItemsArray: function(/*object?*/queryOptions){
- // summary:
+ // 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._arrayOfAllItems;
}
return this._arrayOfTopLevelItems;
},
close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
- // summary:
+ // summary:
// See dojo.data.api.Read.close()
- if(this.clearOnClose &&
- this._loadFinished &&
+ 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
+ //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) &&
+ 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." +
+ " information has not been provided." +
" Please set 'url' or 'data' to the appropriate value before" +
" the next fetch");
}
@@ -505,7 +505,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// | false == valueIsAnItem("Kermit");
// | false == valueIsAnItem(42);
// | false == valueIsAnItem(new Date());
- // | false == valueIsAnItem({_type:'Date', _value:'May 14, 1802'});
+ // | false == valueIsAnItem({_type:'Date', _value:'1802-05-14'});
// | false == valueIsAnItem({_reference:'Kermit'});
// | true == valueIsAnItem({name:'Kermit', color:'green'});
// | true == valueIsAnItem({iggy:'pop'});
@@ -516,8 +516,8 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
(!dojo.isArray(aValue) || addingArrays) &&
(!dojo.isFunction(aValue)) &&
(aValue.constructor == Object || dojo.isArray(aValue)) &&
- (typeof aValue._reference === "undefined") &&
- (typeof aValue._type === "undefined") &&
+ (typeof aValue._reference === "undefined") &&
+ (typeof aValue._type === "undefined") &&
(typeof aValue._value === "undefined") &&
self.hierarchical
);
@@ -567,13 +567,13 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
item[this._rootItemPropName]=true;
}
- // Step 2: Walk through all the attribute values of all the items,
+ // 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
+ //
+ // 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;
@@ -607,9 +607,9 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
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
+ // 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;
@@ -621,7 +621,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
item = this._arrayOfAllItems[i];
arrayOfValues = item[identifier];
var identity = arrayOfValues[0];
- if(!this._itemsByIdentity[identity]){
+ if(!Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
this._itemsByIdentity[identity] = item;
}else{
if(this._jsonFileUrl){
@@ -635,7 +635,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
this._features['dojo.data.api.Identity'] = Number;
}
- // Step 5: Walk through all the items, and set each item's properties
+ // 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];
@@ -649,13 +649,13 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// 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] }
+ // { 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:'July 18, 1918'}] }
+ // { name:['Nelson Mandela'], born:[{_type:'Date', _value:'1918-07-18'}] }
// into this:
- // { name:['Kermit'], born:(new Date('July 18, 1918')) }
+ // { 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){
@@ -668,7 +668,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
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){
+ 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);
@@ -691,12 +691,12 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
var candidateItem = this._arrayOfAllItems[k],
found = true;
for(var refKey in referenceDescription){
- if(candidateItem[refKey] != referenceDescription[refKey]){
- found = false;
+ if(candidateItem[refKey] != referenceDescription[refKey]){
+ found = false;
}
}
- if(found){
- arrayOfValues[j] = candidateItem;
+ if(found){
+ arrayOfValues[j] = candidateItem;
}
}
}
@@ -707,7 +707,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}
}
}else if(this.isItem(value)){
- //It's a child item (not one referenced through _reference).
+ //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){
@@ -736,7 +736,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
getIdentity: function(/* item */ item){
- // summary:
+ // summary:
// See dojo.data.api.Identity.getIdentity()
var identifier = this._features['dojo.data.api.Identity'];
if(identifier === Number){
@@ -751,7 +751,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
fetchItemByIdentity: function(/* Object */ keywordArgs){
- // summary:
+ // summary:
// See dojo.data.api.Identity.fetchItemByIdentity()
// Hasn't loaded yet, we have to trigger the load.
@@ -762,11 +762,11 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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
+ //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: ",
+ 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;
@@ -789,7 +789,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}else{
this._loadInProgress = true;
var getArgs = {
- url: self._jsonFileUrl,
+ url: self._jsonFileUrl,
handleAs: "json-comment-optional",
preventCache: this.urlPreventCache,
failOk: this.failOk
@@ -832,7 +832,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
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);
@@ -847,9 +847,10 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// summary:
// Internal function to look an item up by its identity map.
var item = null;
- if(this._itemsByIdentity){
+ if(this._itemsByIdentity &&
+ Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
item = this._itemsByIdentity[identity];
- }else{
+ }else if (Object.hasOwnProperty.call(this._arrayOfAllItems, identity)){
item = this._arrayOfAllItems[identity];
}
if(item === undefined){
@@ -859,15 +860,15 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
getIdentityAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Identity.getIdentifierAttributes()
+ // 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
+ // spec says we need to return null if the identity is not composed
+ // of attributes
return null; // null
}else{
return [identifier]; // Array
@@ -875,18 +876,18 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
_forceLoad: function(){
- // summary:
+ // 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.
+ // 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
+ //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: ",
+ 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;
@@ -897,14 +898,14 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}
//See if there was any forced reset of data.
- if(this.data != null && this._jsonData == null){
+ if(this.data != null){
this._jsonData = this.data;
this.data = null;
}
if(this._jsonFileUrl){
var getArgs = {
- url: this._jsonFileUrl,
+ url: this._jsonFileUrl,
handleAs: "json-comment-optional",
preventCache: this.urlPreventCache,
failOk: this.failOk,
@@ -913,7 +914,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
var getHandler = dojo.xhrGet(getArgs);
getHandler.addCallback(function(data){
try{
- //Check to be sure there wasn't another load going on concurrently
+ //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.
@@ -926,7 +927,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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.");
+ throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");
}
}catch(e){
console.log(e);
@@ -940,7 +941,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
self._getItemsFromLoadedData(self._jsonData);
self._jsonData = null;
self._loadFinished = true;
- }
+ }
}
});
//Mix in the simple fetch implementation to this class.
diff --git a/lib/dojo/data/ItemFileWriteStore.js b/lib/dojo/data/ItemFileWriteStore.js
index 8782dce05..2c0f3b326 100644
--- a/lib/dojo/data/ItemFileWriteStore.js
+++ b/lib/dojo/data/ItemFileWriteStore.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,6 +10,7 @@ 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)
@@ -20,7 +21,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// ...
// typeN: function || object
// }
- // Where if it is a function, it is assumed to be an object constructor that takes the
+ // 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:
@@ -36,8 +37,8 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// For keeping track of changes so that we can implement isDirty and revert
this._pending = {
- _newItems:{},
- _modifiedItems:{},
+ _newItems:{},
+ _modifiedItems:{},
_deletedItems:{}
};
@@ -100,8 +101,8 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
}
}
- // 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,
+ // 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");
@@ -110,7 +111,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined");
var newItem = {};
- newItem[this._storeRefPropName] = this;
+ newItem[this._storeRefPropName] = this;
newItem[this._itemNumPropName] = this._arrayOfAllItems.length;
if(this._itemsByIdentity){
this._itemsByIdentity[newIdentity] = newItem;
@@ -163,14 +164,14 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// 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
+ // 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:
+ // 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
+ // 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");
}
@@ -207,17 +208,17 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
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()
+ // 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
+ //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
+ //Get the attributes list before we generate the backup so it
//doesn't pollute the attributes list.
var attributes = this.getAttributes(item);
@@ -263,7 +264,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
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);
+ this._removeReferenceFromMap(item, containingItem, attribute);
if(newValues.length < oldValues.length){
this._setValueOrValues(containingItem, attribute, newValues, true);
}
@@ -325,11 +326,11 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
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
+ // 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.
+ // have a record of the original state.
var copyOfItemState = {};
for(var key in item){
if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){
@@ -350,7 +351,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
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
+ // 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
@@ -374,7 +375,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// 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
+ // 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);
@@ -382,7 +383,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
newValueArray = [newValueOrValues];
}
- //We need to handle reference integrity if this is on.
+ //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){
@@ -409,7 +410,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
if(map[id.toString()]){
delete map[id.toString()];
}else{
- this._addReferenceToMap(possibleItem, item, attribute);
+ this._addReferenceToMap(possibleItem, item, attribute);
}
}
}, this);
@@ -439,7 +440,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// Now we make the dojo.data.api.Notification call
if(callOnSet){
- this.onSet(item, attribute, oldValueOrValues, newValueOrValues);
+ this.onSet(item, attribute, oldValueOrValues, newValueOrValues);
}
return success; // boolean
},
@@ -474,7 +475,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// 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
+ // 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:
@@ -531,7 +532,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
_flatten: function(/* anything */ value){
if(this.isItem(value)){
var item = value;
- // Given an item, return an serializable object that provides a
+ // 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"});
@@ -562,7 +563,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
},
_getNewFileContentString: function(){
- // summary:
+ // 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
@@ -603,7 +604,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
},
_isEmpty: function(something){
- // summary:
+ // summary:
// Function to determine if an array or object has no properties or values.
// something:
// The array or object to examine.
@@ -632,7 +633,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
var self = this;
var saveCompleteCallback = function(){
self._pending = {
- _newItems:{},
+ _newItems:{},
_modifiedItems:{},
_deletedItems:{}
};
@@ -681,7 +682,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
modifiedItem = this._arrayOfAllItems[identity];
}
- // Restore the original item into a full-fledged item again, we want to try to
+ // 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){
@@ -722,7 +723,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
}
this._addReferenceToMap(refItem, deletedItem, reference.attr);
}, this);
- delete deletedItem["backupRefs_" + this._reverseRefMap];
+ delete deletedItem["backupRefs_" + this._reverseRefMap];
}
}
@@ -741,8 +742,8 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
}
this._pending = {
- _newItems:{},
- _modifiedItems:{},
+ _newItems:{},
+ _modifiedItems:{},
_deletedItems:{}
};
return true; // boolean
@@ -753,13 +754,13 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
if(item){
// return true if the item is dirty
var identity = this.getIdentity(item);
- return new Boolean(this._pending._newItems[identity] ||
+ 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) ||
+ if(!this._isEmpty(this._pending._newItems) ||
!this._isEmpty(this._pending._modifiedItems) ||
!this._isEmpty(this._pending._deletedItems)){
return true;
@@ -770,28 +771,28 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
/* dojo.data.api.Notification */
- onSet: function(/* item */ item,
- /*attribute-name-string*/ attribute,
+ 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
+ // 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.
+ // 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.
+ // No need to do anything. This method is here just so that the
+ // client code can connect observers to it.
},
close: function(/* object? */ request){
diff --git a/lib/dojo/data/ObjectStore.js b/lib/dojo/data/ObjectStore.js
new file mode 100644
index 000000000..8ccc4f853
--- /dev/null
+++ b/lib/dojo/data/ObjectStore.js
@@ -0,0 +1,487 @@
+/*
+ Copyright (c) 2004-2011, The 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.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(){}
+ }
+);
+
+}
diff --git a/lib/dojo/data/api/Identity.js b/lib/dojo/data/api/Identity.js
index 7a1caeb53..9d99f3d64 100644
--- a/lib/dojo/data/api/Identity.js
+++ b/lib/dojo/data/api/Identity.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,6 +10,7 @@ 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.
@@ -17,7 +18,7 @@ dojo.declare("dojo.data.api.Identity", dojo.data.api.Read, {
// methods unimplemented.
getFeatures: function(){
- // summary:
+ // summary:
// See dojo.data.api.Read.getFeatures()
return {
'dojo.data.api.Read': true,
@@ -45,16 +46,16 @@ dojo.declare("dojo.data.api.Identity", dojo.data.api.Read, {
getIdentityAttributes: function(/* item */ item){
// summary:
- // Returns an array of attribute names that are used to generate the identity.
+ // 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
+ // 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
+ // 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);
@@ -67,14 +68,14 @@ dojo.declare("dojo.data.api.Identity", dojo.data.api.Read, {
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,
+ // 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
+ // 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,
@@ -84,9 +85,9 @@ dojo.declare("dojo.data.api.Identity", dojo.data.api.Read, {
// }
// 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()
+ // 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
@@ -98,12 +99,12 @@ dojo.declare("dojo.data.api.Identity", dojo.data.api.Read, {
// parameter, the error object
//
// The *scope* parameter.
- // If a scope object is provided, all of the callback functions (onItem,
+ // 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.
+ // 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');
diff --git a/lib/dojo/data/api/Notification.js b/lib/dojo/data/api/Notification.js
index b1abad797..33daa3010 100644
--- a/lib/dojo/data/api/Notification.js
+++ b/lib/dojo/data/api/Notification.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,6 +10,7 @@ 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.
@@ -18,12 +19,12 @@ dojo.declare("dojo.data.api.Notification", dojo.data.api.Read, {
//
// 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
+ // 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,
+ // 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
+ // 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).
//
@@ -36,7 +37,7 @@ dojo.declare("dojo.data.api.Notification", dojo.data.api.Read, {
// | dojo.connect(store, "onSet", onSet);
getFeatures: function(){
- // summary:
+ // summary:
// See dojo.data.api.Read.getFeatures()
return {
'dojo.data.api.Read': true,
@@ -44,16 +45,16 @@ dojo.declare("dojo.data.api.Notification", dojo.data.api.Read, {
};
},
- onSet: function(/* item */ item,
- /* attribute-name-string */ attribute,
+ 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.
+ // 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
+ // 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:
@@ -62,11 +63,11 @@ dojo.declare("dojo.data.api.Notification", dojo.data.api.Read, {
// 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
+ // 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,
+ // 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:
@@ -93,12 +94,12 @@ dojo.declare("dojo.data.api.Notification", dojo.data.api.Read, {
// {
// 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.
+ // 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.
+ // //it will be an array.
// }
//
// returns:
diff --git a/lib/dojo/data/api/Read.js b/lib/dojo/data/api/Read.js
index 0a84aa5f9..ff8518cd4 100644
--- a/lib/dojo/data/api/Read.js
+++ b/lib/dojo/data/api/Read.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,26 +10,27 @@ 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 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,
+ // 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,
+ 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).
+ // 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"
+ // 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.
@@ -112,7 +113,7 @@ dojo.declare("dojo.data.api.Read", null, {
},
containsValue: function(/* item */ item,
- /* attribute-name-string */ attribute,
+ /* attribute-name-string */ attribute,
/* anything */ value){
// summary:
// Returns true if the given *value* is one of the values that getValues()
@@ -135,8 +136,8 @@ dojo.declare("dojo.data.api.Read", null, {
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,
+ // 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:
@@ -173,9 +174,9 @@ dojo.declare("dojo.data.api.Read", null, {
// 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.
+ // the item has not already been loaded.
// keywordArgs:
- // An anonymous object that defines the item to load and callbacks to invoke when the
+ // 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,
@@ -198,12 +199,12 @@ dojo.declare("dojo.data.api.Read", null, {
// parameter, the error object
//
// The *scope* parameter.
- // If a scope object is provided, all of the callback functions (onItem,
+ // 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.
+ // 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');
@@ -214,25 +215,25 @@ dojo.declare("dojo.data.api.Read", null, {
// 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
+ // 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
+ // 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,
+ // 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
+ // 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,
@@ -245,10 +246,10 @@ dojo.declare("dojo.data.api.Read", null, {
// 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 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.
@@ -256,28 +257,28 @@ dojo.declare("dojo.data.api.Read", null, {
// 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
+ // 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
+ // 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 *
+ // 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
+ // 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
+ // 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
+ // 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.
// }
//
@@ -287,14 +288,14 @@ dojo.declare("dojo.data.api.Read", null, {
// 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
+ // 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
+ // 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.
//
@@ -304,12 +305,12 @@ dojo.declare("dojo.data.api.Read", null, {
// 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:
+ // 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);
+ // 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.
@@ -317,29 +318,29 @@ dojo.declare("dojo.data.api.Read", null, {
// an Error object and the Request object.
//
// The *scope* parameter.
- // If a scope object is provided, all of the callback functions (onItem,
+ // 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.
+ // 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
+ // 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
+ // 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.
+ // 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
+ // 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:
// {
@@ -347,18 +348,18 @@ dojo.declare("dojo.data.api.Read", null, {
// 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
+ // (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.
- //
+ // 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
+ // such as request.store property, which is a pointer to the datastore object that
// fetch() is a method of.
//
// exceptions:
@@ -373,7 +374,7 @@ dojo.declare("dojo.data.api.Read", null, {
// | 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.
+ // 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.
@@ -412,21 +413,21 @@ dojo.declare("dojo.data.api.Read", null, {
// and then when the user presses the "Next Page" button...
// | fetchArgs.start += 20;
// | store.fetch(fetchArgs); // get the next 20 items
- var request = null;
+ 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
+ // 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',
+ // 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
@@ -435,14 +436,14 @@ dojo.declare("dojo.data.api.Read", null, {
close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
// summary:
- // The close() method is intended for instructing the store to 'close' out
+ // 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
+ // 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
+ // 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.
//
@@ -450,7 +451,7 @@ dojo.declare("dojo.data.api.Read", null, {
// 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
+ // there on, it merely cleans out any current data and resets the store to initial
// state.
//
// example:
@@ -463,7 +464,7 @@ dojo.declare("dojo.data.api.Read", null, {
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.
+ // 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
@@ -471,17 +472,17 @@ dojo.declare("dojo.data.api.Read", null, {
// 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
+ // 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
+ // 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
+ // 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;
@@ -489,21 +490,21 @@ dojo.declare("dojo.data.api.Read", null, {
getLabelAttributes: function(/* item */ item){
// summary:
- // Method to inspect the item and return an array of what attributes of the item were used
+ // 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
+ // 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
+ // 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
+ // 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;
diff --git a/lib/dojo/data/api/Request.js b/lib/dojo/data/api/Request.js
index d613c7b11..5c94cb5e0 100644
--- a/lib/dojo/data/api/Request.js
+++ b/lib/dojo/data/api/Request.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,16 +9,17 @@ if(!dojo._hasResource["dojo.data.api.Request"]){ //_hasResource checks added by
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.
+ // 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 is an abstract API that data provider implementations conform to.
// This file defines methods signatures and intentionally leaves all the
// methods unimplemented.
//
@@ -26,10 +27,10 @@ dojo.declare("dojo.data.api.Request", null, {
abort: function(){
// summary:
- // This function is a hook point for stores to provide as a way for
+ // 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
+ // 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');
diff --git a/lib/dojo/data/api/Write.js b/lib/dojo/data/api/Write.js
index 3fd0b1af0..08779180b 100644
--- a/lib/dojo/data/api/Write.js
+++ b/lib/dojo/data/api/Write.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,14 +10,15 @@ 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 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:
+ // summary:
// See dojo.data.api.Read.getFeatures()
return {
'dojo.data.api.Read': true,
@@ -31,16 +32,16 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
// 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
+ // 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.
+ // 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),
+ // 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:
@@ -51,7 +52,7 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
//
// exceptions:
// Throws an exception if *keywordArgs* is a string or a number or
- // anything other than a simple anonymous object.
+ // 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:
@@ -66,11 +67,11 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
// summary:
// Deletes an item from the store.
//
- // item:
+ // item:
// The item to delete.
//
// exceptions:
- // Throws an exception if the argument *item* is not an item
+ // Throws an exception if the argument *item* is not an item
// (if store.isItem(item) returns false).
// example:
// | var success = store.deleteItem(kermit);
@@ -78,7 +79,7 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
return false; // boolean
},
- setValue: function( /* item */ item,
+ setValue: function( /* item */ item,
/* string */ attribute,
/* almost anything */ value){
// summary:
@@ -103,7 +104,7 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
},
setValues: function(/* item */ item,
- /* string */ attribute,
+ /* string */ attribute,
/* array */ values){
// summary:
// Adds each value in the *values* array as a value of the given
@@ -130,7 +131,7 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
return false; // boolean
},
- unsetAttribute: function( /* item */ item,
+ unsetAttribute: function( /* item */ item,
/* string */ attribute){
// summary:
// Deletes all the values of an attribute on an item.
@@ -154,9 +155,9 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
// 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
+ // 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
@@ -172,7 +173,7 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
// are generally passed to the onComplete.
//
// The *onError* parameter.
- // function(errorData);
+ // 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
@@ -184,12 +185,12 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
// 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.
+ // 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
+ // 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});
@@ -211,8 +212,8 @@ dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
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,
+ // 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().
//
diff --git a/lib/dojo/data/util/filter.js b/lib/dojo/data/util/filter.js
index d23e63ade..909cc49bc 100644
--- a/lib/dojo/data/util/filter.js
+++ b/lib/dojo/data/util/filter.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,12 +9,14 @@ if(!dojo._hasResource["dojo.data.util.filter"]){ //_hasResource checks added by
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:
+ // 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:
+ // For example:
// ca* -> /^ca.*$/
// *ca* -> /^.*ca.*$/
// *c\*a* -> /^.*c\*a.*$/
@@ -26,7 +28,7 @@ dojo.data.util.filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/
// * 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
+ // 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:
diff --git a/lib/dojo/data/util/simpleFetch.js b/lib/dojo/data/util/simpleFetch.js
index 0bfb19ec3..b3f859b48 100644
--- a/lib/dojo/data/util/simpleFetch.js
+++ b/lib/dojo/data/util/simpleFetch.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,30 +10,32 @@ 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()
+ // 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
+ // 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
+ // 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.
+ // 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
+ // 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()
diff --git a/lib/dojo/data/util/sorter.js b/lib/dojo/data/util/sorter.js
index c0261c848..539d3ca02 100644
--- a/lib/dojo/data/util/sorter.js
+++ b/lib/dojo/data/util/sorter.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,11 +9,13 @@ if(!dojo._hasResource["dojo.data.util.sorter"]){ //_hasResource checks added by
dojo._hasResource["dojo.data.util.sorter"] = true;
dojo.provide("dojo.data.util.sorter");
-dojo.data.util.sorter.basicComparator = function( /*anything*/ a,
+dojo.getObject("data.util.sorter", true, dojo);
+
+dojo.data.util.sorter.basicComparator = function( /*anything*/ a,
/*anything*/ b){
- // summary:
+ // summary:
// Basic comparision function that compares if an item is greater or less than another item
- // description:
+ // 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.
@@ -30,18 +32,18 @@ dojo.data.util.sorter.basicComparator = function( /*anything*/ a,
b = undefined;
}
if(a == b){
- r = 0;
+ r = 0;
}else if(a > b || a == null){
- r = 1;
+ r = 1;
}
return r; //int {-1,0,1}
};
dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortSpec,
/*dojo.data.core.Read*/ store){
- // summary:
+ // summary:
// Helper function to generate the sorting function based off the list of sort attributes.
- // description:
+ // 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.
@@ -83,7 +85,7 @@ dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortS
}
comp = map[attr] || bc;
}
- sortFunctions.push(createSortFunction(attr,
+ sortFunctions.push(createSortFunction(attr,
dir, comp, store));
}
}
@@ -95,7 +97,7 @@ dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortS
return ret;//int
}
}
- return 0; //int
+ return 0; //int
}; // Function
};
diff --git a/lib/dojo/date.js b/lib/dojo/date.js
index d4fe218d3..e961b5a86 100644
--- a/lib/dojo/date.js
+++ b/lib/dojo/date.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.date"]){ //_hasResource checks added by build. Do no
dojo._hasResource["dojo.date"] = true;
dojo.provide("dojo.date");
+dojo.getObject("date", true, dojo);
+
/*=====
dojo.date = {
// summary: Date manipulation utilities
@@ -22,7 +24,7 @@ dojo.date.getDaysInMonth = function(/*Date*/dateObject){
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:
@@ -36,7 +38,7 @@ dojo.date.isLeapYear = function(/*Date*/dateObject){
var year = dateObject.getFullYear();
return !(year%400) || (!(year%4) && !!(year%100)); // Boolean
-}
+};
// FIXME: This is not localized
dojo.date.getTimezoneName = function(/*Date*/dateObject){
@@ -61,7 +63,7 @@ dojo.date.getTimezoneName = function(/*Date*/dateObject){
}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
+ // 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))){
@@ -70,7 +72,7 @@ dojo.date.getTimezoneName = function(/*Date*/dateObject){
// 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,
+ // Capital letters or slash -- end of string,
// after space
pat = / ([A-Z\/]+)$/;
if((match = str.match(pat))){
@@ -81,7 +83,7 @@ dojo.date.getTimezoneName = function(/*Date*/dateObject){
// 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
diff --git a/lib/dojo/date/locale.js b/lib/dojo/date/locale.js
index c66da2331..9b6b4fa62 100644
--- a/lib/dojo/date/locale.js
+++ b/lib/dojo/date/locale.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,18 +8,20 @@
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");
-
-// Localization methods for Date. Honor local customs using locale-dependent dojo.cldr data.
-
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
-dojo.requireLocalization("dojo.cldr", "gregorian", null, "ROOT,ar,ca,cs,da,de,el,en,en-au,en-ca,en-gb,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
//NOTE: Everything in this module assumes Gregorian calendars.
// Other calendars will be implemented in separate modules.
@@ -91,7 +93,7 @@ dojo.requireLocalization("dojo.cldr", "gregorian", null, "ROOT,ar,ca,cs,da,de,el
break;
case 'a':
var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm';
- s = bundle['dayPeriods-format-wide-' + timePeriod];
+ s = options[timePeriod] || bundle['dayPeriods-format-wide-' + timePeriod];
break;
case 'h':
case 'H':
@@ -292,20 +294,23 @@ dojo.date.locale.parse = function(/*String*/value, /*dojo.date.locale.__FormatOp
// 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
+ // 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
- var info = dojo.date.locale._parseInfo(options),
+ // 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 + "$", info.strict ? "" : "i"),
- match = re.exec(value);
+ re = new RegExp("^" + info.regexp.replace(controlChars, "") + "$",
+ info.strict ? "" : "i"),
+ match = re.exec(value && value.replace(controlChars, ""));
if(!match){ return null; } // null
@@ -444,7 +449,7 @@ dojo.date.locale.parse = function(/*String*/value, /*dojo.date.locale.__FormatOp
result[3] = 0; //12am -> 0
}
- //TODO: implement a getWeekday() method in order to test
+ //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
@@ -484,7 +489,7 @@ function _processPattern(pattern, applyPattern, applyLiteral, applyAll){
applyLiteral = applyLiteral || identity;
applyAll = applyAll || identity;
- //split on single quotes (which escape literals in date format strings)
+ //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) == "'";
@@ -520,31 +525,31 @@ function _buildDateTimeRE(tokens, bundle, options, pattern){
s = '\\d{2,4}';
break;
case 'M':
- s = (l>2) ? '\\S+?' : p2+'[1-9]|1[0-2]';
+ s = (l>2) ? '\\S+?' : '1[0-2]|'+p2+'[1-9]';
break;
case 'D':
- s = p2+'[1-9]|'+p3+'[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]';
+ 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 = p2+'[1-9]|[1-4][0-9]|5[0-3]';
+ s = '[1-4][0-9]|5[0-3]|'+p2+'[1-9]';
break;
case 'E':
s = '\\S+';
break;
case 'h': //hour (1-12)
- s = p2+'[1-9]|1[0-2]';
+ s = '1[0-2]|'+p2+'[1-9]';
break;
case 'k': //hour (0-11)
- s = p2+'\\d|1[01]';
+ s = '1[01]|'+p2+'\\d';
break;
case 'H': //hour (0-23)
- s = p2+'\\d|1\\d|2[0-3]';
+ s = '1\\d|2[0-3]|'+p2+'\\d';
break;
case 'K': //hour (1-24)
- s = p2+'[1-9]|1\\d|2[0-4]';
+ s = '1\\d|2[0-4]|'+p2+'[1-9]';
break;
case 'm':
case 's':
@@ -556,10 +561,8 @@ function _buildDateTimeRE(tokens, bundle, options, pattern){
case 'a':
var am = options.am || bundle['dayPeriods-format-wide-am'],
pm = options.pm || bundle['dayPeriods-format-wide-pm'];
- if(options.strict){
- s = am + '|' + pm;
- }else{
- s = am + '|' + 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, ""); }
diff --git a/lib/dojo/date/stamp.js b/lib/dojo/date/stamp.js
index 968bc40fd..04b68a06a 100644
--- a/lib/dojo/date/stamp.js
+++ b/lib/dojo/date/stamp.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.date.stamp"]){ //_hasResource checks added by build.
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){
@@ -87,7 +89,7 @@ dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/d
}
return result; // Date or null
-}
+};
/*=====
dojo.date.stamp.__Options = function(){
@@ -137,12 +139,12 @@ dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__O
}else if(options.selector != "time"){
var timezoneOffset = dateObject.getTimezoneOffset();
var absOffset = Math.abs(timezoneOffset);
- time += (timezoneOffset > 0 ? "-" : "+") +
+ time += (timezoneOffset > 0 ? "-" : "+") +
_(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
}
formattedDate.push(time);
}
return formattedDate.join('T'); // String
-}
+};
}
diff --git a/lib/dojo/dnd/Avatar.js b/lib/dojo/dnd/Avatar.js
index effd253f3..8f43801b3 100644
--- a/lib/dojo/dnd/Avatar.js
+++ b/lib/dojo/dnd/Avatar.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,9 +8,9 @@
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
@@ -93,7 +93,7 @@ dojo.declare("dojo.dnd.Avatar", null, {
var icon = dojo.byId("a11yIcon");
var text = '+'; // assume canDrop && copy
if (this.manager.canDropFlag && !this.manager.copy) {
- text = '< '; // canDrop && move
+ text = '< '; // canDrop && move
}else if (!this.manager.canDropFlag && !this.manager.copy) {
text = "o"; //!canDrop && move
}else if(!this.manager.canDropFlag){
diff --git a/lib/dojo/dnd/Container.js b/lib/dojo/dnd/Container.js
index 6efc6f6fb..58f34eb6b 100644
--- a/lib/dojo/dnd/Container.js
+++ b/lib/dojo/dnd/Container.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,10 +8,10 @@
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
@@ -63,7 +63,7 @@ dojo.dnd.Item = function(){
dojo.declare("dojo.dnd.Container", null, {
// summary:
- // a Container object, which knows when mouse hovers over it,
+ // a Container object, which knows when mouse hovers over it,
// and over which element it hovers
// object attributes (for markup)
@@ -140,7 +140,7 @@ dojo.declare("dojo.dnd.Container", null, {
},
forInItems: function(/*Function*/ f, /*Object?*/ o){
// summary:
- // iterates over a data map skipping members that
+ // 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;
@@ -327,8 +327,7 @@ dojo.declare("dojo.dnd.Container", null, {
var prefix = "dojoDnd" + type;
var state = type.toLowerCase() + "State";
//dojo.replaceClass(this.node, prefix + newState, prefix + this[state]);
- dojo.removeClass(this.node, prefix + this[state]);
- dojo.addClass(this.node, prefix + newState);
+ dojo.replaceClass(this.node, prefix + newState, prefix + this[state]);
this[state] = newState;
},
_addItemClass: function(node, type){
@@ -375,7 +374,7 @@ dojo.declare("dojo.dnd.Container", null, {
dojo.dnd._createNode = function(tag){
// summary:
- // returns a function, which creates an element of given tag
+ // 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
diff --git a/lib/dojo/dnd/Manager.js b/lib/dojo/dnd/Manager.js
index 70754f93f..38611fbd4 100644
--- a/lib/dojo/dnd/Manager.js
+++ b/lib/dojo/dnd/Manager.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,11 +8,11 @@
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)
@@ -84,7 +84,7 @@ dojo.declare("dojo.dnd.Manager", null, {
dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent)
];
var c = "dojoDnd" + (copy ? "Copy" : "Move");
- dojo.addClass(dojo.body(), c);
+ dojo.addClass(dojo.body(), c);
},
canDrop: function(flag){
// summary:
@@ -98,8 +98,7 @@ dojo.declare("dojo.dnd.Manager", null, {
stopDrag: function(){
// summary:
// stop the DnD in progress
- dojo.removeClass(dojo.body(), "dojoDndCopy");
- dojo.removeClass(dojo.body(), "dojoDndMove");
+ dojo.removeClass(dojo.body(), ["dojoDndCopy", "dojoDndMove"]);
dojo.forEach(this.events, dojo.disconnect);
this.events = [];
this.avatar.destroy();
@@ -132,7 +131,7 @@ dojo.declare("dojo.dnd.Manager", null, {
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){
+ if(this.copy != copy){
this._setCopyStatus(copy);
}
}
@@ -166,7 +165,7 @@ dojo.declare("dojo.dnd.Manager", null, {
switch(e.keyCode){
case dojo.keys.CTRL:
var copy = Boolean(this.source.copyState(true));
- if(this.copy != copy){
+ if(this.copy != copy){
this._setCopyStatus(copy);
}
break;
@@ -184,7 +183,7 @@ dojo.declare("dojo.dnd.Manager", null, {
// keyboard event
if(this.avatar && e.keyCode == dojo.keys.CTRL){
var copy = Boolean(this.source.copyState(false));
- if(this.copy != copy){
+ if(this.copy != copy){
this._setCopyStatus(copy);
}
}
@@ -199,8 +198,9 @@ dojo.declare("dojo.dnd.Manager", null, {
this.copy = copy;
this.source._markDndStatus(this.copy);
this.updateAvatar();
- dojo.removeClass(dojo.body(), "dojoDnd" + (this.copy ? "Move" : "Copy"));
- dojo.addClass(dojo.body(), "dojoDnd" + (this.copy ? "Copy" : "Move"));
+ dojo.replaceClass(dojo.body(),
+ "dojoDnd" + (this.copy ? "Copy" : "Move"),
+ "dojoDnd" + (this.copy ? "Move" : "Copy"));
}
});
diff --git a/lib/dojo/dnd/Moveable.js b/lib/dojo/dnd/Moveable.js
index 324196582..705b8cf62 100644
--- a/lib/dojo/dnd/Moveable.js
+++ b/lib/dojo/dnd/Moveable.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,9 +8,9 @@
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
@@ -54,6 +54,7 @@ dojo.declare("dojo.dnd.Moveable", null, {
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")
@@ -76,17 +77,20 @@ dojo.declare("dojo.dnd.Moveable", null, {
// mouse event processors
onMouseDown: function(e){
// summary:
- // event processor for onmousedown, creates a Mover for the node
+ // event processor for onmousedown/ontouchstart, creates a Mover for the node
// e: Event
- // mouse 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, "onmouseup", this, "onMouseUp")
+ dojo.connect(this.handle, "ontouchmove", this, "onMouseMove"),
+ dojo.connect(this.handle, "onmouseup", this, "onMouseUp"),
+ dojo.connect(this.handle, "ontouchend", this, "onMouseUp")
);
- this._lastX = e.pageX;
- this._lastY = e.pageY;
+ var pos = e.touches ? e.touches[0] : e;
+ this._lastX = pos.pageX;
+ this._lastY = pos.pageY;
}else{
this.onDragDetected(e);
}
@@ -94,10 +98,11 @@ dojo.declare("dojo.dnd.Moveable", null, {
},
onMouseMove: function(e){
// summary:
- // event processor for onmousemove, used only for delayed drags
+ // event processor for onmousemove/ontouchmove, used only for delayed drags
// e: Event
- // mouse event
- if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
+ // 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);
}
@@ -134,8 +139,8 @@ dojo.declare("dojo.dnd.Moveable", null, {
// summary:
// called before every move operation
dojo.publish("/dnd/move/start", [mover]);
- dojo.addClass(dojo.body(), "dojoMove");
- dojo.addClass(this.node, "dojoMoveItem");
+ dojo.addClass(dojo.body(), "dojoMove");
+ dojo.addClass(this.node, "dojoMoveItem");
},
onMoveStop: function(/* dojo.dnd.Mover */ mover){
// summary:
diff --git a/lib/dojo/dnd/Mover.js b/lib/dojo/dnd/Mover.js
index cdb995c08..a8c161c80 100644
--- a/lib/dojo/dnd/Mover.js
+++ b/lib/dojo/dnd/Mover.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,14 +8,14 @@
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.
+ // 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
@@ -26,17 +26,27 @@ dojo.declare("dojo.dnd.Mover", null, {
// 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};
+ 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,
- firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
+ 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),
- firstEvent
+ dojo.connect(d.body, "onselectstart", dojo.stopEvent)
];
// notify that the move has started
if(h && h.onMoveStart){
@@ -46,17 +56,18 @@ dojo.declare("dojo.dnd.Mover", null, {
// mouse event processors
onMouseMove: function(e){
// summary:
- // event processor for onmousemove
+ // event processor for onmousemove/ontouchmove
// e: Event
- // mouse 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);
+ 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){
+ 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);
@@ -64,7 +75,7 @@ dojo.declare("dojo.dnd.Mover", null, {
// utilities
onFirstMove: function(e){
// summary:
- // makes the node absolute; it is meant to be called only once.
+ // 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){
@@ -84,7 +95,7 @@ dojo.declare("dojo.dnd.Mover", null, {
// 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.
+ // the computed style.
var b = dojo.doc.body;
var bs = dojo.getComputedStyle(b);
var bm = dojo._getMarginBox(b, bs);
@@ -98,7 +109,10 @@ dojo.declare("dojo.dnd.Mover", null, {
if(h && h.onFirstMove){
h.onFirstMove(this, e);
}
- dojo.disconnect(this.events.pop());
+
+ // Disconnect onmousemove and ontouchmove events that call this function
+ dojo.disconnect(this.events.shift());
+ dojo.disconnect(this.events.shift());
},
destroy: function(){
// summary:
diff --git a/lib/dojo/dnd/Selector.js b/lib/dojo/dnd/Selector.js
index 9f13b75a0..20569daae 100644
--- a/lib/dojo/dnd/Selector.js
+++ b/lib/dojo/dnd/Selector.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,10 +8,10 @@
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
diff --git a/lib/dojo/dnd/Source.js b/lib/dojo/dnd/Source.js
index 8e5c55dbc..30a61becd 100644
--- a/lib/dojo/dnd/Source.js
+++ b/lib/dojo/dnd/Source.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,10 +8,10 @@
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
@@ -89,11 +89,11 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
generateText: true,
constructor: function(/*DOMNode|String*/node, /*dojo.dnd.__SourceArgs?*/params){
- // summary:
+ // summary:
// a constructor of the Source
// node:
// node or node's id to build the source on
- // params:
+ // 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));
diff --git a/lib/dojo/dnd/TimedMoveable.js b/lib/dojo/dnd/TimedMoveable.js
index 25a101e20..bd8e7d253 100644
--- a/lib/dojo/dnd/TimedMoveable.js
+++ b/lib/dojo/dnd/TimedMoveable.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,9 +8,9 @@
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
@@ -27,7 +27,7 @@ dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], {
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
+ // 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.
diff --git a/lib/dojo/dnd/autoscroll.js b/lib/dojo/dnd/autoscroll.js
index 40daf66a1..d2c99cf30 100644
--- a/lib/dojo/dnd/autoscroll.js
+++ b/lib/dojo/dnd/autoscroll.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,26 +8,11 @@
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.dnd.getViewport = function(){
- // summary:
- // Returns a viewport size (visible part of the window)
-
- // TODO: remove this when getViewport() moved to dojo core, see #7028
+dojo.getObject("dnd", true, dojo);
- // FIXME: need more docs!!
- var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
- if(dojo.isMozilla){
- return {w: dd.clientWidth, h: w.innerHeight}; // Object
- }else if(!dojo.isOpera && w.innerWidth){
- return {w: w.innerWidth, h: w.innerHeight}; // Object
- }else if (!dojo.isOpera && dd && dd.clientWidth){
- return {w: dd.clientWidth, h: dd.clientHeight}; // Object
- }else if (b.clientWidth){
- return {w: b.clientWidth, h: b.clientHeight}; // Object
- }
- return null; // Object
-};
+dojo.dnd.getViewport = dojo.window.getBox;
dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
@@ -43,7 +28,7 @@ dojo.dnd.autoScroll = function(e){
// onmousemove event
// FIXME: needs more docs!
- var v = dojo.dnd.getViewport(), dx = 0, dy = 0;
+ 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){
@@ -74,14 +59,15 @@ dojo.dnd.autoScrollNodes = function(e){
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),
+ 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
+ // 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;
+ rx += dojo.body().scrollLeft;
+ ry += dojo.body().scrollTop;
}
if(rx > 0 && rx < b.w){
if(rx < w){
diff --git a/lib/dojo/dnd/common.js b/lib/dojo/dnd/common.js
index e49552919..f69aa5a5a 100644
--- a/lib/dojo/dnd/common.js
+++ b/lib/dojo/dnd/common.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build.
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;
diff --git a/lib/dojo/dnd/move.js b/lib/dojo/dnd/move.js
index f2abc1b41..6a737bd3a 100644
--- a/lib/dojo/dnd/move.js
+++ b/lib/dojo/dnd/move.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,10 +8,10 @@
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
@@ -55,7 +55,7 @@ dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
c.r = c.l + c.w;
c.b = c.t + c.h;
if(this.within){
- var mb = dojo.marginBox(mover.node);
+ var mb = dojo._getMarginSize(mover.node);
c.r -= mb.w;
c.b -= mb.h;
}
@@ -65,8 +65,12 @@ dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
// called during every move notification;
// should actually move the node; can be overwritten.
var c = this.constraintBox, s = mover.node.style;
- s.left = (leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l) + "px";
- s.top = (leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t) + "px";
+ 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);
}
});
@@ -128,8 +132,8 @@ dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constraine
// an optional object with parameters
var area = params && params.area;
this.constraints = function(){
- var n = this.node.parentNode,
- s = dojo.getComputedStyle(n),
+ var n = this.node.parentNode,
+ s = dojo.getComputedStyle(n),
mb = dojo._getMarginBox(n, s);
if(area == "margin"){
return mb; // Object
@@ -151,100 +155,6 @@ dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constraine
}
});
-// WARNING: below are obsolete objects, instead of custom movers use custom moveables (above)
-
-dojo.dnd.move.constrainedMover = function(fun, within){
- // summary:
- // returns a constrained version of dojo.dnd.Mover
- // description:
- // this function produces n object, which will put a constraint on
- // the margin box of dragged object in absolute coordinates
- // fun: Function
- // called on drag, and returns a constraint box
- // within: Boolean
- // if true, constraints the whole dragged object withtin the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");
- var mover = function(node, e, notifier){
- dojo.dnd.Mover.call(this, node, e, notifier);
- };
- dojo.extend(mover, dojo.dnd.Mover.prototype);
- dojo.extend(mover, {
- onMouseMove: function(e){
- // summary: event processor for onmousemove
- // e: Event: mouse event
- dojo.dnd.autoScroll(e);
- var m = this.marginBox, c = this.constraintBox,
- l = m.l + e.pageX, t = m.t + e.pageY;
- l = l < c.l ? c.l : c.r < l ? c.r : l;
- t = t < c.t ? c.t : c.b < t ? c.b : t;
- this.host.onMove(this, {l: l, t: t});
- },
- onFirstMove: function(){
- // summary: called once to initialize things; it is meant to be called only once
- dojo.dnd.Mover.prototype.onFirstMove.call(this);
- var c = this.constraintBox = fun.call(this);
- c.r = c.l + c.w;
- c.b = c.t + c.h;
- if(within){
- var mb = dojo.marginBox(this.node);
- c.r -= mb.w;
- c.b -= mb.h;
- }
- }
- });
- return mover; // Object
-};
-
-dojo.dnd.move.boxConstrainedMover = function(box, within){
- // summary:
- // a specialization of dojo.dnd.constrainedMover, which constrains to the specified box
- // box: Object
- // a constraint box (l, t, w, h)
- // within: Boolean
- // if true, constraints the whole dragged object withtin the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");
- return dojo.dnd.move.constrainedMover(function(){ return box; }, within); // Object
-};
-
-dojo.dnd.move.parentConstrainedMover = function(area, within){
- // summary:
- // a specialization of dojo.dnd.constrainedMover, which constrains to the parent node
- // area: String
- // "margin" to constrain within the parent's margin box, "border" for the border box,
- // "padding" for the padding box, and "content" for the content box; "content" is the default value.
- // within: Boolean
- // if true, constraints the whole dragged object within the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");
- var fun = 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
- };
- return dojo.dnd.move.constrainedMover(fun, within); // Object
-};
-
// patching functions one level up for compatibility
dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover;
diff --git a/lib/dojo/dojo.js b/lib/dojo/dojo.js
index 665870c62..ef2f2fb77 100644
--- a/lib/dojo/dojo.js
+++ b/lib/dojo/dojo.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -11,4 +11,4 @@
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};if(typeof djConfig!="undefined"){for(var _9 in djConfig){d.config[_9]=djConfig[_9];}}dojo.locale=d.config.locale;var _a="$Rev: 22487 $".match(/\d+/);dojo.version={major:1,minor:5,patch:0,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);};dojo["eval"]=function(_1d){return d.global.eval?d.global.eval(_1d):eval(_1d);};d.deprecated=d.experimental=function(){};})();(function(){var d=dojo;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(_1e){var mp=d._modulePrefixes;return !!(mp[_1e]&&mp[_1e].value);},_getModulePrefix:function(_1f){var mp=d._modulePrefixes;if(d._moduleHasPrefix(_1f)){return mp[_1f].value;}return _1f;},_loadedUrls:[],_postLoad:false,_loaders:[],_unloaders:[],_loadNotifying:false});dojo._loadPath=function(_20,_21,cb){var uri=((_20.charAt(0)=="/"||_20.match(/^\w+:/))?"":d.baseUrl)+_20;try{return !_21?d._loadUri(uri,cb):d._loadUriAndCheck(uri,_21,cb);}catch(e){console.error(e);return false;}};dojo._loadUri=function(uri,cb){if(d._loadedUrls[uri]){return true;}d._inFlightCount++;var _22=d._getText(uri,true);if(_22){d._loadedUrls[uri]=true;d._loadedUrls.push(uri);if(cb){_22="("+_22+")";}else{_22=d._scopePrefix+_22+d._scopeSuffix;}if(!d.isIE){_22+="\r\n//@ sourceURL="+uri;}var _23=d["eval"](_22);if(cb){cb(_23);}}if(--d._inFlightCount==0&&d._postLoad&&d._loaders.length){setTimeout(function(){if(d._inFlightCount==0){d._callLoaded();}},0);}return !!_22;};dojo._loadUriAndCheck=function(uri,_24,cb){var ok=false;try{ok=d._loadUri(uri,cb);}catch(e){console.error("failed loading "+uri+" with error: "+e);}return !!(ok&&d._loadedModules[_24]);};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 _25=(typeof fn=="string")?obj[fn]:fn;arr.push(function(){_25.call(obj);});}}};dojo.ready=dojo.addOnLoad=function(obj,_26){d._onto(d._loaders,obj,_26);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(_27){var _28=_27.split(".");for(var i=_28.length;i>0;i--){var _29=_28.slice(0,i).join(".");if(i==1&&!d._moduleHasPrefix(_29)){_28[0]="../"+_28[0];}else{var _2a=d._getModulePrefix(_29);if(_2a!=_29){_28.splice(0,i,_2a);break;}}}return _28;};dojo._global_omit_module_check=false;dojo.loadInit=function(_2b){_2b();};dojo._loadModule=dojo.require=function(_2c,_2d){_2d=d._global_omit_module_check||_2d;var _2e=d._loadedModules[_2c];if(_2e){return _2e;}var _2f=d._getModuleSymbols(_2c).join("/")+".js";var _30=!_2d?_2c:null;var ok=d._loadPath(_2f,_30);if(!ok&&!_2d){throw new Error("Could not load '"+_2c+"'; last tried '"+_2f+"'");}if(!_2d&&!d._isXDomain){_2e=d._loadedModules[_2c];if(!_2e){throw new Error("symbol '"+_2c+"' is not defined after loading '"+_2f+"'");}}return _2e;};dojo.provide=function(_31){_31=_31+"";return (d._loadedModules[_31]=d.getObject(_31,true));};dojo.platformRequire=function(_32){var _33=_32.common||[];var _34=_33.concat(_32[d._name]||_32["default"]||[]);for(var x=0;x<_34.length;x++){var _35=_34[x];if(_35.constructor==Array){d._loadModule.apply(d,_35);}else{d._loadModule(_35);}}};dojo.requireIf=function(_36,_37){if(_36===true){var _38=[];for(var i=1;i<arguments.length;i++){_38.push(arguments[i]);}d.require.apply(d,_38);}};dojo.requireAfterIf=d.requireIf;dojo.registerModulePath=function(_39,_3a){d._modulePrefixes[_39]={name:_39,value:_3a};};dojo.requireLocalization=function(_3b,_3c,_3d,_3e){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,_3f=arguments,uri=[_3f[0]];for(var i=1;i<_3f.length;i++){if(!_3f[i]){continue;}var _40=new d._Url(_3f[i]+""),_41=new d._Url(uri[0]+"");if(_40.path==""&&!_40.scheme&&!_40.authority&&!_40.query){if(_40.fragment!=n){_41.fragment=_40.fragment;}_40=_41;}else{if(!_40.scheme){_40.scheme=_41.scheme;if(!_40.authority){_40.authority=_41.authority;if(_40.path.charAt(0)!="/"){var _42=_41.path.substring(0,_41.path.lastIndexOf("/")+1)+_40.path;var _43=_42.split("/");for(var j=0;j<_43.length;j++){if(_43[j]=="."){if(j==_43.length-1){_43[j]="";}else{_43.splice(j,1);j--;}}else{if(j>0&&!(j==1&&_43[0]=="")&&_43[j]==".."&&_43[j-1]!=".."){if(j==(_43.length-1)){_43.splice(j,1);_43[j-1]="";}else{_43.splice(j-1,2);j-=2;}}}}_40.path=_43.join("/");}}}}uri=[];if(_40.scheme){uri.push(_40.scheme,":");}if(_40.authority){uri.push("//",_40.authority);}uri.push(_40.path);if(_40.query){uri.push("?",_40.query);}if(_40.fragment){uri.push("#",_40.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(_44,url){var loc=d._getModuleSymbols(_44).join("/");if(!loc){return null;}if(loc.lastIndexOf("/")!=loc.length-1){loc+="/";}var _45=loc.indexOf(":");if(loc.charAt(0)!="/"&&(_45==-1||_45>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 _46=document.getElementsByTagName("script");var _47=/dojo(\.xd)?\.js(\W|$)/i;for(var i=0;i<_46.length;i++){var src=_46[i].getAttribute("src");if(!src){continue;}var m=src.match(_47);if(m){if(!d.config.baseUrl){d.config.baseUrl=src.substring(0,m.index);}var cfg=_46[i].getAttribute("djConfig");if(cfg){var _48=eval("({ "+cfg+" })");for(var x in _48){dojo.config[x]=_48[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 _49=Math.max(dav.indexOf("WebKit"),dav.indexOf("Safari"),0);if(_49&&!dojo.isChrome){d.isSafari=parseFloat(dav.split("Version/")[1]);if(!d.isSafari||parseFloat(dav.substr(_49+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 _4a=document.documentMode;if(_4a&&_4a!=5&&Math.floor(d.isIE)!=_4a){d.isIE=_4a;}}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 _4b,_4c;if(!dojo.isIE||!dojo.config.ieForceActiveXXhr){try{_4b=new XMLHttpRequest();}catch(e){}}if(!_4b){for(var i=0;i<3;++i){var _4d=d._XMLHTTP_PROGIDS[i];try{_4b=new ActiveXObject(_4d);}catch(e){_4c=e;}if(_4b){d._XMLHTTP_PROGIDS=[_4d];break;}}}if(!_4b){throw new Error("XMLHTTP not available: "+_4c);}return _4b;};d._isDocumentOk=function(_4e){var _4f=_4e.status||0,lp=location.protocol;return (_4f>=200&&_4f<300)||_4f==304||_4f==1223||(!_4f&&(lp=="file:"||lp=="chrome:"||lp=="chrome-extension:"||lp=="app:"));};var _50=window.location+"";var _51=document.getElementsByTagName("base");var _52=(_51&&_51.length>0);d._getText=function(uri,_53){var _54=d._xhrObj();if(!_52&&dojo._Url){uri=(new dojo._Url(_50,uri)).toString();}if(d.config.cacheBust){uri+="";uri+=(uri.indexOf("?")==-1?"?":"&")+String(d.config.cacheBust).replace(/\W+/g,"");}_54.open("GET",uri,false);try{_54.send(null);if(!d._isDocumentOk(_54)){var err=Error("Unable to load "+uri+" status:"+_54.status);err.status=_54.status;err.responseText=_54.responseText;throw err;}}catch(e){if(_53){return null;}throw e;}return _54.responseText;};var _55=window;var _56=function(_57,fp){var _58=_55.attachEvent||_55.addEventListener;_57=_55.attachEvent?_57:_57.substring(2);_58(_57,function(){fp.apply(_55,arguments);},false);};d._windowUnloaders=[];d.windowUnloaded=function(){var mll=d._windowUnloaders;while(mll.length){(mll.pop())();}d=null;};var _59=0;d.addOnWindowUnload=function(obj,_5a){d._onto(d._windowUnloaders,obj,_5a);if(!_59){_59=1;_56("onunload",d.windowUnloaded);}};var _5b=0;d.addOnUnload=function(obj,_5c){d._onto(d._unloaders,obj,_5c);if(!_5b){_5b=1;_56("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 _5d=["*","group","roundrect","oval","shape","rect","imagedata","path","textpath","text"],i=0,l=1,s=document.createStyleSheet();if(dojo.isIE>=8){i=1;l=_5d.length;}for(;i<l;++i){s.addRule("v\\:"+_5d[i],"behavior:url(#default#VML); display:inline-block");}})();}catch(e){}}}(function(){var mp=dojo.config["modulePaths"];if(mp){for(var _5e in mp){dojo.registerModulePath(_5e,mp[_5e]);}}})();if(dojo.config.isDebug){dojo.require("dojo._firebug.firebug");}if(dojo.config.debugAtAllCosts){dojo.config.useXDomain=true;dojo.require("dojo._base._loader.loader_xd");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,_5f=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 _5f.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(_60,_61){for(var i=1,l=arguments.length;i<l;i++){d._mixin(_60.prototype,arguments[i]);}return _60;};dojo._hitchArgs=function(_62,_63){var pre=d._toArray(arguments,2);var _64=d.isString(_63);return function(){var _65=d._toArray(arguments);var f=_64?(_62||d.global)[_63]:_63;return f&&f.apply(_62||this,pre.concat(_65));};};dojo.hitch=function(_66,_67){if(arguments.length>2){return d._hitchArgs.apply(d,arguments);}if(!_67){_67=_66;_66=null;}if(d.isString(_67)){_66=_66||d.global;if(!_66[_67]){throw (["dojo.hitch: scope[\"",_67,"\"] is null (scope=\"",_66,"\")"].join(""));}return function(){return _66[_67].apply(_66,arguments||[]);};}return !_66?_67:function(){return _67.apply(_66,arguments||[]);};};dojo.delegate=dojo._delegate=(function(){function TMP(){};return function(obj,_68){TMP.prototype=obj;var tmp=new TMP();TMP.prototype=null;if(_68){d._mixin(tmp,_68);}return tmp;};})();var _69=function(obj,_6a,_6b){return (_6b||[]).concat(Array.prototype.slice.call(obj,_6a||0));};var _6c=function(obj,_6d,_6e){var arr=_6e||[];for(var x=_6d||0;x<obj.length;x++){arr.push(obj[x]);}return arr;};dojo._toArray=d.isIE?function(obj){return ((obj.item)?_6c:_69).apply(this,arguments);}:_69;dojo.partial=function(_6f){var arr=[null];return d.hitch.apply(d,arr.concat(d._toArray(arguments)));};var _70=d._extraNames,_71=_70.length,_72={};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());}var r,i,l,s,_73;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(_73 in o){s=o[_73];if(!(_73 in r)||(r[_73]!==s&&(!(_73 in _72)||_72[_73]!==s))){r[_73]=d.clone(s);}}if(_71){for(i=0;i<_71;++i){_73=_70[i];s=o[_73];if(!(_73 in r)||(r[_73]!==s&&(!(_73 in _72)||_72[_73]!==s))){r[_73]=s;}}}return r;};dojo.trim=String.prototype.trim?function(str){return str.trim();}:function(str){return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");};var _74=/\{([^\}]+)\}/g;dojo.replace=function(_75,map,_76){return _75.replace(_76||_74,d.isFunction(map)?map:function(_77,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 _78=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 _79=function(_7a,arr,_7b,_7c){var _7d=_78(arr,_7c,_7b);arr=_7d[0];for(var i=0,l=arr.length;i<l;++i){var _7e=!!_7d[2].call(_7d[1],arr[i],i,arr);if(_7a^_7e){return _7e;}}return _7a;};dojo.mixin(dojo,{indexOf:function(_7f,_80,_81,_82){var _83=1,end=_7f.length||0,i=0;if(_82){i=end-1;_83=end=-1;}if(_81!=undefined){i=_81;}if((_82&&i>end)||i<end){for(;i!=end;i+=_83){if(_7f[i]==_80){return i;}}}return -1;},lastIndexOf:function(_84,_85,_86){return dojo.indexOf(_84,_85,_86,true);},forEach:function(arr,_87,_88){if(!arr||!arr.length){return;}var _89=_78(arr,_88,_87);arr=_89[0];for(var i=0,l=arr.length;i<l;++i){_89[2].call(_89[1],arr[i],i,arr);}},every:function(arr,_8a,_8b){return _79(true,arr,_8a,_8b);},some:function(arr,_8c,_8d){return _79(false,arr,_8c,_8d);},map:function(arr,_8e,_8f){var _90=_78(arr,_8f,_8e);arr=_90[0];var _91=(arguments[3]?(new arguments[3]()):[]);for(var i=0,l=arr.length;i<l;++i){_91.push(_90[2].call(_90[1],arr[i],i,arr));}return _91;},filter:function(arr,_92,_93){var _94=_78(arr,_93,_92);arr=_94[0];var _95=[];for(var i=0,l=arr.length;i<l;++i){if(_94[2].call(_94[1],arr[i],i,arr)){_95.push(arr[i]);}}return _95;}});})();}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,_96=op.toString,_97=new Function,_98=0,_99="constructor";function err(msg){throw new Error("declare: "+msg);};function _9a(_9b){var _9c=[],_9d=[{cls:0,refs:[]}],_9e={},_9f=1,l=_9b.length,i=0,j,lin,_a0,top,_a1,rec,_a2,_a3;for(;i<l;++i){_a0=_9b[i];if(!_a0){err("mixin #"+i+" is unknown. Did you use dojo.require to pull it in?");}else{if(_96.call(_a0)!="[object Function]"){err("mixin #"+i+" is not a callable constructor.");}}lin=_a0._meta?_a0._meta.bases:[_a0];top=0;for(j=lin.length-1;j>=0;--j){_a1=lin[j].prototype;if(!_a1.hasOwnProperty("declaredClass")){_a1.declaredClass="uniqName_"+(_98++);}_a2=_a1.declaredClass;if(!_9e.hasOwnProperty(_a2)){_9e[_a2]={count:0,refs:[],cls:lin[j]};++_9f;}rec=_9e[_a2];if(top&&top!==rec){rec.refs.push(top);++top.count;}top=rec;}++top.count;_9d[0].refs.push(top);}while(_9d.length){top=_9d.pop();_9c.push(top.cls);--_9f;while(_a3=top.refs,_a3.length==1){top=_a3[0];if(!top||--top.count){top=0;break;}_9c.push(top.cls);--_9f;}if(top){for(i=0,l=_a3.length;i<l;++i){top=_a3[i];if(!--top.count){_9d.push(top);}}}}if(_9f){err("can't build consistent linearization");}_a0=_9b[0];_9c[0]=_a0?_a0._meta&&_a0===_9c[_9c.length-_a0._meta.bases.length]?_a0._meta.bases.length:1:0;return _9c;};function _a4(_a5,a,f){var _a6,_a7,_a8,_a9,_aa,_ab,_ac,opf,pos,_ad=this._inherited=this._inherited||{};if(typeof _a5=="string"){_a6=_a5;_a5=a;a=f;}f=0;_a9=_a5.callee;_a6=_a6||_a9.nom;if(!_a6){err("can't deduce a name to call inherited()");}_aa=this.constructor._meta;_a8=_aa.bases;pos=_ad.p;if(_a6!=_99){if(_ad.c!==_a9){pos=0;_ab=_a8[0];_aa=_ab._meta;if(_aa.hidden[_a6]!==_a9){_a7=_aa.chains;if(_a7&&typeof _a7[_a6]=="string"){err("calling chained method with inherited: "+_a6);}do{_aa=_ab._meta;_ac=_ab.prototype;if(_aa&&(_ac[_a6]===_a9&&_ac.hasOwnProperty(_a6)||_aa.hidden[_a6]===_a9)){break;}}while(_ab=_a8[++pos]);pos=_ab?pos:-1;}}_ab=_a8[++pos];if(_ab){_ac=_ab.prototype;if(_ab._meta&&_ac.hasOwnProperty(_a6)){f=_ac[_a6];}else{opf=op[_a6];do{_ac=_ab.prototype;f=_ac[_a6];if(f&&(_ab._meta?_ac.hasOwnProperty(_a6):f!==opf)){break;}}while(_ab=_a8[++pos]);}}f=_ab&&f||op[_a6];}else{if(_ad.c!==_a9){pos=0;_aa=_a8[0]._meta;if(_aa&&_aa.ctor!==_a9){_a7=_aa.chains;if(!_a7||_a7.constructor!=="manual"){err("calling chained constructor with inherited");}while(_ab=_a8[++pos]){_aa=_ab._meta;if(_aa&&_aa.ctor===_a9){break;}}pos=_ab?pos:-1;}}while(_ab=_a8[++pos]){_aa=_ab._meta;f=_aa?_aa.ctor:_ab;if(f){break;}}f=_ab&&f;}_ad.c=f;_ad.p=pos;if(f){return a===true?f:f.apply(this,a||_a5);}};function _ae(_af,_b0){if(typeof _af=="string"){return this.inherited(_af,_b0,true);}return this.inherited(_af,true);};function _b1(cls){var _b2=this.constructor._meta.bases;for(var i=0,l=_b2.length;i<l;++i){if(_b2[i]===cls){return true;}}return this instanceof cls;};function _b3(_b4,_b5){var _b6,i=0,l=d._extraNames.length;for(_b6 in _b5){if(_b6!=_99&&_b5.hasOwnProperty(_b6)){_b4[_b6]=_b5[_b6];}}for(;i<l;++i){_b6=d._extraNames[i];if(_b6!=_99&&_b5.hasOwnProperty(_b6)){_b4[_b6]=_b5[_b6];}}};function _b7(_b8,_b9){var _ba,t,i=0,l=d._extraNames.length;for(_ba in _b9){t=_b9[_ba];if((t!==op[_ba]||!(_ba in op))&&_ba!=_99){if(_96.call(t)=="[object Function]"){t.nom=_ba;}_b8[_ba]=t;}}for(;i<l;++i){_ba=d._extraNames[i];t=_b9[_ba];if((t!==op[_ba]||!(_ba in op))&&_ba!=_99){if(_96.call(t)=="[object Function]"){t.nom=_ba;}_b8[_ba]=t;}}return _b8;};function _bb(_bc){_b7(this.prototype,_bc);return this;};function _bd(_be,_bf){return function(){var a=arguments,_c0=a,a0=a[0],f,i,m,l=_be.length,_c1;if(!(this instanceof a.callee)){return _c2(a);}if(_bf&&(a0&&a0.preamble||this.preamble)){_c1=new Array(_be.length);_c1[0]=a;for(i=0;;){a0=a[0];if(a0){f=a0.preamble;if(f){a=f.apply(this,a)||a;}}f=_be[i].prototype;f=f.hasOwnProperty("preamble")&&f.preamble;if(f){a=f.apply(this,a)||a;}if(++i==l){break;}_c1[i]=a;}}for(i=l-1;i>=0;--i){f=_be[i];m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,_c1?_c1[i]:a);}}f=this.postscript;if(f){f.apply(this,_c0);}};};function _c3(_c4,_c5){return function(){var a=arguments,t=a,a0=a[0],f;if(!(this instanceof a.callee)){return _c2(a);}if(_c5){if(a0){f=a0.preamble;if(f){t=f.apply(this,t)||t;}}f=this.preamble;if(f){f.apply(this,t);}}if(_c4){_c4.apply(this,a);}f=this.postscript;if(f){f.apply(this,a);}};};function _c6(_c7){return function(){var a=arguments,i=0,f,m;if(!(this instanceof a.callee)){return _c2(a);}for(;f=_c7[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 _c8(_c9,_ca,_cb){return function(){var b,m,f,i=0,_cc=1;if(_cb){i=_ca.length-1;_cc=-1;}for(;b=_ca[i];i+=_cc){m=b._meta;f=(m?m.hidden:b.prototype)[_c9];if(f){f.apply(this,arguments);}}};};function _cd(_ce){_97.prototype=_ce.prototype;var t=new _97;_97.prototype=null;return t;};function _c2(_cf){var _d0=_cf.callee,t=_cd(_d0);_d0.apply(t,_cf);return t;};d.declare=function(_d1,_d2,_d3){if(typeof _d1!="string"){_d3=_d2;_d2=_d1;_d1="";}_d3=_d3||{};var _d4,i,t,_d5,_d6,_d7,_d8,_d9=1,_da=_d2;if(_96.call(_d2)=="[object Array]"){_d7=_9a(_d2);t=_d7[0];_d9=_d7.length-t;_d2=_d7[_d9];}else{_d7=[0];if(_d2){if(_96.call(_d2)=="[object Function]"){t=_d2._meta;_d7=_d7.concat(t?t.bases:_d2);}else{err("base class is not a callable constructor.");}}else{if(_d2!==null){err("unknown base class. Did you use dojo.require to pull it in?");}}}if(_d2){for(i=_d9-1;;--i){_d4=_cd(_d2);if(!i){break;}t=_d7[i];(t._meta?_b3:mix)(_d4,t.prototype);_d5=new Function;_d5.superclass=_d2;_d5.prototype=_d4;_d2=_d4.constructor=_d5;}}else{_d4={};}_b7(_d4,_d3);t=_d3.constructor;if(t!==op.constructor){t.nom=_99;_d4.constructor=t;}for(i=_d9-1;i;--i){t=_d7[i]._meta;if(t&&t.chains){_d8=mix(_d8||{},t.chains);}}if(_d4["-chains-"]){_d8=mix(_d8||{},_d4["-chains-"]);}t=!_d8||!_d8.hasOwnProperty(_99);_d7[0]=_d5=(_d8&&_d8.constructor==="manual")?_c6(_d7):(_d7.length==1?_c3(_d3.constructor,t):_bd(_d7,t));_d5._meta={bases:_d7,hidden:_d3,chains:_d8,parents:_da,ctor:_d3.constructor};_d5.superclass=_d2&&_d2.prototype;_d5.extend=_bb;_d5.prototype=_d4;_d4.constructor=_d5;_d4.getInherited=_ae;_d4.inherited=_a4;_d4.isInstanceOf=_b1;if(_d1){_d4.declaredClass=_d1;d.setObject(_d1,_d5);}if(_d8){for(_d6 in _d8){if(_d4[_d6]&&typeof _d8[_d6]=="string"&&_d6!=_99){t=_d4[_d6]=_c8(_d6,_d7,_d8[_d6]==="after");t.nom=_d6;}}}return _d5;};d.safeMixin=_b7;})();}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;var r=t&&t.apply(this,arguments);var i,lls;lls=[].concat(ls);for(i in lls){if(!(i in ap)){lls[i].apply(this,arguments);}}return r;};},add:function(_db,_dc,_dd){_db=_db||dojo.global;var f=_db[_dc];if(!f||!f._listeners){var d=dojo._listener.getDispatcher();d.target=f;d._listeners=[];f=_db[_dc]=d;}return f._listeners.push(_dd);},remove:function(_de,_df,_e0){var f=(_de||dojo.global)[_df];if(f&&f._listeners&&_e0--){delete f._listeners[_e0];}}};dojo.connect=function(obj,_e1,_e2,_e3,_e4){var a=arguments,_e5=[],i=0;_e5.push(dojo.isString(a[0])?null:a[i++],a[i++]);var a1=a[i+1];_e5.push(dojo.isString(a1)||dojo.isFunction(a1)?a[i++]:null,a[i++]);for(var l=a.length;i<l;i++){_e5.push(a[i]);}return dojo._connect.apply(this,_e5);};dojo._connect=function(obj,_e6,_e7,_e8){var l=dojo._listener,h=l.add(obj,_e6,dojo.hitch(_e7,_e8));return [obj,_e6,h,l];};dojo.disconnect=function(_e9){if(_e9&&_e9[0]!==undefined){dojo._disconnect.apply(this,_e9);delete _e9[0];}};dojo._disconnect=function(obj,_ea,_eb,_ec){_ec.remove(obj,_ea,_eb);};dojo._topics={};dojo.subscribe=function(_ed,_ee,_ef){return [_ed,dojo._listener.add(dojo._topics,_ed,dojo.hitch(_ee,_ef))];};dojo.unsubscribe=function(_f0){if(_f0){dojo._listener.remove(dojo._topics,_f0[0],_f0[1]);}};dojo.publish=function(_f1,_f2){var f=dojo._topics[_f1];if(f){f.apply(this,_f2||[]);}};dojo.connectPublisher=function(_f3,obj,_f4){var pf=function(){dojo.publish(_f3,arguments);};return _f4?dojo.connect(obj,_f4,pf):dojo.connect(obj,pf);};}if(!dojo._hasResource["dojo._base.Deferred"]){dojo._hasResource["dojo._base.Deferred"]=true;dojo.provide("dojo._base.Deferred");(function(){var _f5=function(){};var _f6=Object.freeze||function(){};dojo.Deferred=function(_f7){var _f8,_f9,_fa,_fb,_fc;var _fd=this.promise={};function _fe(_ff){if(_f9){throw new Error("This deferred has already been resolved");}_f8=_ff;_f9=true;_100();};function _100(){var _101;while(!_101&&_fc){var _102=_fc;_fc=_fc.next;if(_101=(_102.progress==_f5)){_f9=false;}var func=(_fa?_102.error:_102.resolved);if(func){try{var _103=func(_f8);if(_103&&typeof _103.then==="function"){_103.then(dojo.hitch(_102.deferred,"resolve"),dojo.hitch(_102.deferred,"reject"));continue;}var _104=_101&&_103===undefined;_102.deferred[_104&&_fa?"reject":"resolve"](_104?_f8:_103);}catch(e){_102.deferred.reject(e);}}else{if(_fa){_102.deferred.reject(_f8);}else{_102.deferred.resolve(_f8);}}}};this.resolve=this.callback=function(_105){this.fired=0;this.results=[_105,null];_fe(_105);};this.reject=this.errback=function(_106){_fa=true;this.fired=1;_fe(_106);this.results=[null,_106];if(!_106||_106.log!==false){(dojo.config.deferredOnError||function(x){console.error(x);})(_106);}};this.progress=function(_107){var _108=_fc;while(_108){var _109=_108.progress;_109&&_109(_107);_108=_108.next;}};this.addCallbacks=function(_10a,_10b){this.then(_10a,_10b,_f5);return this;};this.then=_fd.then=function(_10c,_10d,_10e){var _10f=_10e==_f5?this:new dojo.Deferred(_fd.cancel);var _110={resolved:_10c,error:_10d,progress:_10e,deferred:_10f};if(_fc){_fb=_fb.next=_110;}else{_fc=_fb=_110;}if(_f9){_100();}return _10f.promise;};var _111=this;this.cancel=_fd.cancel=function(){if(!_f9){var _112=_f7&&_f7(_111);if(!_f9){if(!(_112 instanceof Error)){_112=new Error(_112);}_112.log=false;_111.reject(_112);}}};_f6(_fd);};dojo.extend(dojo.Deferred,{addCallback:function(_113){return this.addCallbacks(dojo.hitch.apply(dojo,arguments));},addErrback:function(_114){return this.addCallbacks(null,dojo.hitch.apply(dojo,arguments));},addBoth:function(_115){var _116=dojo.hitch.apply(dojo,arguments);return this.addCallbacks(_116,_116);},fired:-1});})();dojo.when=function(_117,_118,_119,_11a){if(_117&&typeof _117.then==="function"){return _117.then(_118,_119,_11a);}return _118(_117);};}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,_11b,_11c){if(it===undefined){return "undefined";}var _11d=typeof it;if(_11d=="number"||_11d=="boolean"){return it+"";}if(it===null){return "null";}if(dojo.isString(it)){return dojo._escapeString(it);}var _11e=arguments.callee;var _11f;_11c=_11c||"";var _120=_11b?_11c+dojo.toJsonIndentStr:"";var tf=it.__json__||it.json;if(dojo.isFunction(tf)){_11f=tf.call(it);if(it!==_11f){return _11e(_11f,_11b,_120);}}if(it.nodeType&&it.cloneNode){throw new Error("Can't serialize DOM nodes");}var sep=_11b?" ":"";var _121=_11b?"\n":"";if(dojo.isArray(it)){var res=dojo.map(it,function(obj){var val=_11e(obj,_11b,_120);if(typeof val!="string"){val="undefined";}return _121+_120+val;});return "["+res.join(","+sep)+_121+_11c+"]";}if(_11d=="function"){return null;}var _122=[],key;for(key in it){var _123,val;if(typeof key=="number"){_123="\""+key+"\"";}else{if(typeof key=="string"){_123=dojo._escapeString(key);}else{continue;}}val=_11e(it[key],_11b,_120);if(typeof val!="string"){continue;}_122.push(_121+_120+_123+":"+sep+val);}return "{"+_122.join(","+sep)+_121+_11c+"}";};}if(!dojo._hasResource["dojo._base.Color"]){dojo._hasResource["dojo._base.Color"]=true;dojo.provide("dojo._base.Color");(function(){var d=dojo;dojo.Color=function(_124){if(_124){this.setColor(_124);}};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(_125){if(d.isString(_125)){d.colorFromString(_125,this);}else{if(d.isArray(_125)){d.colorFromArray(_125,this);}else{this._set(_125.r,_125.g,_125.b,_125.a);if(!(_125 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(_126){var t=this,rgb=t.r+", "+t.g+", "+t.b;return (_126?"rgba("+rgb+", "+t.a:"rgb("+rgb)+")";},toString:function(){return this.toCss(true);}});dojo.blendColors=function(_127,end,_128,obj){var t=obj||new d.Color();d.forEach(["r","g","b","a"],function(x){t[x]=_127[x]+(end[x]-_127[x])*_128;if(x!="a"){t[x]=Math.round(t[x]);}});return t.sanitize();};dojo.colorFromRgb=function(_129,obj){var m=_129.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);return m&&dojo.colorFromArray(m[1].split(/\s*,\s*/),obj);};dojo.colorFromHex=function(_12a,obj){var t=obj||new d.Color(),bits=(_12a.length==4)?4:8,mask=(1<<bits)-1;_12a=Number("0x"+_12a.substr(1));if(isNaN(_12a)){return null;}d.forEach(["b","g","r"],function(x){var c=_12a&mask;_12a>>=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"]){dojo._hasResource["dojo._base"]=true;dojo.provide("dojo._base");}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(_12b,_12c){dojo.global=_12b;dojo.doc=_12c;};dojo.withGlobal=function(_12d,_12e,_12f,_130){var _131=dojo.global;try{dojo.global=_12d;return dojo.withDoc.call(null,_12d.document,_12e,_12f,_130);}finally{dojo.global=_131;}};dojo.withDoc=function(_132,_133,_134,_135){var _136=dojo.doc,_137=dojo._bodyLtr,oldQ=dojo.isQuirks;try{dojo.doc=_132;delete dojo._bodyLtr;dojo.isQuirks=dojo.doc.compatMode=="BackCompat";if(_134&&typeof _133=="string"){_133=_134[_133];}return _133.apply(_134,_135||[]);}finally{dojo.doc=_136;delete dojo._bodyLtr;if(_137!==undefined){dojo._bodyLtr=_137;}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);var _138=name;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,_139,_13a){if(node){_139=del._normalizeEventName(_139);if(!dojo.isIE&&(_139=="mouseenter"||_139=="mouseleave")){_139=(_139=="mouseenter")?"mouseover":"mouseout";}node.removeEventListener(_139,_13a,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,_13b){switch(evt.type){case "keypress":del._setKeyChar(evt);break;}return evt;},_setKeyChar:function(evt){evt.keyChar=evt.charCode?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,_13c){return del._fixEvent(evt,_13c);};dojo.stopEvent=function(evt){evt.preventDefault();evt.stopPropagation();};var _13d=dojo._listener;dojo._connect=function(obj,_13e,_13f,_140,_141){var _142=obj&&(obj.nodeType||obj.attachEvent||obj.addEventListener);var lid=_142?(_141?2:1):0,l=[dojo._listener,del,_13d][lid];var h=l.add(obj,_13e,dojo.hitch(_13f,_140));return [obj,_13e,h,lid];};dojo._disconnect=function(obj,_143,_144,_145){([dojo._listener,del,_13d][_145]).remove(obj,_143,_144);};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 _146=dojo.isMac?"metaKey":"ctrlKey";dojo.isCopyKey=function(e){return e[_146];};if(dojo.isIE){dojo.mouseButtons={LEFT:1,MIDDLE:4,RIGHT:2,isButton:function(e,_147){return e.button&_147;},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,_148){return e.button==_148;},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 _149=function(e,code){try{return (e.keyCode=code);}catch(e){return 0;}};var iel=dojo._listener;var _14a=(dojo._ieListenersName="_"+dojo._scopeName+"_listeners");if(!dojo.config._allow_leaks){_13d=iel=dojo._ie_listener={handlers:[],add:function(_14b,_14c,_14d){_14b=_14b||dojo.global;var f=_14b[_14c];if(!f||!f[_14a]){var d=dojo._getIeDispatcher();d.target=f&&(ieh.push(f)-1);d[_14a]=[];f=_14b[_14c]=d;}return f[_14a].push(ieh.push(_14d)-1);},remove:function(_14e,_14f,_150){var f=(_14e||dojo.global)[_14f],l=f&&f[_14a];if(f&&l&&_150--){delete ieh[l[_150]];delete l[_150];}}};var ieh=iel.handlers;}dojo.mixin(del,{add:function(node,_151,fp){if(!node){return;}_151=del._normalizeEventName(_151);if(_151=="onkeypress"){var kd=node.onkeydown;if(!kd||!kd[_14a]||!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,_151,del._fixCallback(fp));},remove:function(node,_152,_153){_152=del._normalizeEventName(_152);iel.remove(node,_152,_153);if(_152=="onkeypress"){var kd=node.onkeydown;if(--kd._stealthKeydownRefs<=0){iel.remove(node,"onkeydown",kd._stealthKeydownHandle);delete kd._stealthKeydownHandle;}}},_normalizeEventName:function(_154){return _154.slice(0,2)!="on"?"on"+_154:_154;},_nop:function(){},_fixEvent:function(evt,_155){if(!evt){var w=_155&&(_155.ownerDocument||_155.document||_155).parentWindow||window;evt=w.event;}if(!evt){return (evt);}evt.target=evt.srcElement;evt.currentTarget=(_155||evt.srcElement);evt.layerX=evt.offsetX;evt.layerY=evt.offsetY;var se=evt.srcElement,doc=(se&&se.ownerDocument)||document;var _156=((dojo.isIE<6)||(doc["compatMode"]=="BackCompat"))?doc.body:doc.documentElement;var _157=dojo._getIeDocumentElementOffset();evt.pageX=evt.clientX+dojo._fixIeBiDiScrollLeft(_156.scrollLeft||0)-_157.x;evt.pageY=evt.clientY+(_156.scrollTop||0)-_157.y;if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}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[_14a]){return;}var k=evt.keyCode;var _158=k!=13&&k!=32&&k!=27&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);if(_158||evt.ctrlKey){var c=_158?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);evt.cancelBubble=faux.cancelBubble;evt.returnValue=faux.returnValue;_149(evt,faux.keyCode);}},_stopPropagation:function(){this.cancelBubble=true;},_preventDefault:function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){_149(this,0);}this.returnValue=false;}});dojo.stopEvent=function(evt){evt=evt||window.event;del._stopPropagation.call(evt);del._preventDefault.call(evt);};}del._synthesizeEvent=function(evt,_159){var faux=dojo.mixin({},evt,_159);del._setKeyChar(faux);faux.preventDefault=function(){evt.preventDefault();};faux.stopPropagation=function(){evt.stopPropagation();};return faux;};if(dojo.isOpera){dojo.mixin(del,{_fixEvent:function(evt,_15a){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,_15b,fp){if(!node){return;}var _15c=del._add(node,_15b,fp);if(del._normalizeEventName(_15b)=="keypress"){_15c._stealthKeyDownHandle=del._add(node,"keydown",function(evt){var k=evt.keyCode;var _15d=k!=13&&k!=32&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);if(_15d||evt.ctrlKey){var c=_15d?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 _15c;},remove:function(node,_15e,_15f){if(node){if(_15f._stealthKeyDownHandle){del._remove(node,"keydown",_15f._stealthKeyDownHandle);}del._remove(node,_15e,_15f);}},_fixEvent:function(evt,_160){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,_161){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(_161,args);var lls=[].concat(ls);for(var i in lls){var f=h[lls[i]];if(!(i in ap)&&f){f.apply(_161,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.isOpera){dojo.byId=function(id,doc){if(typeof id!="string"){return id;}var _162=doc||dojo.doc,te=_162.getElementById(id);if(te&&(te.attributes.id.value==id||te.id==id)){return te;}else{var eles=_162.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;};}(function(){var d=dojo;var byId=d.byId;var _163=null,_164;d.addOnWindowUnload(function(){_163=null;});dojo._destroyElement=dojo.destroy=function(node){node=byId(node);try{var doc=node.ownerDocument;if(!_163||_164!=doc){_163=doc.createElement("div");_164=doc;}_163.appendChild(node.parentNode?node.parentNode.removeChild(node):node);_163.innerHTML="";}catch(e){}};dojo.isDescendant=function(node,_165){try{node=byId(node);_165=byId(_165);while(node){if(node==_165){return true;}node=node.parentNode;}}catch(e){}return false;};dojo.setSelectable=function(node,_166){node=byId(node);if(d.isMozilla){node.style.MozUserSelect=_166?"":"none";}else{if(d.isKhtml||d.isWebKit){node.style.KhtmlUserSelect=_166?"auto":"none";}else{if(d.isIE){var v=(node.unselectable=_166?"":"on");d.query("*",node).forEach("item.unselectable = '"+v+"'");}}}};var _167=function(node,ref){var _168=ref.parentNode;if(_168){_168.insertBefore(node,ref);}};var _169=function(node,ref){var _16a=ref.parentNode;if(_16a){if(_16a.lastChild==ref){_16a.appendChild(node);}else{_16a.insertBefore(node,ref.nextSibling);}}};dojo.place=function(node,_16b,_16c){_16b=byId(_16b);if(typeof node=="string"){node=node.charAt(0)=="<"?d._toDom(node,_16b.ownerDocument):byId(node);}if(typeof _16c=="number"){var cn=_16b.childNodes;if(!cn.length||cn.length<=_16c){_16b.appendChild(node);}else{_167(node,cn[_16c<0?0:_16c]);}}else{switch(_16c){case "before":_167(node,_16b);break;case "after":_169(node,_16b);break;case "replace":_16b.parentNode.replaceChild(node,_16b);break;case "only":d.empty(_16b);_16b.appendChild(node);break;case "first":if(_16b.firstChild){_167(node,_16b.firstChild);break;}default:_16b.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(_16d,_16e){return parseFloat(_16e)||0;};}else{d._toPixelValue=function(_16f,_170){if(!_170){return 0;}if(_170=="medium"){return 4;}if(_170.slice&&_170.slice(-2)=="px"){return parseFloat(_170);}with(_16f){var _171=style.left;var _172=runtimeStyle.left;runtimeStyle.left=currentStyle.left;try{style.left=_170;_170=style.pixelLeft;}catch(e){_170=0;}style.left=_171;runtimeStyle.left=_172;}return _170;};}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?function(node){try{return af(node).Opacity/100;}catch(e){return 1;}}:function(node){return gcs(node).opacity;};dojo._setOpacity=d.isIE?function(node,_173){var ov=_173*100,_174=_173==1;node.style.zoom=_174?"":1;if(!af(node)){if(_174){return _173;}node.style.filter+=" progid:"+astr+"(Opacity="+ov+")";}else{af(node,1).Opacity=ov;}af(node,1).Enabled=!_174;if(node.nodeName.toLowerCase()=="tr"){d.query("> td",node).forEach(function(i){d._setOpacity(i,_173);});}return _173;}:function(node,_175){return node.style.opacity=_175;};var _176={left:true,top:true};var _177=/margin|padding|width|height|max|min|offset/;var _178=function(node,type,_179){type=type.toLowerCase();if(d.isIE){if(_179=="auto"){if(type=="height"){return node.offsetHeight;}if(type=="width"){return node.offsetWidth;}}if(type=="fontweight"){switch(_179){case 700:return "bold";case 400:default:return "normal";}}}if(!(type in _176)){_176[type]=_177.test(type);}return _176[type]?px(node,_179):_179;};var _17a=d.isIE?"styleFloat":"cssFloat",_17b={"cssFloat":_17a,"styleFloat":_17a,"float":_17a};dojo.style=function(node,_17c,_17d){var n=byId(node),args=arguments.length,op=(_17c=="opacity");_17c=_17b[_17c]||_17c;if(args==3){return op?d._setOpacity(n,_17d):n.style[_17c]=_17d;}if(args==2&&op){return d._getOpacity(n);}var s=gcs(n);if(args==2&&typeof _17c!="string"){for(var x in _17c){d.style(node,x,_17c[x]);}return s;}return (args==1)?s:_178(n,_17c,s[_17c]||n.style[_17c]);};dojo._getPadExtents=function(n,_17e){var s=_17e||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,_17f){var ne="none",s=_17f||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,_180){var s=_180||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,_181){var s=_181||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,_182){var s=_182||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._getContentBox=function(node,_183){var s=_183||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,_184){var s=_184||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,_185,_186,_187){if(d._usesBorderBox(node)){var pb=d._getPadBorderExtents(node,_187);if(_185>=0){_185+=pb.w;}if(_186>=0){_186+=pb.h;}}d._setBox(node,NaN,NaN,_185,_186);};dojo._setMarginBox=function(node,_188,_189,_18a,_18b,_18c){var s=_18c||gcs(node),bb=d._usesBorderBox(node),pb=bb?_18d:d._getPadBorderExtents(node,s);if(d.isWebKit){if(d._isButtonTag(node)){var ns=node.style;if(_18a>=0&&!ns.width){ns.width="4px";}if(_18b>=0&&!ns.height){ns.height="4px";}}}var mb=d._getMarginExtents(node,s);if(_18a>=0){_18a=Math.max(_18a-pb.w-mb.w,0);}if(_18b>=0){_18b=Math.max(_18b-pb.h-mb.h,0);}d._setBox(node,_188,_189,_18a,_18b);};var _18d={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 _18e=function(node,prop){if(!(node=(node||0).parentNode)){return 0;}var val,_18f=0,_190=d.body();while(node&&node.style){if(gcs(node).position=="fixed"){return 0;}val=node[prop];if(val){_18f+=val-0;if(node==_190){break;}}node=node.parentNode;}return _18f;};dojo._docScroll=function(){var n=d.global;return "pageXOffset" in n?{x:n.pageXOffset,y:n.pageYOffset}:(n=d.doc.documentElement,n.clientHeight?{x:d._fixIeBiDiScrollLeft(n.scrollLeft),y:n.scrollTop}:(n=d.body(),{x: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(_191){var dd=d.doc;if(d.isIE<8&&!d._isBodyLtr()){var de=d.isQuirks?dd.body:dd.documentElement;return _191+de.clientWidth-de.scrollWidth;}return _191;};dojo._abs=dojo.position=function(node,_192){var db=d.body(),dh=db.parentNode,ret;node=byId(node);if(node["getBoundingClientRect"]){ret=node.getBoundingClientRect();ret={x:ret.left,y:ret.top,w:ret.right-ret.left,h:ret.bottom-ret.top};if(d.isIE){var _193=d._getIeDocumentElementOffset();ret.x-=_193.x+(d.isQuirks?db.clientLeft+db.offsetLeft:0);ret.y-=_193.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);}}}else{ret={x:0,y:0,w:node.offsetWidth,h:node.offsetHeight};if(node["offsetParent"]){ret.x-=_18e(node,"scrollLeft");ret.y-=_18e(node,"scrollTop");var _194=node;do{var n=_194.offsetLeft,t=_194.offsetTop;ret.x+=isNaN(n)?0:n;ret.y+=isNaN(t)?0:t;cs=gcs(_194);if(_194!=node){if(d.isMoz){ret.x+=2*px(_194,cs.borderLeftWidth);ret.y+=2*px(_194,cs.borderTopWidth);}else{ret.x+=px(_194,cs.borderLeftWidth);ret.y+=px(_194,cs.borderTopWidth);}}if(d.isMoz&&cs.position=="static"){var _195=_194.parentNode;while(_195!=_194.offsetParent){var pcs=gcs(_195);if(pcs.position=="static"){ret.x+=px(_194,pcs.borderLeftWidth);ret.y+=px(_194,pcs.borderTopWidth);}_195=_195.parentNode;}}_194=_194.offsetParent;}while((_194!=dh)&&_194);}else{if(node.x&&node.y){ret.x+=isNaN(node.x)?0:node.x;ret.y+=isNaN(node.y)?0:node.y;}}}if(_192){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){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=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,_1b7){node=byId(node);_1b7=_1b6(_1b7);var cls=node[_1b3],_1b8;cls=cls?" "+cls+" ":" ";_1b8=cls.length;for(var i=0,len=_1b7.length,c;i<len;++i){c=_1b7[i];if(c&&cls.indexOf(" "+c+" ")<0){cls+=c+" ";}}if(_1b8<cls.length){node[_1b3]=cls.substr(1,cls.length-2);}};dojo.removeClass=function(node,_1b9){node=byId(node);var cls;if(_1b9!==undefined){_1b9=_1b6(_1b9);cls=" "+node[_1b3]+" ";for(var i=0,len=_1b9.length;i<len;++i){cls=cls.replace(" "+_1b9[i]+" "," ");}cls=d.trim(cls);}else{cls="";}if(node[_1b3]!=cls){node[_1b3]=cls;}};dojo.toggleClass=function(node,_1ba,_1bb){if(_1bb===undefined){_1bb=!d.hasClass(node,_1ba);}d[_1bb?"addClass":"removeClass"](node,_1ba);};})();}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,_1bc,_1bd){if(!a.sort){a=aps.call(a,0);}var ctor=_1bd||this._NodeListCtor||d._NodeListCtor;a.constructor=ctor;dojo._mixin(a,ctor.prototype);a._NodeListCtor=ctor;return _1bc?a._stash(_1bc):a;};var _1be=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 _1bf=function(f,o){return function(){this.forEach(_1be(f,arguments,o));return this;};};var _1c0=function(f,o){return function(){return this.map(_1be(f,arguments,o));};};var _1c1=function(f,o){return function(){return this.filter(_1be(f,arguments,o));};};var _1c2=function(f,g,o){return function(){var a=arguments,body=_1be(f,a,o);if(g.call(o||d.global,a)){return this.map(body);}this.forEach(body);return this;};};var _1c3=function(a){return a.length==1&&(typeof a[0]=="string");};var _1c4=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=_1c0;nl._adaptAsForEach=_1bf;nl._adaptAsFilter=_1c1;nl._adaptWithCondition=_1c2;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]=_1c2(d[name],_1c3);});d.forEach(["connect","addClass","removeClass","toggleClass","empty","removeAttr"],function(name){nlp[name]=_1bf(d[name]);});dojo.extend(dojo.NodeList,{_normalize:function(_1c5,_1c6){var _1c7=_1c5.parse===true?true:false;if(typeof _1c5.template=="string"){var _1c8=_1c5.templateFunc||(dojo.string&&dojo.string.substitute);_1c5=_1c8?_1c8(_1c5.template,_1c5):_1c5;}var type=(typeof _1c5);if(type=="string"||type=="number"){_1c5=dojo._toDom(_1c5,(_1c6&&_1c6.ownerDocument));if(_1c5.nodeType==11){_1c5=dojo._toArray(_1c5.childNodes);}else{_1c5=[_1c5];}}else{if(!dojo.isArrayLike(_1c5)){_1c5=[_1c5];}else{if(!dojo.isArray(_1c5)){_1c5=dojo._toArray(_1c5);}}}if(_1c7){_1c5._runParse=true;}return _1c5;},_cloneNode:function(node){return node.cloneNode(true);},_place:function(ary,_1c9,_1ca,_1cb){if(_1c9.nodeType!=1&&_1ca=="only"){return;}var _1cc=_1c9,_1cd;var _1ce=ary.length;for(var i=_1ce-1;i>=0;i--){var node=(_1cb?this._cloneNode(ary[i]):ary[i]);if(ary._runParse&&dojo.parser&&dojo.parser.parse){if(!_1cd){_1cd=_1cc.ownerDocument.createElement("div");}_1cd.appendChild(node);dojo.parser.parse(_1cd);node=_1cd.firstChild;while(_1cd.firstChild){_1cd.removeChild(_1cd.firstChild);}}if(i==_1ce-1){dojo.place(node,_1cc,_1ca);}else{_1cc.parentNode.insertBefore(node,_1cc);}_1cc=node;}},_stash:function(_1cf){this._parent=_1cf;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(_1d0,_1d1){d.forEach(this,_1d0,_1d1);return this;},coords:_1c0(d.coords),position:_1c0(d.position),place:function(_1d2,_1d3){var item=d.query(_1d2)[0];return this.forEach(function(node){d.place(node,item,_1d3);});},orphan:function(_1d4){return (_1d4?d._filterQueryResult(this,_1d4):this).forEach(_1c4);},adopt:function(_1d5,_1d6){return d.query(_1d5).place(this[0],_1d6)._stash(this);},query:function(_1d7){if(!_1d7){return this;}var ret=this.map(function(node){return d.query(_1d7,node).filter(function(_1d8){return _1d8!==undefined;});});return this._wrap(apc.apply([],ret),this);},filter:function(_1d9){var a=arguments,_1da=this,_1db=0;if(typeof _1d9=="string"){_1da=d._filterQueryResult(this,a[0]);if(a.length==1){return _1da._stash(this);}_1db=1;}return this._wrap(d.filter(_1da,a[_1db],a[_1db+1]),this);},addContent:function(_1dc,_1dd){_1dc=this._normalize(_1dc,this[0]);for(var i=0,node;node=this[i];i++){this._place(_1dc,node,_1dd,i>0);}return this;},instantiate:function(_1de,_1df){var c=d.isFunction(_1de)?_1de:d.getObject(_1de);_1df=_1df||{};return this.forEach(function(node){new c(_1df,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 _1e0="on"+evt;nlp[_1e0]=function(a,b){return this.connect(_1e0,a,b);};});})();}if(!dojo._hasResource["dojo._base.query"]){dojo._hasResource["dojo._base.query"]=true;if(typeof dojo!="undefined"){dojo.provide("dojo._base.query");}(function(d){var trim=d.trim;var each=d.forEach;var qlc=d._NodeListCtor=d.NodeList;var _1e1=function(){return d.doc;};var _1e2=((d.isWebKit||d.isMozilla)&&((_1e1().compatMode)=="BackCompat"));var _1e3=!!_1e1().firstChild["children"]?"children":"childNodes";var _1e4=">~+";var _1e5=false;var _1e6=function(){return true;};var _1e7=function(_1e8){if(_1e4.indexOf(_1e8.slice(-1))>=0){_1e8+=" * ";}else{_1e8+=" ";}var ts=function(s,e){return trim(_1e8.slice(s,e));};var _1e9=[];var _1ea=-1,_1eb=-1,_1ec=-1,_1ed=-1,_1ee=-1,inId=-1,_1ef=-1,lc="",cc="",_1f0;var x=0,ql=_1e8.length,_1f1=null,_1f2=null;var _1f3=function(){if(_1ef>=0){var tv=(_1ef==x)?null:ts(_1ef,x);_1f1[(_1e4.indexOf(tv)<0)?"tag":"oper"]=tv;_1ef=-1;}};var _1f4=function(){if(inId>=0){_1f1.id=ts(inId,x).replace(/\\/g,"");inId=-1;}};var _1f5=function(){if(_1ee>=0){_1f1.classes.push(ts(_1ee+1,x).replace(/\\/g,""));_1ee=-1;}};var _1f6=function(){_1f4();_1f3();_1f5();};var _1f7=function(){_1f6();if(_1ed>=0){_1f1.pseudos.push({name:ts(_1ed+1,x)});}_1f1.loops=(_1f1.pseudos.length||_1f1.attrs.length||_1f1.classes.length);_1f1.oquery=_1f1.query=ts(_1f0,x);_1f1.otag=_1f1.tag=(_1f1["oper"])?null:(_1f1.tag||"*");if(_1f1.tag){_1f1.tag=_1f1.tag.toUpperCase();}if(_1e9.length&&(_1e9[_1e9.length-1].oper)){_1f1.infixOper=_1e9.pop();_1f1.query=_1f1.infixOper.query+" "+_1f1.query;}_1e9.push(_1f1);_1f1=null;};for(;lc=cc,cc=_1e8.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_1f1){_1f0=x;_1f1={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return (_1e5)?this.otag:this.tag;}};_1ef=x;}if(_1ea>=0){if(cc=="]"){if(!_1f2.attr){_1f2.attr=ts(_1ea+1,x);}else{_1f2.matchFor=ts((_1ec||_1ea+1),x);}var cmf=_1f2.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_1f2.matchFor=cmf.slice(1,-1);}}_1f1.attrs.push(_1f2);_1f2=null;_1ea=_1ec=-1;}else{if(cc=="="){var _1f8=("|~^$*".indexOf(lc)>=0)?lc:"";_1f2.type=_1f8+cc;_1f2.attr=ts(_1ea+1,x-_1f8.length);_1ec=x+1;}}}else{if(_1eb>=0){if(cc==")"){if(_1ed>=0){_1f2.value=ts(_1eb+1,x);}_1ed=_1eb=-1;}}else{if(cc=="#"){_1f6();inId=x+1;}else{if(cc=="."){_1f6();_1ee=x;}else{if(cc==":"){_1f6();_1ed=x;}else{if(cc=="["){_1f6();_1ea=x;_1f2={};}else{if(cc=="("){if(_1ed>=0){_1f2={name:ts(_1ed+1,x),value:null};_1f1.pseudos.push(_1f2);}_1eb=x;}else{if((cc==" ")&&(lc!=cc)){_1f7();}}}}}}}}}return _1e9;};var _1f9=function(_1fa,_1fb){if(!_1fa){return _1fb;}if(!_1fb){return _1fa;}return function(){return _1fa.apply(window,arguments)&&_1fb.apply(window,arguments);};};var _1fc=function(i,arr){var r=arr||[];if(i){r.push(i);}return r;};var _1fd=function(n){return (1==n.nodeType);};var _1fe="";var _1ff=function(elem,attr){if(!elem){return _1fe;}if(attr=="class"){return elem.className||_1fe;}if(attr=="for"){return elem.htmlFor||_1fe;}if(attr=="style"){return elem.style.cssText||_1fe;}return (_1e5?elem.getAttribute(attr):elem.getAttribute(attr,2))||_1fe;};var _200={"*=":function(attr,_201){return function(elem){return (_1ff(elem,attr).indexOf(_201)>=0);};},"^=":function(attr,_202){return function(elem){return (_1ff(elem,attr).indexOf(_202)==0);};},"$=":function(attr,_203){var tval=" "+_203;return function(elem){var ea=" "+_1ff(elem,attr);return (ea.lastIndexOf(_203)==(ea.length-_203.length));};},"~=":function(attr,_204){var tval=" "+_204+" ";return function(elem){var ea=" "+_1ff(elem,attr)+" ";return (ea.indexOf(tval)>=0);};},"|=":function(attr,_205){var _206=" "+_205+"-";return function(elem){var ea=" "+_1ff(elem,attr);return ((ea==_205)||(ea.indexOf(_206)==0));};},"=":function(attr,_207){return function(elem){return (_1ff(elem,attr)==_207);};}};var _208=(typeof _1e1().firstChild.nextElementSibling=="undefined");var _209=!_208?"nextElementSibling":"nextSibling";var _20a=!_208?"previousElementSibling":"previousSibling";var _20b=(_208?_1fd:_1e6);var _20c=function(node){while(node=node[_20a]){if(_20b(node)){return false;}}return true;};var _20d=function(node){while(node=node[_209]){if(_20b(node)){return false;}}return true;};var _20e=function(node){var root=node.parentNode;var i=0,tret=root[_1e3],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[_209]){if(_20b(te)){te["_i"]=++i;if(node===te){ci=i;}}}return ci;};var _20f=function(elem){return !((_20e(elem))%2);};var _210=function(elem){return ((_20e(elem))%2);};var _211={"checked":function(name,_212){return function(elem){return !!("checked" in elem?elem.checked:elem.selected);};},"first-child":function(){return _20c;},"last-child":function(){return _20d;},"only-child":function(name,_213){return function(node){if(!_20c(node)){return false;}if(!_20d(node)){return false;}return true;};},"empty":function(name,_214){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,_215){var cz=_215.charAt(0);if(cz=="\""||cz=="'"){_215=_215.slice(1,-1);}return function(elem){return (elem.innerHTML.indexOf(_215)>=0);};},"not":function(name,_216){var p=_1e7(_216)[0];var _217={el:1};if(p.tag!="*"){_217.tag=1;}if(!p.classes.length){_217.classes=1;}var ntf=_218(p,_217);return function(elem){return (!ntf(elem));};},"nth-child":function(name,_219){var pi=parseInt;if(_219=="odd"){return _210;}else{if(_219=="even"){return _20f;}}if(_219.indexOf("n")!=-1){var _21a=_219.split("n",2);var pred=_21a[0]?((_21a[0]=="-")?-1:pi(_21a[0])):1;var idx=_21a[1]?pi(_21a[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=_20e(elem);return (i>=lb)&&(ub<0||i<=ub)&&((i%pred)==idx);};}else{_219=idx;}}var _21b=pi(_219);return function(elem){return (_20e(elem)==_21b);};}};var _21c=(d.isIE)?function(cond){var clc=cond.toLowerCase();if(clc=="class"){cond="className";}return function(elem){return (_1e5?elem.getAttribute(cond):elem[cond]||elem[clc]);};}:function(cond){return function(elem){return (elem&&elem.getAttribute&&elem.hasAttribute(cond));};};var _218=function(_21d,_21e){if(!_21d){return _1e6;}_21e=_21e||{};var ff=null;if(!("el" in _21e)){ff=_1f9(ff,_1fd);}if(!("tag" in _21e)){if(_21d.tag!="*"){ff=_1f9(ff,function(elem){return (elem&&(elem.tagName==_21d.getTag()));});}}if(!("classes" in _21e)){each(_21d.classes,function(_21f,idx,arr){var re=new RegExp("(?:^|\\s)"+_21f+"(?:\\s|$)");ff=_1f9(ff,function(elem){return re.test(elem.className);});ff.count=idx;});}if(!("pseudos" in _21e)){each(_21d.pseudos,function(_220){var pn=_220.name;if(_211[pn]){ff=_1f9(ff,_211[pn](pn,_220.value));}});}if(!("attrs" in _21e)){each(_21d.attrs,function(attr){var _221;var a=attr.attr;if(attr.type&&_200[attr.type]){_221=_200[attr.type](a,attr.matchFor);}else{if(a.length){_221=_21c(a);}}if(_221){ff=_1f9(ff,_221);}});}if(!("id" in _21e)){if(_21d.id){ff=_1f9(ff,function(elem){return (!!elem&&(elem.id==_21d.id));});}}if(!ff){if(!("default" in _21e)){ff=_1e6;}}return ff;};var _222=function(_223){return function(node,ret,bag){while(node=node[_209]){if(_208&&(!_1fd(node))){continue;}if((!bag||_224(node,bag))&&_223(node)){ret.push(node);}break;}return ret;};};var _225=function(_226){return function(root,ret,bag){var te=root[_209];while(te){if(_20b(te)){if(bag&&!_224(te,bag)){break;}if(_226(te)){ret.push(te);}}te=te[_209];}return ret;};};var _227=function(_228){_228=_228||_1e6;return function(root,ret,bag){var te,x=0,tret=root[_1e3];while(te=tret[x++]){if(_20b(te)&&(!bag||_224(te,bag))&&(_228(te,x))){ret.push(te);}}return ret;};};var _229=function(node,root){var pn=node.parentNode;while(pn){if(pn==root){break;}pn=pn.parentNode;}return !!pn;};var _22a={};var _22b=function(_22c){var _22d=_22a[_22c.query];if(_22d){return _22d;}var io=_22c.infixOper;var oper=(io?io.oper:"");var _22e=_218(_22c,{el:1});var qt=_22c.tag;var _22f=("*"==qt);var ecs=_1e1()["getElementsByClassName"];if(!oper){if(_22c.id){_22e=(!_22c.loops&&_22f)?_1e6:_218(_22c,{el:1,id:1});_22d=function(root,arr){var te=d.byId(_22c.id,(root.ownerDocument||root));if(!te||!_22e(te)){return;}if(9==root.nodeType){return _1fc(te,arr);}else{if(_229(te,root)){return _1fc(te,arr);}}};}else{if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_22c.classes.length&&!_1e2){_22e=_218(_22c,{el:1,classes:1,id:1});var _230=_22c.classes.join(" ");_22d=function(root,arr,bag){var ret=_1fc(0,arr),te,x=0;var tret=root.getElementsByClassName(_230);while((te=tret[x++])){if(_22e(te,root)&&_224(te,bag)){ret.push(te);}}return ret;};}else{if(!_22f&&!_22c.loops){_22d=function(root,arr,bag){var ret=_1fc(0,arr),te,x=0;var tret=root.getElementsByTagName(_22c.getTag());while((te=tret[x++])){if(_224(te,bag)){ret.push(te);}}return ret;};}else{_22e=_218(_22c,{el:1,tag:1,id:1});_22d=function(root,arr,bag){var ret=_1fc(0,arr),te,x=0;var tret=root.getElementsByTagName(_22c.getTag());while((te=tret[x++])){if(_22e(te,root)&&_224(te,bag)){ret.push(te);}}return ret;};}}}}else{var _231={el:1};if(_22f){_231.tag=1;}_22e=_218(_22c,_231);if("+"==oper){_22d=_222(_22e);}else{if("~"==oper){_22d=_225(_22e);}else{if(">"==oper){_22d=_227(_22e);}}}}return _22a[_22c.query]=_22d;};var _232=function(root,_233){var _234=_1fc(root),qp,x,te,qpl=_233.length,bag,ret;for(var i=0;i<qpl;i++){ret=[];qp=_233[i];x=_234.length-1;if(x>0){bag={};ret.nozip=true;}var gef=_22b(qp);for(var j=0;(te=_234[j]);j++){gef(te,ret,bag);}if(!ret.length){break;}_234=ret;}return ret;};var _235={},_236={};var _237=function(_238){var _239=_1e7(trim(_238));if(_239.length==1){var tef=_22b(_239[0]);return function(root){var r=tef(root,new qlc());if(r){r.nozip=true;}return r;};}return function(root){return _232(root,_239);};};var nua=navigator.userAgent;var wk="WebKit/";var _23a=(d.isWebKit&&(nua.indexOf(wk)>0)&&(parseFloat(nua.split(wk)[1])>528));var _23b=d.isIE?"commentStrip":"nozip";var qsa="querySelectorAll";var _23c=(!!_1e1()[qsa]&&(!d.isSafari||(d.isSafari>3.1)||_23a));var _23d=/n\+\d|([^ ])?([>~+])([^ =])?/g;var _23e=function(_23f,pre,ch,post){return ch?(pre?pre+" ":"")+ch+(post?" "+post:""):_23f;};var _240=function(_241,_242){_241=_241.replace(_23d,_23e);if(_23c){var _243=_236[_241];if(_243&&!_242){return _243;}}var _244=_235[_241];if(_244){return _244;}var qcz=_241.charAt(0);var _245=(-1==_241.indexOf(" "));if((_241.indexOf("#")>=0)&&(_245)){_242=true;}var _246=(_23c&&(!_242)&&(_1e4.indexOf(qcz)==-1)&&(!d.isIE||(_241.indexOf(":")==-1))&&(!(_1e2&&(_241.indexOf(".")>=0)))&&(_241.indexOf(":contains")==-1)&&(_241.indexOf(":checked")==-1)&&(_241.indexOf("|=")==-1));if(_246){var tq=(_1e4.indexOf(_241.charAt(_241.length-1))>=0)?(_241+" *"):_241;return _236[_241]=function(root){try{if(!((9==root.nodeType)||_245)){throw "";}var r=root[qsa](tq);r[_23b]=true;return r;}catch(e){return _240(_241,true)(root);}};}else{var _247=_241.split(/\s*,\s*/);return _235[_241]=((_247.length<2)?_237(_241):function(root){var _248=0,ret=[],tp;while((tp=_247[_248++])){ret=ret.concat(_237(tp)(root));}return ret;});}};var _249=0;var _24a=d.isIE?function(node){if(_1e5){return (node.getAttribute("_uid")||node.setAttribute("_uid",++_249)||_249);}else{return node.uniqueID;}}:function(node){return (node._uid||(node._uid=++_249));};var _224=function(node,bag){if(!bag){return 1;}var id=_24a(node);if(!bag[id]){return bag[id]=1;}return 0;};var _24b="_zipIdx";var _24c=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;}_249++;if(d.isIE&&_1e5){var _24d=_249+"";arr[0].setAttribute(_24b,_24d);for(var x=1,te;te=arr[x];x++){if(arr[x].getAttribute(_24b)!=_24d){ret.push(te);}te.setAttribute(_24b,_24d);}}else{if(d.isIE&&arr.commentStrip){try{for(var x=1,te;te=arr[x];x++){if(_1fd(te)){ret.push(te);}}}catch(e){}}else{if(arr[0]){arr[0][_24b]=_249;}for(var x=1,te;te=arr[x];x++){if(arr[x][_24b]!=_249){ret.push(te);}te[_24b]=_249;}}}return ret;};d.query=function(_24e,root){qlc=d._NodeListCtor;if(!_24e){return new qlc();}if(_24e.constructor==qlc){return _24e;}if(typeof _24e!="string"){return new qlc(_24e);}if(typeof root=="string"){root=d.byId(root);if(!root){return new qlc();}}root=root||_1e1();var od=root.ownerDocument||root.documentElement;_1e5=(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=_240(_24e)(root);if(r&&r.nozip&&!qlc._wrap){return r;}return _24c(r);};d.query.pseudos=_211;d._filterQueryResult=function(_24f,_250){var _251=new d._NodeListCtor();var _252=_218(_1e7(_250)[0]);for(var x=0,te;te=_24f[x];x++){if(_252(te)){_251.push(te);}}return _251;};})(this["queryPortability"]||this["acme"]||dojo);}if(!dojo._hasResource["dojo._base.xhr"]){dojo._hasResource["dojo._base.xhr"]=true;dojo.provide("dojo._base.xhr");(function(){var _253=dojo,cfg=_253.config;function _254(obj,name,_255){if(_255===null){return;}var val=obj[name];if(typeof val=="string"){obj[name]=[val,_255];}else{if(_253.isArray(val)){val.push(_255);}else{obj[name]=_255;}}};dojo.fieldToObject=function(_256){var ret=null;var item=_253.byId(_256);if(item){var _257=item.name;var type=(item.type||"").toLowerCase();if(_257&&type&&!item.disabled){if(type=="radio"||type=="checkbox"){if(item.checked){ret=item.value;}}else{if(item.multiple){ret=[];_253.query("option",item).forEach(function(opt){if(opt.selected){ret.push(opt.value);}});}else{ret=item.value;}}}}return ret;};dojo.formToObject=function(_258){var ret={};var _259="file|submit|image|reset|button|";_253.forEach(dojo.byId(_258).elements,function(item){var _25a=item.name;var type=(item.type||"").toLowerCase();if(_25a&&type&&_259.indexOf(type)==-1&&!item.disabled){_254(ret,_25a,_253.fieldToObject(item));if(type=="image"){ret[_25a+".x"]=ret[_25a+".y"]=ret[_25a].x=ret[_25a].y=0;}}});return ret;};dojo.objectToQuery=function(map){var enc=encodeURIComponent;var _25b=[];var _25c={};for(var name in map){var _25d=map[name];if(_25d!=_25c[name]){var _25e=enc(name)+"=";if(_253.isArray(_25d)){for(var i=0;i<_25d.length;i++){_25b.push(_25e+enc(_25d[i]));}}else{_25b.push(_25e+enc(_25d));}}}return _25b.join("&");};dojo.formToQuery=function(_25f){return _253.objectToQuery(_253.formToObject(_25f));};dojo.formToJson=function(_260,_261){return _253.toJson(_253.formToObject(_260),_261);};dojo.queryToObject=function(str){var ret={};var qp=str.split("&");var dec=decodeURIComponent;_253.forEach(qp,function(item){if(item.length){var _262=item.split("=");var name=dec(_262.shift());var val=dec(_262.join("="));if(typeof ret[name]=="string"){ret[name]=[ret[name]];}if(_253.isArray(ret[name])){ret[name].push(val);}else{ret[name]=val;}}});return ret;};dojo._blockAsync=false;var _263=_253._contentHandlers=dojo.contentHandlers={text:function(xhr){return xhr.responseText;},json:function(xhr){return _253.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 _264=xhr.responseText;var _265=_264.indexOf("/*");var _266=_264.lastIndexOf("*/");if(_265==-1||_266==-1){throw new Error("JSON was not comment filtered");}return _253.fromJson(_264.substring(_265+2,_266));},javascript:function(xhr){return _253.eval(xhr.responseText);},xml:function(xhr){var _267=xhr.responseXML;if(_253.isIE&&(!_267||!_267.documentElement)){var ms=function(n){return "MSXML"+n+".DOMDocument";};var dp=["Microsoft.XMLDOM",ms(6),ms(4),ms(3),ms(2)];_253.some(dp,function(p){try{var dom=new ActiveXObject(p);dom.async=false;dom.loadXML(xhr.responseText);_267=dom;}catch(e){return false;}return true;});}return _267;},"json-comment-optional":function(xhr){if(xhr.responseText&&/^[^{\[]*\/\*/.test(xhr.responseText)){return _263["json-comment-filtered"](xhr);}else{return _263["json"](xhr);}}};dojo._ioSetArgs=function(args,_268,_269,_26a){var _26b={args:args,url:args.url};var _26c=null;if(args.form){var form=_253.byId(args.form);var _26d=form.getAttributeNode("action");_26b.url=_26b.url||(_26d?_26d.value:null);_26c=_253.formToObject(form);}var _26e=[{}];if(_26c){_26e.push(_26c);}if(args.content){_26e.push(args.content);}if(args.preventCache){_26e.push({"dojo.preventCache":new Date().valueOf()});}_26b.query=_253.objectToQuery(_253.mixin.apply(null,_26e));_26b.handleAs=args.handleAs||"text";var d=new _253.Deferred(_268);d.addCallbacks(_269,function(_26f){return _26a(_26f,d);});var ld=args.load;if(ld&&_253.isFunction(ld)){d.addCallback(function(_270){return ld.call(args,_270,_26b);});}var err=args.error;if(err&&_253.isFunction(err)){d.addErrback(function(_271){return err.call(args,_271,_26b);});}var _272=args.handle;if(_272&&_253.isFunction(_272)){d.addBoth(function(_273){return _272.call(args,_273,_26b);});}if(cfg.ioPublish&&_253.publish&&_26b.args.ioPublish!==false){d.addCallbacks(function(res){_253.publish("/dojo/io/load",[d,res]);return res;},function(res){_253.publish("/dojo/io/error",[d,res]);return res;});d.addBoth(function(res){_253.publish("/dojo/io/done",[d,res]);return res;});}d.ioArgs=_26b;return d;};var _274=function(dfd){dfd.canceled=true;var xhr=dfd.ioArgs.xhr;var _275=typeof xhr.abort;if(_275=="function"||_275=="object"||_275=="unknown"){xhr.abort();}var err=dfd.ioArgs.error;if(!err){err=new Error("xhr cancelled");err.dojoType="cancel";}return err;};var _276=function(dfd){var ret=_263[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);return ret===undefined?null:ret;};var _277=function(_278,dfd){if(!dfd.ioArgs.args.failOk){console.error(_278);}return _278;};var _279=null;var _27a=[];var _27b=0;var _27c=function(dfd){if(_27b<=0){_27b=0;if(cfg.ioPublish&&_253.publish&&(!dfd||dfd&&dfd.ioArgs.args.ioPublish!==false)){_253.publish("/dojo/io/stop");}}};var _27d=function(){var now=(new Date()).getTime();if(!_253._blockAsync){for(var i=0,tif;i<_27a.length&&(tif=_27a[i]);i++){var dfd=tif.dfd;var func=function(){if(!dfd||dfd.canceled||!tif.validCheck(dfd)){_27a.splice(i--,1);_27b-=1;}else{if(tif.ioCheck(dfd)){_27a.splice(i--,1);tif.resHandle(dfd);_27b-=1;}else{if(dfd.startTime){if(dfd.startTime+(dfd.ioArgs.args.timeout||0)<now){_27a.splice(i--,1);var err=new Error("timeout exceeded");err.dojoType="timeout";dfd.errback(err);dfd.cancel();_27b-=1;}}}}};if(dojo.config.debugAtAllCosts){func.call(this);}else{try{func.call(this);}catch(e){dfd.errback(e);}}}}_27c(dfd);if(!_27a.length){clearInterval(_279);_279=null;return;}};dojo._ioCancelAll=function(){try{_253.forEach(_27a,function(i){try{i.dfd.cancel();}catch(e){}});}catch(e){}};if(_253.isIE){_253.addOnWindowUnload(_253._ioCancelAll);}_253._ioNotifyStart=function(dfd){if(cfg.ioPublish&&_253.publish&&dfd.ioArgs.args.ioPublish!==false){if(!_27b){_253.publish("/dojo/io/start");}_27b+=1;_253.publish("/dojo/io/send",[dfd]);}};_253._ioWatch=function(dfd,_27e,_27f,_280){var args=dfd.ioArgs.args;if(args.timeout){dfd.startTime=(new Date()).getTime();}_27a.push({dfd:dfd,validCheck:_27e,ioCheck:_27f,resHandle:_280});if(!_279){_279=setInterval(_27d,50);}if(args.sync){_27d();}};var _281="application/x-www-form-urlencoded";var _282=function(dfd){return dfd.ioArgs.xhr.readyState;};var _283=function(dfd){return 4==dfd.ioArgs.xhr.readyState;};var _284=function(dfd){var xhr=dfd.ioArgs.xhr;if(_253._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(_285){if(_285.query.length){_285.url+=(_285.url.indexOf("?")==-1?"?":"&")+_285.query;_285.query=null;}};dojo.xhr=function(_286,args,_287){var dfd=_253._ioSetArgs(args,_274,_276,_277);var _288=dfd.ioArgs;var xhr=_288.xhr=_253._xhrObj(_288.args);if(!xhr){dfd.cancel();return dfd;}if("postData" in args){_288.query=args.postData;}else{if("putData" in args){_288.query=args.putData;}else{if("rawBody" in args){_288.query=args.rawBody;}else{if((arguments.length>2&&!_287)||"POST|PUT".indexOf(_286.toUpperCase())==-1){_253._ioAddQueryToUrl(_288);}}}}xhr.open(_286,_288.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||_281);if(!args.headers||!("X-Requested-With" in args.headers)){xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");}_253._ioNotifyStart(dfd);if(dojo.config.debugAtAllCosts){xhr.send(_288.query);}else{try{xhr.send(_288.query);}catch(e){_288.error=e;dfd.cancel();}}_253._ioWatch(dfd,_282,_283,_284);xhr=null;return dfd;};dojo.xhrGet=function(args){return _253.xhr("GET",args);};dojo.rawXhrPost=dojo.xhrPost=function(args){return _253.xhr("POST",args,true);};dojo.rawXhrPut=dojo.xhrPut=function(args){return _253.xhr("PUT",args,true);};dojo.xhrDelete=function(args){return _253.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 _289=d._mixin;dojo._Line=function(_28a,end){this.start=_28a;this.end=end;};dojo._Line.prototype.getValue=function(n){return ((this.end-this.start)*n)+this.start;};dojo.Animation=function(args){_289(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 _28b=this._percent,_28c=this.easing;return _28c?_28c(_28b):_28b;},_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(_28d,_28e){var _28f=this;if(_28f._delayTimer){_28f._clearTimer();}if(_28e){_28f._stopTimer();_28f._active=_28f._paused=false;_28f._percent=0;}else{if(_28f._active&&!_28f._paused){return _28f;}}_28f._fire("beforeBegin",[_28f.node]);var de=_28d||_28f.delay,_290=dojo.hitch(_28f,"_play",_28e);if(de>0){_28f._delayTimer=setTimeout(_290,de);return _28f;}_290();return _28f;},_play:function(_291){var _292=this;if(_292._delayTimer){_292._clearTimer();}_292._startTime=new Date().valueOf();if(_292._paused){_292._startTime-=_292.duration*_292._percent;}_292._active=true;_292._paused=false;var _293=_292.curve.getValue(_292._getStep());if(!_292._percent){if(!_292._startRepeatCount){_292._startRepeatCount=_292.repeat;}_292._fire("onBegin",[_293]);}_292._fire("onPlay",[_293]);_292._cycle();return _292;},pause:function(){var _294=this;if(_294._delayTimer){_294._clearTimer();}_294._stopTimer();if(!_294._active){return _294;}_294._paused=true;_294._fire("onPause",[_294.curve.getValue(_294._getStep())]);return _294;},gotoPercent:function(_295,_296){var _297=this;_297._stopTimer();_297._active=_297._paused=true;_297._percent=_295;if(_296){_297.play();}return _297;},stop:function(_298){var _299=this;if(_299._delayTimer){_299._clearTimer();}if(!_299._timer){return _299;}_299._stopTimer();if(_298){_299._percent=1;}_299._fire("onStop",[_299.curve.getValue(_299._getStep())]);_299._active=_299._paused=false;return _299;},status:function(){if(this._active){return this._paused?"paused":"playing";}return "stopped";},_cycle:function(){var _29a=this;if(_29a._active){var curr=new Date().valueOf();var step=(curr-_29a._startTime)/(_29a.duration);if(step>=1){step=1;}_29a._percent=step;if(_29a.easing){step=_29a.easing(step);}_29a._fire("onAnimate",[_29a.curve.getValue(step)]);if(_29a._percent<1){_29a._startTimer();}else{_29a._active=false;if(_29a.repeat>0){_29a.repeat--;_29a.play(null,true);}else{if(_29a.repeat==-1){_29a.play(null,true);}else{if(_29a._startRepeatCount){_29a.repeat=_29a._startRepeatCount;_29a._startRepeatCount=0;}}}_29a._percent=0;_29a._fire("onEnd",[_29a.node]);!_29a.repeat&&_29a._stopTimer();}}return _29a;},_clearTimer:function(){clearTimeout(this._delayTimer);delete this._delayTimer;}});var ctr=0,_29b=null,_29c={run:function(){}};d.extend(d.Animation,{_startTimer:function(){if(!this._timer){this._timer=d.connect(_29c,"run",this,"_cycle");ctr++;}if(!_29b){_29b=setInterval(d.hitch(_29c,"run"),this.rate);}},_stopTimer:function(){if(this._timer){d.disconnect(this._timer);this._timer=null;ctr--;}if(ctr<=0){clearInterval(_29b);_29b=null;ctr=0;}}});var _29d=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 _29e=_289({properties:{}},args),_29f=(_29e.properties.opacity={});_29f.start=!("start" in _29e)?function(){return +d.style(_29e.node,"opacity")||0;}:_29e.start;_29f.end=_29e.end;var anim=d.animateProperty(_29e);d.connect(anim,"beforeBegin",d.partial(_29d,_29e.node));return anim;};dojo.fadeIn=function(args){return d._fade(_289({end:1},args));};dojo.fadeOut=function(args){return d._fade(_289({end:0},args));};dojo._defaultEasing=function(n){return 0.5+((Math.sin((n+1.5)*Math.PI))/2);};var _2a0=function(_2a1){this._properties=_2a1;for(var p in _2a1){var prop=_2a1[p];if(prop.start instanceof d.Color){prop.tempColor=new d.Color();}}};_2a0.prototype.getValue=function(r){var ret={};for(var p in this._properties){var prop=this._properties[p],_2a2=prop.start;if(_2a2 instanceof d.Color){ret[p]=d.blendColors(_2a2,prop.end,r,prop.tempColor).toCss();}else{if(!d.isArray(_2a2)){ret[p]=((prop.end-_2a2)*r)+_2a2+(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]=_289({},(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 _2a3=(p.toLowerCase().indexOf("color")>=0);function _2a4(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:(_2a3?v:parseFloat(v));};if(!("end" in prop)){prop.end=_2a4(n,p);}else{if(!("start" in prop)){prop.start=_2a4(n,p);}}if(_2a3){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 _2a0(pm);});d.connect(anim,"onAnimate",d.hitch(d,"style",anim.node));return anim;};dojo.anim=function(node,_2a5,_2a6,_2a7,_2a8,_2a9){return d.animateProperty({node:node,duration:_2a6||d.Animation.prototype.duration,properties:_2a5,easing:_2a7,onEnd:_2a8}).play(_2a9||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.isBrowser&&(document.readyState==="complete"||dojo.config.afterOnLoad)){window.setTimeout(dojo._loadInit,100);}})();
+(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);}})();
diff --git a/lib/dojo/dojo.js.uncompressed.js b/lib/dojo/dojo.js.uncompressed.js
index 07593d88e..af7051aaf 100644
--- a/lib/dojo/dojo.js.uncompressed.js
+++ b/lib/dojo/dojo.js.uncompressed.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -122,7 +122,7 @@ djConfig = {
// of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
// modules may be configured via `djConfig.modulePaths`.
modulePaths: {},
- // afterOnLoad: Boolean
+ // 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
@@ -149,7 +149,7 @@ djConfig = {
// 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
+ // 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.
@@ -195,7 +195,7 @@ djConfig = {
"groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
"trace", "warn", "log"
];
- var i=0, tn;
+ var i = 0, tn;
while((tn=cn[i++])){
if(!console[tn]){
(function(){
@@ -255,9 +255,13 @@ dojo.global = {
debugAtAllCosts: false
};
- if(typeof djConfig != "undefined"){
- for(var opt in djConfig){
- d.config[opt] = djConfig[opt];
+ // 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];
}
}
@@ -269,7 +273,7 @@ dojo.global = {
=====*/
dojo.locale = d.config.locale;
- var rev = "$Rev: 22487 $".match(/\d+/);
+ var rev = "$Rev: 24595 $".match(/\d+/);
/*=====
dojo.version = function(){
@@ -293,7 +297,7 @@ dojo.global = {
}
=====*/
dojo.version = {
- major: 1, minor: 5, patch: 0, flag: "",
+ major: 1, minor: 6, patch: 1, flag: "",
revision: rev ? +rev[0] : NaN,
toString: function(){
with(d.version){
@@ -369,7 +373,7 @@ dojo.global = {
// | constructor: function(properties){
// | // property configuration:
// | dojo.mixin(this, properties);
- // |
+ // |
// | console.log(this.quip);
// | // ...
// | },
@@ -390,7 +394,7 @@ dojo.global = {
// | name: "Carl Brutanananadilewski"
// | }
// | );
- // |
+ // |
// | // will print "Carl Brutanananadilewski"
// | console.log(flattened.name);
// | // will print "true"
@@ -465,10 +469,7 @@ dojo.global = {
// 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 only for object and method detection.
- // Not useful for testing generic properties on an object.
- // In particular, dojo.exists("foo.bar") when foo.bar = ""
- // will return false. Use ("bar" in foo) to test for those cases.
+ // the chain. Useful for object and method detection.
// name:
// Path to an object, in the form "A.B.C".
// obj:
@@ -487,7 +488,7 @@ dojo.global = {
// | // search from a particular scope
// | dojo.exists("bar", foo); // true
// | dojo.exists("bar.baz", foo); // false
- return !!d.getObject(name, false, obj); // Boolean
+ return d.getObject(name, false, obj) !== undefined; // Boolean
}
dojo["eval"] = function(/*String*/ scriptFragment){
@@ -553,9 +554,8 @@ dojo.global = {
* loader.js - A bootstrap module. Runs before the hostenv_*.js file. Contains
* all of the package loading methods.
*/
-
(function(){
- var d = dojo;
+ var d = dojo, currentModule;
d.mixin(d, {
_loadedModules: {},
@@ -587,11 +587,11 @@ dojo.global = {
_loadedUrls: [],
- //WARNING:
+ //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: [],
@@ -610,21 +610,24 @@ dojo.global = {
// not caught by us, so the caller will see it. We return a true
// value if and only if the script is found.
//
- // relpath:
+ // relpath:
// A relative path to a script (no leading '/', and typically ending
// in '.js').
- // module:
+ // module:
// A module whose existance to check for after loading a path. Can be
// used to determine success or failure of the load.
- // cb:
+ // 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;
}
}
@@ -637,7 +640,7 @@ dojo.global = {
// 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:
+ // 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
@@ -651,7 +654,8 @@ dojo.global = {
d._loadedUrls[uri] = true;
d._loadedUrls.push(uri);
if(cb){
- contents = '('+contents+')';
+ //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.
@@ -663,16 +667,16 @@ dojo.global = {
}
// 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.
+ // 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
+ 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){
+ if(d._inFlightCount == 0){
d._callLoaded();
}
}, 0);
@@ -695,10 +699,10 @@ dojo.global = {
dojo.loaded = function(){
// summary:
// signal fired when initial environment and package loading is
- // complete. You should use dojo.addOnLoad() instead of doing a
+ // 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
+ // initialized. In a browser host, declarative widgets will
// be constructed when this function finishes runing.
d._loadNotifying = true;
d._postLoad = true;
@@ -725,8 +729,8 @@ dojo.global = {
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() 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){
@@ -745,13 +749,13 @@ dojo.global = {
dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){
// summary:
- // Registers a function to be triggered after the DOM and dojo.require() calls
+ // 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.
+ // 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
@@ -794,7 +798,7 @@ dojo.global = {
dojo._modulesLoaded = function(){
if(d._postLoad){ return; }
- if(d._inFlightCount > 0){
+ if(d._inFlightCount > 0){
console.warn("files still in flight!");
return;
}
@@ -826,8 +830,8 @@ dojo.global = {
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
+ 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);
@@ -862,87 +866,95 @@ dojo.global = {
dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){
// summary:
// loads a Javascript module from the appropriate URI
- // moduleName:
+ //
+ // 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:
+ //
+ // 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
+ // 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. Example:
- //
- // | <script type="text/javascript">
- // | dojo.require("foo");
- // | dojo.require("bar");
- // | dojo.addOnLoad(function(){
- // | //you can now safely do something with foo and bar
- // | });
- // | </script>
- //
+ // 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 excpetion if it cannot find a file
+ //
+ // `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. For example, to import all symbols into a
- // local block, you might write:
- //
+ // 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
+ //
+ // returns:
+ // the required namespace object
omitModuleCheck = d._global_omit_module_check || omitModuleCheck;
//Check if it is already loaded.
@@ -953,10 +965,8 @@ dojo.global = {
// 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 + "'");
}
@@ -967,7 +977,7 @@ dojo.global = {
// 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 + "'");
+ throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'");
}
}
@@ -988,14 +998,14 @@ dojo.global = {
// 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
+ // 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
@@ -1004,11 +1014,11 @@ dojo.global = {
// note that it includes multiple resources.
//
// resourceName: String
- // A dot-sperated string identifying a resource.
+ // A dot-sperated string identifying a resource.
//
// example:
// Safely create a `my` object, and make dojo.require("my.CustomModule") work
- // | dojo.provide("my.CustomModule");
+ // | dojo.provide("my.CustomModule");
//Make sure we have a string.
resourceName = resourceName + "";
@@ -1065,7 +1075,7 @@ dojo.global = {
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++){
+ for(var i = 1; i < arguments.length; i++){
args.push(arguments[i]);
}
d.require.apply(d, args);
@@ -1075,13 +1085,13 @@ dojo.global = {
dojo.requireAfterIf = d.requireIf;
dojo.registerModulePath = function(/*String*/module, /*String*/prefix){
- // summary:
+ // summary:
// Maps a module name to a path
- // description:
+ // 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.
+ // dojo.registerModulePath.
// example:
// If your dojo.js is located at this location in the web root:
// | /myapp/js/dojo/dojo/dojo.js
@@ -1094,7 +1104,7 @@ dojo.global = {
// 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"
+ // | <script type="text/javascript"
// | src="/myapp/js/dojo/dojo/dojo.js"></script>
// | <script type="text/javascript">
// | dojo.registerModulePath("foo", "../../foo");
@@ -1103,8 +1113,8 @@ dojo.global = {
// | 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
@@ -1115,7 +1125,7 @@ dojo.global = {
// 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.
+ // 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.
@@ -1130,21 +1140,21 @@ dojo.global = {
// preload the bundles to avoid data redundancy and the multiple
// network hits normally required to load these resources.
//
- // moduleName:
+ // moduleName:
// name of the package containing the "nls" directory in which the
// bundle is found
//
- // bundleName:
+ // 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:
+ // locale:
// the locale to load (optional) By default, the browser's user
// locale as defined by dojo.locale
//
- // availableFlatLocales:
+ // availableFlatLocales:
// A comma-separated list of the available, flattened locales for this
// bundle. This argument should only be set by the build process.
//
@@ -1186,11 +1196,11 @@ dojo.global = {
ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
dojo._Url = function(/*dojo._Url|String...*/){
- // summary:
+ // summary:
// Constructor to create an object representing a URL.
// It is marked as private, since we might consider removing
// or simplifying it.
- // description:
+ // 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:
@@ -1257,7 +1267,7 @@ dojo.global = {
}
uri = [];
- if(relobj.scheme){
+ if(relobj.scheme){
uri.push(relobj.scheme, ":");
}
if(relobj.authority){
@@ -1297,7 +1307,7 @@ dojo.global = {
dojo._Url.prototype.toString = function(){ return this.uri; };
dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){
- // summary:
+ // summary:
// Returns a `dojo._Url` object relative to a module.
// example:
// | var pngPath = dojo.moduleUrl("acme","images/small.png");
@@ -1305,10 +1315,10 @@ dojo.global = {
// | // 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();
+ // | img.src = pngPath.toString();
// | // add our image to the document
// | dojo.body().appendChild(img);
- // example:
+ // 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,
@@ -1319,9 +1329,9 @@ dojo.global = {
// | // 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");
@@ -1340,7 +1350,10 @@ dojo.global = {
}
return new d._Url(loc, url); // dojo._Url
- }
+ };
+
+
+
})();
/*=====
@@ -1364,9 +1377,9 @@ dojo.isIE = {
dojo.isSafari = {
// example:
// | if(dojo.isSafari){ ... }
- // example:
+ // example:
// Detect iPhone:
- // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
+ // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
// | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test.
// | }
};
@@ -1409,7 +1422,6 @@ dojo = {
// True if the client runs on Mac
}
=====*/
-
if(typeof window != 'undefined'){
dojo.isBrowser = true;
dojo._name = "browser";
@@ -1436,7 +1448,7 @@ if(typeof window != 'undefined'){
d.config.baseUrl = src.substring(0, m.index);
}
// and find out if we need to modify our behavior
- var cfg = scripts[i].getAttribute("djConfig");
+ var cfg = (scripts[i].getAttribute("djConfig") || scripts[i].getAttribute("data-dojo-config"));
if(cfg){
var cfgo = eval("({ "+cfg+" })");
for(var x in cfgo){
@@ -1510,7 +1522,7 @@ if(typeof window != 'undefined'){
d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
d._xhrObj = function(){
- // summary:
+ // summary:
// does the work of portably generating a new XMLHTTPRequest object.
var http, last_e;
if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){
@@ -1543,10 +1555,11 @@ if(typeof window != 'undefined'){
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
+ 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:") );
+ (!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:"));
}
//See if base tag is in use.
@@ -1641,7 +1654,7 @@ if(typeof window != 'undefined'){
d.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
// summary:
// registers a function to be triggered when window.onunload
- // fires.
+ // fires.
// description:
// The first time that addOnWindowUnload is called Dojo
// will register a page listener to trigger your unload
@@ -1672,7 +1685,7 @@ if(typeof window != 'undefined'){
// description:
// The first time that addOnUnload is called Dojo will
// register a page listener to trigger your unload handler
- // with.
+ // with.
//
// In a browser enviroment, the functions will be triggered
// during the window.onbeforeunload event. Be careful of doing
@@ -1685,7 +1698,7 @@ if(typeof window != 'undefined'){
//
// Further note that calling dojo.addOnUnload will prevent
// browsers from using a "fast back" cache to make page
- // loading via back button instantaneous.
+ // loading via back button instantaneous.
// example:
// | dojo.addOnUnload(functionPointer)
// | dojo.addOnUnload(object, "functionName")
@@ -1722,7 +1735,7 @@ if(typeof window != 'undefined'){
}
}
- if(!dojo.config.afterOnLoad){
+ 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
@@ -1739,10 +1752,10 @@ if(typeof window != 'undefined'){
if(!dojo.config.skipIeDomLoaded && self === self.top){
dojo._scrollIntervalId = setInterval(function (){
try{
- //When dojo is loaded into an iframe in an IE HTML Application
+ //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
+ //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){
@@ -1805,16 +1818,20 @@ if(dojo.config.isDebug){
}
if(dojo.config.debugAtAllCosts){
- dojo.config.useXDomain = true;
- dojo.require("dojo._base._loader.loader_xd");
+ // 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");
}
+
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;
@@ -1824,14 +1841,14 @@ dojo.provide("dojo._base.lang");
// 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:
@@ -1845,7 +1862,7 @@ dojo.provide("dojo._base.lang");
// or null)
return it !== undefined &&
(it === null || typeof it == "object" || d.isArray(it) || d.isFunction(it)); // Boolean
- }
+ };
dojo.isArrayLike = function(/*anything*/ it){
// summary:
@@ -1864,14 +1881,14 @@ dojo.provide("dojo._base.lang");
!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:
@@ -1882,7 +1899,7 @@ dojo.provide("dojo._base.lang");
d._mixin(constructor.prototype, arguments[i]);
}
return constructor; // Object
- }
+ };
dojo._hitchArgs = function(scope, method /*,...*/){
var pre = d._toArray(arguments, 2);
@@ -1894,8 +1911,8 @@ dojo.provide("dojo._base.lang");
var f = named ? (scope||d.global)[method] : method;
// invoke with collected args
return f && f.apply(scope || this, pre.concat(args)); // mixed
- } // Function
- }
+ }; // Function
+ };
dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){
// summary:
@@ -1903,7 +1920,7 @@ dojo.provide("dojo._base.lang");
// 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
+ // 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.
@@ -1943,7 +1960,7 @@ dojo.provide("dojo._base.lang");
return function(){ return scope[method].apply(scope, arguments || []); }; // Function
}
return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
- }
+ };
/*=====
dojo.delegate = function(obj, props){
@@ -1987,7 +2004,7 @@ dojo.provide("dojo._base.lang");
d._mixin(tmp, props);
}
return tmp; // Object
- }
+ };
})();
/*=====
@@ -2036,7 +2053,7 @@ dojo.provide("dojo._base.lang");
// | 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 = {};
@@ -2056,6 +2073,10 @@ dojo.provide("dojo._base.lang");
// 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
@@ -2094,7 +2115,7 @@ dojo.provide("dojo._base.lang");
}
}
return r; // Object
- }
+ };
/*=====
dojo.trim = function(str){
@@ -2123,7 +2144,7 @@ dojo.provide("dojo._base.lang");
dojo.replace = function(tmpl, map, pattern){
// summary:
// Performs parameterized substitutions on a string. Throws an
- // exception if any parameter is unmatched.
+ // exception if any parameter is unmatched.
// tmpl: String
// String to be used as a template.
// map: Object|Function
@@ -2199,13 +2220,14 @@ dojo.provide("dojo._base.lang");
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");
+
+
(function(){
var _getParts = function(arr, obj, cb){
- return [
- (typeof arr == "string") ? arr.split("") : arr,
+ 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
@@ -2224,7 +2246,7 @@ dojo.provide("dojo._base.array");
};
dojo.mixin(dojo, {
- indexOf: function( /*Array*/ array,
+ indexOf: function( /*Array*/ array,
/*Object*/ value,
/*Integer?*/ fromIndex,
/*Boolean?*/ findLast){
@@ -2233,7 +2255,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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
@@ -2258,7 +2280,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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
@@ -2277,7 +2299,7 @@ dojo.provide("dojo._base.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
+ // 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:
@@ -2300,21 +2322,21 @@ dojo.provide("dojo._base.array");
// | );
// example:
// | // use a scoped object member as the callback
- // |
+ // |
// | var obj = {
- // | prefix: "logged via obj.callback:",
+ // | 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 ],
@@ -2327,7 +2349,7 @@ dojo.provide("dojo._base.array");
// 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){
+ for(var i=0,l=arr.length; i<l; ++i){
_p[2].call(_p[1], arr[i], i, arr);
}
},
@@ -2344,7 +2366,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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:
@@ -2353,7 +2375,7 @@ dojo.provide("dojo._base.array");
// | // returns false
// | dojo.every([1, 2, 3, 4], function(item){ return item>1; });
// example:
- // | // returns true
+ // | // returns true
// | dojo.every([1, 2, 3, 4], function(item){ return item>0; });
return everyOrSome(true, arr, callback, thisObject); // Boolean
},
@@ -2370,7 +2392,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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:
@@ -2397,7 +2419,7 @@ dojo.provide("dojo._base.array");
// 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
+ // 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:
@@ -2428,9 +2450,9 @@ dojo.provide("dojo._base.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
+ // 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.
+ // 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:
@@ -2464,10 +2486,10 @@ dojo.provide("dojo._base.declare");
var d = dojo, mix = d._mixin, op = Object.prototype, opts = op.toString,
xtor = new Function, counter = 0, cname = "constructor";
- function err(msg){ throw new Error("declare: " + msg); }
+ 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){
+ 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;
@@ -2475,9 +2497,9 @@ dojo.provide("dojo._base.declare");
for(; i < l; ++i){
base = bases[i];
if(!base){
- err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?");
+ 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.");
+ err("mixin #" + i + " is not a callable constructor.", className);
}
lin = base._meta ? base._meta.bases : [base];
top = 0;
@@ -2530,7 +2552,7 @@ dojo.provide("dojo._base.declare");
}
}
if(clsCount){
- err("can't build consistent linearization");
+ err("can't build consistent linearization", className);
}
// calculate the superclass offset
@@ -2557,7 +2579,7 @@ dojo.provide("dojo._base.declare");
caller = args.callee;
name = name || caller.nom;
if(!name){
- err("can't deduce a name to call inherited()");
+ err("can't deduce a name to call inherited()", this.declaredClass);
}
meta = this.constructor._meta;
@@ -2575,7 +2597,7 @@ dojo.provide("dojo._base.declare");
// error detection
chains = meta.chains;
if(chains && typeof chains[name] == "string"){
- err("calling chained method with inherited: " + name);
+ err("calling chained method with inherited: " + name, this.declaredClass);
}
// find caller
do{
@@ -2616,7 +2638,7 @@ dojo.provide("dojo._base.declare");
// error detection
chains = meta.chains;
if(!chains || chains.constructor !== "manual"){
- err("calling chained constructor with inherited");
+ err("calling chained constructor with inherited", this.declaredClass);
}
// find caller
while(base = bases[++pos]){ // intentional assignment
@@ -2912,7 +2934,7 @@ dojo.provide("dojo._base.declare");
// build a prototype
if(opts.call(superclass) == "[object Array]"){
// C3 MRO
- bases = c3mro(superclass);
+ bases = c3mro(superclass, className);
t = bases[0];
mixins = bases.length - t;
superclass = bases[mixins];
@@ -2923,10 +2945,10 @@ dojo.provide("dojo._base.declare");
t = superclass._meta;
bases = bases.concat(t ? t.bases : superclass);
}else{
- err("base class is not a callable constructor.");
+ 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?")
+ err("unknown base class. Did you use dojo.require to pull it in?", className);
}
}
if(superclass){
@@ -3500,27 +3522,28 @@ 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
+ // 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
+ // - 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
+ // 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;
+ var ap = Array.prototype, c = arguments.callee, ls = c._listeners, t = c.target,
// return value comes from original target function
- var r = t && t.apply(this, arguments);
+ r = t && t.apply(this, arguments),
// make local copy of listener array so it is immutable during processing
- var i, lls;
- lls = [].concat(ls);
-
+ i, lls = [].concat(ls)
+ ;
+
// invoke listeners after target function
for(i in lls){
if(!(i in ap)){
@@ -3534,12 +3557,12 @@ dojo._listener = {
// 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.
+ // 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.
+ // be equivalent.
source = source || dojo.global;
// The source method is either null, a dispatcher, or some other function
var f = source[method];
@@ -3549,15 +3572,15 @@ dojo._listener = {
// original target function is special
d.target = f;
// dispatcher holds a list of listeners
- d._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 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
+ // 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.
@@ -3579,9 +3602,9 @@ dojo._listener = {
// 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,
+dojo.connect = function(/*Object|null*/ obj,
+ /*String*/ event,
+ /*Object|null*/ context,
/*String|Function*/ method,
/*Boolean?*/ dontFix){
// summary:
@@ -3616,37 +3639,37 @@ dojo.connect = function(/*Object|null*/ obj,
// 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
+ // The return value is a handle that is needed to
// remove this connection with `dojo.disconnect`.
//
- // obj:
- // The source object for the event function.
+ // obj:
+ // The source object for the event function.
// Defaults to `dojo.global` if null.
- // If obj is a DOM node, the connection is delegated
+ // 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.
+ // String name of the event function in obj.
// I.e. identifies a property `obj[event]`.
//
- // context:
+ // 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
+ //
+ // 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.
+ // 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
+ // If obj is a DOM node, set dontFix to true to prevent delegation
// of this connection to the DOM event manager.
//
// example:
@@ -3696,9 +3719,9 @@ dojo.connect = function(/*Object|null*/ obj,
// 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));
+ 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:
@@ -3712,11 +3735,11 @@ dojo.disconnect = function(/*Handle*/ 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
@@ -3734,15 +3757,15 @@ dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Fu
// 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.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.
+ // Remove a topic listener.
// handle:
// The handle returned from a call to subscribe.
// example:
@@ -3752,7 +3775,7 @@ dojo.unsubscribe = function(/*Handle*/ handle){
if(handle){
dojo._listener.remove(dojo._topics, handle[0], handle[1]);
}
-}
+};
dojo.publish = function(/*String*/ topic, /*Array*/ args){
// summary:
@@ -3760,11 +3783,11 @@ dojo.publish = function(/*String*/ topic, /*Array*/ args){
// topic:
// The name of the topic to publish.
// args:
- // An array of arguments. The arguments will be applied
+ // 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.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
@@ -3773,10 +3796,10 @@ dojo.publish = function(/*String*/ topic, /*Array*/ args){
if(f){
f.apply(this, args||[]);
}
-}
+};
-dojo.connectPublisher = function( /*String*/ topic,
- /*Object|null*/ obj,
+dojo.connectPublisher = function( /*String*/ topic,
+ /*Object|null*/ obj,
/*String*/ event){
// summary:
// Ensure that every time obj.event() is called, a message is published
@@ -3785,11 +3808,11 @@ dojo.connectPublisher = function( /*String*/ topic,
// the topic.
// topic:
// The name of the topic to publish.
- // obj:
+ // obj:
// The source object for the event function. Defaults to dojo.global
// if null.
// event:
- // The name of the event function in obj.
+ // The name of the event function in obj.
// I.e. identifies a property obj[event].
// example:
// | dojo.connectPublisher("/ajax/start", dojo, "xhrGet");
@@ -3804,42 +3827,43 @@ dojo._hasResource["dojo._base.Deferred"] = true;
dojo.provide("dojo._base.Deferred");
+
(function(){
- var mutator = 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.
+ // 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
+ // 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
+ //
+ // 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
+ //
+ // 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:
@@ -3849,7 +3873,7 @@ dojo.provide("dojo._base.Deferred");
// * callback(result)
// * errback(result)
//
- // Callbacks are allowed to return promisesthemselves, so
+ // 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
@@ -3909,7 +3933,7 @@ dojo.provide("dojo._base.Deferred");
// | renderDataitem(data[x]);
// | }
// | d.callback(true);
- // | }catch(e){
+ // | }catch(e){
// | d.errback(new Error("rendering failed"));
// | }
// | return d;
@@ -3923,7 +3947,7 @@ dojo.provide("dojo._base.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 syncrhonous and so both
+ // 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:
//
@@ -3936,7 +3960,7 @@ dojo.provide("dojo._base.Deferred");
// | renderDataitem(data[x]);
// | }
// | d.callback(true);
- // | }catch(e){
+ // | }catch(e){
// | d.errback(new Error("rendering failed"));
// | }
// | }, 100);
@@ -3951,11 +3975,11 @@ dojo.provide("dojo._base.Deferred");
// 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 = {};
+ var promise = (this.promise = {});
function complete(value){
if(finished){
- throw new Error("This deferred has already been resolved");
+ throw new Error("This deferred has already been resolved");
}
result = value;
finished = true;
@@ -3966,7 +3990,7 @@ dojo.provide("dojo._base.Deferred");
while(!mutated && nextListener){
var listener = nextListener;
nextListener = nextListener.next;
- if(mutated = (listener.progress == mutator)){ // assignment and check
+ if((mutated = (listener.progress == mutator))){ // assignment and check
finished = false;
}
var func = (isError ? listener.error : listener.resolved);
@@ -3978,6 +4002,9 @@ dojo.provide("dojo._base.Deferred");
continue;
}
var unchanged = mutated && newResult === undefined;
+ if(mutated && !unchanged){
+ isError = newResult instanceof Error;
+ }
listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
}
catch (e) {
@@ -3990,7 +4017,7 @@ dojo.provide("dojo._base.Deferred");
listener.deferred.resolve(result);
}
}
- }
+ }
}
// calling resolve will resolve the promise
this.resolve = this.callback = function(value){
@@ -4005,7 +4032,7 @@ dojo.provide("dojo._base.Deferred");
// 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
+ // Fulfills the Deferred instance as an error with the provided error
isError = true;
this.fired = 1;
complete(error);
@@ -4022,7 +4049,7 @@ dojo.provide("dojo._base.Deferred");
while(listener){
var progress = listener.progress;
progress && progress(update);
- listener = listener.next;
+ listener = listener.next;
}
};
this.addCallbacks = function(/*Function?*/callback, /*Function?*/errback){
@@ -4031,35 +4058,35 @@ dojo.provide("dojo._base.Deferred");
};
// 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
+ // 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
+ //
+ // 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
- //
+ // | >44
+ //
var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
var listener = {
- resolved: resolvedCallback,
- error: errorCallback,
- progress: progressCallback,
+ resolved: resolvedCallback,
+ error: errorCallback,
+ progress: progressCallback,
deferred: returnDeferred
- };
+ };
if(nextListener){
head = head.next = listener;
}
@@ -4085,7 +4112,7 @@ dojo.provide("dojo._base.Deferred");
deferred.reject(error);
}
}
- }
+ };
freeze(promise);
};
dojo.extend(dojo.Deferred, {
@@ -4106,7 +4133,7 @@ dojo.provide("dojo._base.Deferred");
})();
dojo.when = function(promiseOrValue, /*Function?*/callback, /*Function?*/errback, /*Function?*/progressHandler){
// summary:
- // This provides normalization between normal synchronous values and
+ // This provides normalization between normal synchronous values and
// asynchronous promises, so you can interact with them in a common way
// example:
// | function printFirstAndList(items){
@@ -4139,6 +4166,7 @@ if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build.
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.
@@ -4146,12 +4174,12 @@ dojo.fromJson = function(/*String*/ json){
// 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:
+ // 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:
@@ -4161,7 +4189,7 @@ dojo._escapeString = function(/*String*/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"); // string
-}
+};
dojo.toJsonIndentStr = "\t";
dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){
@@ -4205,8 +4233,8 @@ dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _ind
if(it === null){
return "null";
}
- if(dojo.isString(it)){
- return dojo._escapeString(it);
+ if(dojo.isString(it)){
+ return dojo._escapeString(it);
}
// recurse
var recurse = arguments.callee;
@@ -4279,7 +4307,7 @@ dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _ind
output.push(newLine + nextIndent + keyStr + ":" + sep + val);
}
return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String
-}
+};
}
@@ -4289,6 +4317,7 @@ dojo.provide("dojo._base.Color");
+
(function(){
var d = dojo;
@@ -4477,7 +4506,7 @@ dojo.provide("dojo._base.Color");
// 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
+ // | 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();
@@ -4504,24 +4533,11 @@ dojo.provide("dojo._base.Color");
}
-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");
-
-
-
-
-
-
-
-
-
-}
-
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:
@@ -4547,7 +4563,7 @@ dojo.body = function(){
// 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:
@@ -4560,9 +4576,9 @@ dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocu
dojo.doc = globalDocument;
};
-dojo.withGlobal = function( /*Object*/globalObject,
- /*Function*/callback,
- /*Object?*/thisObject,
+dojo.withGlobal = function( /*Object*/globalObject,
+ /*Function*/callback,
+ /*Object?*/thisObject,
/*Array?*/cbArguments){
// summary:
// Invoke callback with globalObject as dojo.global and
@@ -4581,11 +4597,11 @@ dojo.withGlobal = function( /*Object*/globalObject,
}finally{
dojo.global = oldGlob;
}
-}
+};
-dojo.withDoc = function( /*DocumentElement*/documentObject,
- /*Function*/callback,
- /*Object?*/thisObject,
+dojo.withDoc = function( /*DocumentElement*/documentObject,
+ /*Function*/callback,
+ /*Object?*/thisObject,
/*Array?*/cbArguments){
// summary:
// Invoke callback with documentObject as dojo.doc.
@@ -4616,7 +4632,6 @@ dojo.withDoc = function( /*DocumentElement*/documentObject,
dojo.isQuirks = oldQ;
}
};
-
}
@@ -4625,27 +4640,26 @@ 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;}
+ if(!node){return;}
name = del._normalizeEventName(name);
fp = del._fixCallback(name, fp);
- var oname = name;
if(
- !dojo.isIE &&
+ !dojo.isIE &&
(name == "mouseenter" || name == "mouseleave")
){
var ofp = fp;
- //oname = name;
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);
+ return ofp.call(this, e);
}
}
}
@@ -4686,7 +4700,7 @@ dojo.provide("dojo._base.event");
},
_fixEvent: function(evt, sender){
// _fixCallback only attaches us to keypress.
- // Switch on evt.type anyway because we might
+ // Switch on evt.type anyway because we might
// be called directly from dojo.fixEvent.
switch(evt.type){
case "keypress":
@@ -4696,26 +4710,26 @@ dojo.provide("dojo._base.event");
return evt;
},
_setKeyChar: function(evt){
- evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';
+ 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
+ _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
}
});
@@ -4730,7 +4744,7 @@ dojo.provide("dojo._base.event");
// sender: DOMNode
// node to treat as "currentTarget"
return del._fixEvent(evt, sender);
- }
+ };
dojo.stopEvent = function(/*Event*/ evt){
// summary:
@@ -4741,7 +4755,7 @@ dojo.provide("dojo._base.event");
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;
@@ -4756,16 +4770,16 @@ dojo.provide("dojo._base.event");
// 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"
+ // 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
@@ -4895,7 +4909,7 @@ dojo.provide("dojo._base.event");
};
=====*/
- if(dojo.isIE){
+ if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
dojo.mouseButtons = {
LEFT: 1,
MIDDLE: 4,
@@ -4920,7 +4934,7 @@ dojo.provide("dojo._base.event");
}
// IE event normalization
- if(dojo.isIE){
+ if(dojo.isIE){
var _trySetKeyCode = function(e, code){
try{
// squelch errors when keyCode is read-only
@@ -4929,7 +4943,7 @@ dojo.provide("dojo._base.event");
}catch(e){
return 0;
}
- }
+ };
// by default, use the standard listener
var iel = dojo._listener;
@@ -4938,7 +4952,7 @@ dojo.provide("dojo._base.event");
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
+ // support handler indirection: event handler functions are
// referenced here. Event dispatchers hold only indices.
handlers: [],
// add a listener to an object
@@ -4991,7 +5005,7 @@ dojo.provide("dojo._base.event");
},
remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
event = del._normalizeEventName(event);
- iel.remove(node, event, handle);
+ iel.remove(node, event, handle);
if(event=="onkeypress"){
var kd = node.onkeydown;
if(--kd._stealthKeydownRefs <= 0){
@@ -5017,11 +5031,11 @@ dojo.provide("dojo._base.event");
// node to treat as "currentTarget"
if(!evt){
var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window;
- evt = w.event;
+ evt = w.event;
}
if(!evt){return(evt);}
- evt.target = evt.srcElement;
- evt.currentTarget = (sender || evt.srcElement);
+ 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
@@ -5034,14 +5048,16 @@ dojo.provide("dojo._base.event");
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"){
+ if(evt.type == "mouseover"){
evt.relatedTarget = evt.fromElement;
}
- if(evt.type == "mouseout"){
+ if(evt.type == "mouseout"){
evt.relatedTarget = evt.toElement;
}
- evt.stopPropagation = del._stopPropagation;
- evt.preventDefault = del._preventDefault;
+ if (dojo.isIE < 9 || dojo.isQuirks) {
+ evt.stopPropagation = del._stopPropagation;
+ evt.preventDefault = del._preventDefault;
+ }
return del._fixKeys(evt);
},
_fixKeys: function(evt){
@@ -5075,38 +5091,41 @@ dojo.provide("dojo._base.event");
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!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222);
+ 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){
+ 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)){
+ }else if((!evt.shiftKey)&&(c>=65&&c<=90)){
c += 32; // map CTRL-[A-Z] to lowercase
- }else{
+ }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);
- evt.cancelBubble = faux.cancelBubble;
+ 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;
+ 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
+ // 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;
@@ -5116,23 +5135,23 @@ dojo.provide("dojo._base.event");
});
// override stopEvent for IE
- dojo.stopEvent = function(evt){
+ 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);
+ // 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(); };
+ faux.preventDefault = function(){ evt.preventDefault(); };
+ faux.stopPropagation = function(){ evt.stopPropagation(); };
return faux;
- }
+ };
// Opera event normalization
if(dojo.isOpera){
@@ -5183,12 +5202,12 @@ dojo.provide("dojo._base.event");
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){
+ 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){
+ }else if(!evt.shiftKey && c>=65 && c<=90){
c += 32; // map CTRL-[A-Z] to lowercase
- }else{
+ }else{
c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII
}
}
@@ -5245,25 +5264,26 @@ if(dojo.isIE){
}
}
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{
@@ -5307,13 +5327,13 @@ dojo.byId = function(id, doc){
// | }
=====*/
-if(dojo.isIE || dojo.isOpera){
+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
+ // 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;
@@ -5334,8 +5354,9 @@ if(dojo.isIE || dojo.isOpera){
};
}else{
dojo.byId = function(id, doc){
- // inline'd type check
- return (typeof id == "string") ? (doc || dojo.doc).getElementById(id) : id; // DomNode
+ // 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
};
}
/*=====
@@ -5418,16 +5439,16 @@ if(dojo.isIE || dojo.isOpera){
};
dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){
- // summary:
+ // 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
+ // state to put the node in. false indicates unselectable, true
// allows selection.
// example:
// Make the node id="bar" unselectable
- // | dojo.setSelectable("bar");
+ // | dojo.setSelectable("bar");
// example:
// Make the node id="bar" selectable
// | dojo.setSelectable("bar", true);
@@ -5510,7 +5531,7 @@ if(dojo.isIE || dojo.isOpera){
refNode = byId(refNode);
if(typeof node == "string"){ // inline'd type check
- node = node.charAt(0) == "<" ? d._toDom(node, refNode.ownerDocument) : byId(node);
+ node = /^\s*</.test(node) ? d._toDom(node, refNode.ownerDocument) : byId(node);
}
if(typeof position == "number"){ // inline'd type check
var cn = refNode.childNodes;
@@ -5545,7 +5566,7 @@ if(dojo.isIE || dojo.isOpera){
}
}
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.
@@ -5557,7 +5578,7 @@ if(dojo.isIE || dojo.isOpera){
dojo.boxModel = "content-box";
// We punt per-node box mode testing completely.
- // If anybody cares, we can provide an additional (optional) unit
+ // 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.
@@ -5577,10 +5598,10 @@ if(dojo.isIE || dojo.isOpera){
// getComputedStyle drives most of the style code.
// Wherever possible, reuse the returned object.
//
- // API functions below that need to access computed styles accept an
+ // 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
+ // This way, calling code can access computedStyle once, and then pass the reference to
// multiple API functions.
/*=====
@@ -5619,7 +5640,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // it is frequently sent to this function even
// though it is not Element.
var gcs;
if(d.isWebKit){
@@ -5680,7 +5701,7 @@ if(dojo.isIE || dojo.isOpera){
runtimeStyle.left = rsLeft;
}
return avalue;
- }
+ };
}
var px = d._toPixelValue;
@@ -5708,7 +5729,7 @@ if(dojo.isIE || dojo.isOpera){
};
dojo._getOpacity =
- d.isIE ? function(node){
+ d.isIE < 9 ? function(node){
try{
return af(node).Opacity / 100; // Number
}catch(e){
@@ -5735,7 +5756,7 @@ if(dojo.isIE || dojo.isOpera){
=====*/
dojo._setOpacity =
- d.isIE ? function(/*DomNode*/node, /*Number*/opacity){
+ d.isIE < 9 ? function(/*DomNode*/node, /*Number*/opacity){
var ov = opacity * 100, opaque = opacity == 1;
node.style.zoom = opaque ? "" : 1;
@@ -5807,7 +5828,7 @@ if(dojo.isIE || dojo.isOpera){
// 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()`,
+ // 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
@@ -5876,7 +5897,7 @@ if(dojo.isIE || dojo.isOpera){
return s;
}
return (args == 1) ? s : _toStyleValue(n, style, s[style] || n.style[style]); /* CSS2Properties||String||Number */
- }
+ };
// =============================
// Box Functions
@@ -5889,13 +5910,13 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // | 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
+ var
s = computedStyle||gcs(n),
l = px(n, s.paddingLeft),
t = px(n, s.paddingTop);
@@ -5905,7 +5926,7 @@ if(dojo.isIE || dojo.isOpera){
w: l+px(n, s.paddingRight),
h: t+px(n, s.paddingBottom)
};
- }
+ };
dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){
// summary:
@@ -5919,7 +5940,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ var
ne = "none",
s = computedStyle||gcs(n),
bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0),
@@ -5930,7 +5951,7 @@ if(dojo.isIE || dojo.isOpera){
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:
@@ -5944,7 +5965,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ var
s = computedStyle||gcs(n),
p = d._getPadExtents(n, s),
b = d._getBorderExtents(n, s);
@@ -5954,7 +5975,7 @@ if(dojo.isIE || dojo.isOpera){
w: p.w + b.w,
h: p.h + b.h
};
- }
+ };
dojo._getMarginExtents = function(n, computedStyle){
// summary:
@@ -5968,7 +5989,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ var
s = computedStyle||gcs(n),
l = px(n, s.marginLeft),
t = px(n, s.marginTop),
@@ -5976,9 +5997,9 @@ if(dojo.isIE || dojo.isOpera){
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
+ // 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
+ // 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;
@@ -5989,7 +6010,7 @@ if(dojo.isIE || dojo.isOpera){
w: l+r,
h: t+b
};
- }
+ };
// Box getters work in any box context because offsetWidth/clientWidth
// are invariant wrt box context
@@ -5997,10 +6018,10 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // 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
+ // 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)
@@ -6044,9 +6065,23 @@ if(dojo.isIE || dojo.isOpera){
l: l,
t: t,
w: node.offsetWidth + me.w,
- h: node.offsetHeight + me.h
+ 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:
@@ -6075,7 +6110,7 @@ if(dojo.isIE || dojo.isOpera){
w: w - pe.w - be.w,
h: h - pe.h - be.h
};
- }
+ };
dojo._getBorderBox = function(node, computedStyle){
var s = computedStyle || gcs(node),
@@ -6088,7 +6123,7 @@ if(dojo.isIE || dojo.isOpera){
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.
@@ -6099,12 +6134,12 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // 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
+ // 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){
@@ -6130,14 +6165,14 @@ if(dojo.isIE || dojo.isOpera){
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:
@@ -6152,7 +6187,7 @@ if(dojo.isIE || dojo.isOpera){
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:
@@ -6164,7 +6199,7 @@ if(dojo.isIE || dojo.isOpera){
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,
@@ -6196,7 +6231,7 @@ if(dojo.isIE || dojo.isOpera){
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 };
@@ -6231,7 +6266,7 @@ if(dojo.isIE || dojo.isOpera){
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:
@@ -6256,14 +6291,14 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // Positioning
// =============================
var _sumAncestorProperties = function(node, prop){
- if(!(node = (node||0).parentNode)){return 0}
+ if(!(node = (node||0).parentNode)){return 0;}
var val, retVal = 0, _b = d.body();
while(node && node.style){
if(gcs(node).position == "fixed"){
@@ -6279,19 +6314,19 @@ if(dojo.isIE || dojo.isOpera){
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.doc.documentElement, n.clientHeight? { x:d._fixIeBiDiScrollLeft(n.scrollLeft), y:n.scrollTop } :
- (n=d.body(), { x:n.scrollLeft||0, y:n.scrollTop||0 }));
+ 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
- }
+ d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean
+ };
dojo._getIeDocumentElementOffset = function(){
// summary:
@@ -6312,7 +6347,7 @@ if(dojo.isIE || dojo.isOpera){
//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 = 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+
@@ -6337,18 +6372,22 @@ if(dojo.isIE || dojo.isOpera){
};
dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){
- // In RTL direction, scrollLeft should be a negative value, but IE < 8
+ // 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 dd = d.doc;
- if(d.isIE < 8 && !d._isBodyLtr()){
- var de = d.isQuirks ? dd.body : dd.documentElement;
- return scrollLeft + de.clientWidth - de.scrollWidth; // Integer
+ 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){
@@ -6366,10 +6405,9 @@ if(dojo.isIE || dojo.isOpera){
// Uses the border-box model (inclusive of border and padding but
// not margin). Does not act as a setter.
- var db = d.body(), dh = db.parentNode, ret;
node = byId(node);
- if(node["getBoundingClientRect"]){
- // IE6+, FF3+, super-modern WebKit, and Opera 9.6+ all take this branch
+ 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){
@@ -6386,60 +6424,7 @@ if(dojo.isIE || dojo.isOpera){
ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
}
- }else{
- // FF2 and older WebKit
- ret = {
- x: 0,
- y: 0,
- w: node.offsetWidth,
- h: node.offsetHeight
- };
- if(node["offsetParent"]){
- ret.x -= _sumAncestorProperties(node, "scrollLeft");
- ret.y -= _sumAncestorProperties(node, "scrollTop");
-
- var curnode = node;
- do{
- var n = curnode.offsetLeft,
- t = curnode.offsetTop;
- ret.x += isNaN(n) ? 0 : n;
- ret.y += isNaN(t) ? 0 : t;
-
- cs = gcs(curnode);
- if(curnode != node){
- if(d.isMoz){
- // tried left+right with differently sized left/right borders
- // it really is 2xleft border in FF, not left+right, even in RTL!
- ret.x += 2 * px(curnode,cs.borderLeftWidth);
- ret.y += 2 * px(curnode,cs.borderTopWidth);
- }else{
- ret.x += px(curnode, cs.borderLeftWidth);
- ret.y += px(curnode, cs.borderTopWidth);
- }
- }
- // static children in a static div in FF2 are affected by the div's border as well
- // but offsetParent will skip this div!
- if(d.isMoz && cs.position=="static"){
- var parent=curnode.parentNode;
- while(parent!=curnode.offsetParent){
- var pcs=gcs(parent);
- if(pcs.position=="static"){
- ret.x += px(curnode,pcs.borderLeftWidth);
- ret.y += px(curnode,pcs.borderTopWidth);
- }
- parent=parent.parentNode;
- }
- }
- curnode = curnode.offsetParent;
- }while((curnode != dh) && curnode);
- }else if(node.x && node.y){
- ret.x += isNaN(node.x) ? 0 : node.x;
- ret.y += isNaN(node.y) ? 0 : node.y;
- }
- }
- // 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
+ // account for document scrolling
if(includeScroll){
var scroll = d._docScroll();
ret.x += scroll.x;
@@ -6447,7 +6432,7 @@ if(dojo.isIE || dojo.isOpera){
}
return ret; // Object
- }
+ };
dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){
// summary:
@@ -6469,7 +6454,7 @@ if(dojo.isIE || dojo.isOpera){
mb.x = abs.x;
mb.y = abs.y;
return mb;
- }
+ };
// =============================
// Element attribute Functions
@@ -6531,7 +6516,7 @@ if(dojo.isIE || dojo.isOpera){
// 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",
@@ -6701,7 +6686,7 @@ if(dojo.isIE || dojo.isOpera){
// 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:
@@ -6711,7 +6696,7 @@ if(dojo.isIE || dojo.isOpera){
// name:
// the name of the attribute to remove
byId(node).removeAttribute(_fixAttrName(name));
- }
+ };
dojo.getNodeProp = function(/*DomNode|String*/ node, /*String*/ name){
// summary:
@@ -6730,7 +6715,7 @@ if(dojo.isIE || dojo.isOpera){
// 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:
@@ -6745,7 +6730,7 @@ if(dojo.isIE || dojo.isOpera){
// 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
+ // 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
@@ -6783,7 +6768,7 @@ if(dojo.isIE || dojo.isOpera){
// | 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
+ // 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"];
@@ -6813,7 +6798,7 @@ if(dojo.isIE || dojo.isOpera){
if(attrs){ d.attr(tag, attrs); }
if(refNode){ d.place(tag, refNode, pos); }
return tag; // DomNode
- }
+ };
/*=====
dojo.empty = function(node){
@@ -6881,11 +6866,13 @@ if(dojo.isIE || dojo.isOpera){
// generate start/end tag strings to use
// for the injection for each special tag wrap case.
for(var param in tagWrap){
- 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
+ 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){
@@ -6928,7 +6915,7 @@ if(dojo.isIE || dojo.isOpera){
df.appendChild(fc);
}
return df; // DOMNode
- }
+ };
// =============================
// (CSS) Class Functions
@@ -6954,6 +6941,7 @@ if(dojo.isIE || dojo.isOpera){
};
var spaces = /\s+/, a1 = [""],
+ fakeNode = {},
str2array = function(s){
if(typeof s == "string" || s instanceof String){
if(s.indexOf(" ") < 0){
@@ -7059,6 +7047,39 @@ if(dojo.isIE || dojo.isOpera){
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.
@@ -7093,6 +7114,9 @@ dojo.provide("dojo._base.NodeList");
+
+
+
(function(){
var d = dojo;
@@ -7330,7 +7354,7 @@ dojo.provide("dojo._base.NodeList");
});
// add forEach actions
- d.forEach(["connect", "addClass", "removeClass", "toggleClass", "empty", "removeAttr"], function(name){
+ d.forEach(["connect", "addClass", "removeClass", "replaceClass", "toggleClass", "empty", "removeAttr"], function(name){
nlp[name] = adaptAsForEach(d[name]);
});
@@ -7388,7 +7412,7 @@ dojo.provide("dojo._base.NodeList");
_cloneNode: function(/*DOMNode*/ node){
// summary:
- // private utiltity to clone a node. Not very interesting in the vanilla
+ // 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);
@@ -7482,7 +7506,7 @@ dojo.provide("dojo._base.NodeList");
if(this._parent){
return this._parent;
}else{
- //Just return empy list.
+ //Just return empty list.
return new this._NodeListCtor();
}
},
@@ -7550,12 +7574,12 @@ dojo.provide("dojo._base.NodeList");
indexOf: function(value, fromIndex){
// summary:
- // see dojo.indexOf(). The primary difference is that the acted-on
+ // 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 loction to start searching from. Optional. Defaults to 0.
+ // The location to start searching from. Optional. Defaults to 0.
// description:
// For more details on the behavior of indexOf, see Mozilla's
// (indexOf
@@ -7576,7 +7600,7 @@ dojo.provide("dojo._base.NodeList");
// value: Object
// The value to search for.
// fromIndex: Integer?
- // The loction to start searching from. Optional. Defaults to 0.
+ // 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
@@ -7654,12 +7678,12 @@ dojo.provide("dojo._base.NodeList");
forEach: function(callback, thisObj){
// summary:
- // see `dojo.forEach()`. The primary difference is that the acted-on
+ // 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
+ return this; // dojo.NodeList
},
/*=====
@@ -7676,7 +7700,7 @@ dojo.provide("dojo._base.NodeList");
// 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.
+ // assumes the node passed is each node in this list.
return d.map(this, d.position); // Array
},
@@ -7699,7 +7723,7 @@ dojo.provide("dojo._base.NodeList");
// Disable a group of buttons:
// | dojo.query("button.group").attr("disabled", true);
// example:
- // innerHTML can be assigned or retreived as well:
+ // 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
@@ -7764,7 +7788,7 @@ dojo.provide("dojo._base.NodeList");
// 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
+ // (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
@@ -7810,7 +7834,7 @@ dojo.provide("dojo._base.NodeList");
// 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
+ // In the selector case, only the first matching element will be used
// for relative positioning.
// position:
// can be one of:
@@ -7825,18 +7849,15 @@ dojo.provide("dojo._base.NodeList");
return this.forEach(function(node){ d.place(node, item, position); }); // dojo.NodeList
},
- orphan: function(/*String?*/ simpleFilter){
+ orphan: function(/*String?*/ filter){
// summary:
- // removes elements in this list that match the simple filter
+ // removes elements in this list that match the filter
// from their parents and returns them as a new NodeList.
- // simpleFilter:
- // 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.
+ // filter:
+ // CSS selector like ".foo" or "div > span"
// returns:
- // `dojo.NodeList` containing the orpahned elements
- return (simpleFilter ? d._filterQueryResult(this, simpleFilter) : this).forEach(orphan); // dojo.NodeList
+ // `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){
@@ -7863,7 +7884,7 @@ dojo.provide("dojo._base.NodeList");
// FIXME: do we need this?
query: function(/*String*/ queryStr){
// summary:
- // Returns a new list whose memebers match the passed query,
+ // Returns a new list whose members match the passed query,
// assuming elements of the current NodeList as the root for
// each search.
// example:
@@ -7874,9 +7895,9 @@ dojo.provide("dojo._base.NodeList");
// | </p>
// | </div>
// | <div id="bar">
- // | <p>great commedians may not be funny <span>in person</span></p>
+ // | <p>great comedians may not be funny <span>in person</span></p>
// | </div>
- // If we are presented with the following defintion for a NodeList:
+ // 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:
@@ -7891,18 +7912,14 @@ dojo.provide("dojo._base.NodeList");
return this._wrap(apc.apply([], ret), this); // dojo.NodeList
},
- filter: function(/*String|Function*/ simpleFilter){
+ 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.
- // simpleFilter:
- // If a string, a 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.
+ // 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){
@@ -7914,7 +7931,7 @@ dojo.provide("dojo._base.NodeList");
// | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
var a = arguments, items = this, start = 0;
- if(typeof simpleFilter == "string"){ // inline'd type check
+ 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
@@ -7962,10 +7979,10 @@ dojo.provide("dojo._base.NodeList");
// | "before"
// | "after"
// | "replace" (replaces nodes in this NodeList with new content)
- // | "only" (removes other children of the nodes so new content is hte only child)
+ // | "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 ommitted
+ // 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
@@ -7996,7 +8013,7 @@ dojo.provide("dojo._base.NodeList");
// text: "Send"
// });
content = this._normalize(content, this[0]);
- for(var i = 0, node; node = this[i]; i++){
+ for(var i = 0, node; (node = this[i]); i++){
this._place(content, node, position, i > 0);
}
return this; //dojo.NodeList
@@ -8025,11 +8042,11 @@ dojo.provide("dojo._base.NodeList");
// 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.
+ // list and go backwards.
//
// example:
// Shorten the list to the first, second, and third elements
- // | dojo.query("a").at(0, 1, 2).forEach(fn);
+ // | dojo.query("a").at(0, 1, 2).forEach(fn);
//
// example:
// Retrieve the first and last elements of a unordered list:
@@ -8039,13 +8056,13 @@ dojo.provide("dojo._base.NodeList");
// 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.
- // | })
+ // | console.log(n); // all anchors on the page.
+ // | })
//
// returns:
// dojo.NodeList
var t = new this._NodeListCtor();
- d.forEach(arguments, function(i){
+ d.forEach(arguments, function(i){
if(i < 0){ i = this.length + i }
if(this[i]){ t.push(this[i]); }
}, this);
@@ -8055,7 +8072,8 @@ dojo.provide("dojo._base.NodeList");
});
nl.events = [
- // summary: list of all DOM events used in NodeList
+ // 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"
@@ -8068,7 +8086,7 @@ dojo.provide("dojo._base.NodeList");
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) :
@@ -8099,12 +8117,7 @@ dojo.provide("dojo._base.NodeList");
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;
-if(typeof dojo != "undefined"){
- dojo.provide("dojo._base.query");
-
-
-
-}
+(function(){
/*
dojo.query() architectural overview:
@@ -8138,7 +8151,7 @@ if(typeof dojo != "undefined"){
5.) matched nodes are pruned to ensure they are unique (if necessary)
*/
-;(function(d){
+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").
@@ -8146,7 +8159,7 @@ if(typeof dojo != "undefined"){
// Toolkit aliases
////////////////////////////////////////////////////////////////////////
- // if you are extracing dojo.query for use in your own system, you will
+ // 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
@@ -8157,7 +8170,7 @@ if(typeof dojo != "undefined"){
// d.isOpera; // float
// d.isWebKit; // float
// d.doc ; // document element
- var qlc = d._NodeListCtor = d.NodeList;
+ 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
@@ -8188,7 +8201,7 @@ if(typeof dojo != "undefined"){
////////////////////////////////////////////////////////////////////////
var getQueryParts = function(query){
- // summary:
+ // summary:
// state machine for query tokenization
// description:
// instead of using a brittle and slow regex-based CSS parser,
@@ -8197,16 +8210,16 @@ if(typeof dojo != "undefined"){
// 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) charachter and returns an
+ // 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:
+ // NOTE:
// this code is designed to run fast and compress well. Sacrifices
- // to readibility and maintainability have been made. Your best
+ // 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
@@ -8222,7 +8235,7 @@ if(typeof dojo != "undefined"){
}
var ts = function(/*Integer*/ s, /*Integer*/ e){
- // trim and slice.
+ // 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
@@ -8230,12 +8243,12 @@ if(typeof dojo != "undefined"){
}
// the overall data graph of the full query, as represented by queryPart objects
- var queryParts = [];
+ var queryParts = [];
// state keeping vars
- var inBrackets = -1, inParens = -1, inMatchFor = -1,
- inPseudo = -1, inClass = -1, inId = -1, inTag = -1,
+ var inBrackets = -1, inParens = -1, inMatchFor = -1,
+ inPseudo = -1, inClass = -1, inId = -1, inTag = -1,
lc = "", cc = "", pStart;
// iteration vars
@@ -8244,7 +8257,7 @@ if(typeof dojo != "undefined"){
currentPart = null, // data structure representing the entire clause
_cp = null; // the current pseudo or attr matcher
- // several temporary variables are assigned to this structure durring a
+ // 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
@@ -8299,9 +8312,9 @@ if(typeof dojo != "undefined"){
// 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.loops = (
+ currentPart.pseudos.length ||
+ currentPart.attrs.length ||
currentPart.classes.length );
currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string
@@ -8331,9 +8344,9 @@ if(typeof dojo != "undefined"){
currentPart.infixOper = queryParts.pop();
currentPart.query = currentPart.infixOper.query + " " + currentPart.query;
/*
- console.debug( "swapping out the infix",
- currentPart.infixOper,
- "and attaching it to",
+ console.debug( "swapping out the infix",
+ currentPart.infixOper,
+ "and attaching it to",
currentPart);
*/
}
@@ -8342,15 +8355,15 @@ if(typeof dojo != "undefined"){
currentPart = null;
}
- // iterate over the query, charachter by charachter, building up a
+ // 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 charachter (if any)
+ // 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(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;
@@ -8393,7 +8406,7 @@ if(typeof dojo != "undefined"){
// 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;
+ inTag = x;
}
if(inBrackets >= 0){
@@ -8401,7 +8414,7 @@ if(typeof dojo != "undefined"){
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 existance match in the
+ // assume this is an attribute existence match in the
// form of [someAttributeName]
_cp.attr = ts(inBrackets+1, x);
}else{
@@ -8412,19 +8425,19 @@ if(typeof dojo != "undefined"){
var cmf = _cp.matchFor;
if(cmf){
// try to strip quotes from the matchFor value. We want
- // [attrName=howdy] to match the same
+ // [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.
+ // 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.
+ // record it along with the "=" operator.
var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : "";
_cp.type = addToCc+cc;
_cp.attr = ts(inBrackets+1, x-addToCc.length);
@@ -8433,7 +8446,7 @@ if(typeof dojo != "undefined"){
// 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 pseduo-selector rule like
+ // out if it's attached to a pseudo-selector rule like
// :nth-child(1)
if(cc == ")"){
if(inPseudo >= 0){
@@ -8454,7 +8467,7 @@ if(typeof dojo != "undefined"){
endAll();
inPseudo = x;
}else if(cc == "["){
- // start of an attribute match.
+ // start of an attribute match.
endAll();
inBrackets = x;
// provide a new structure for the attribute match to fill-in
@@ -8468,15 +8481,15 @@ if(typeof dojo != "undefined"){
// 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),
+ _cp = {
+ name: ts(inPseudo+1, x),
value: null
}
currentPart.pseudos.push(_cp);
}
inParens = x;
}else if(
- (cc == " ") &&
+ (cc == " ") &&
// if it's a space char and the last char is too, consume the
// current one without doing more work
(lc != cc)
@@ -8496,7 +8509,7 @@ if(typeof dojo != "undefined"){
// 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 possed, the other is used exclusively.
+ // either are not passed, the other is used exclusively.
if(!first){ return second; }
if(!second){ return first; }
@@ -8548,7 +8561,7 @@ if(typeof dojo != "undefined"){
}
},
"$=": function(attr, value){
- // E[foo$="bar"]
+ // E[foo$="bar"]
// an E element whose "foo" attribute value ends exactly
// with the string "bar"
var tval = " "+value;
@@ -8558,7 +8571,7 @@ if(typeof dojo != "undefined"){
}
},
"~=": function(attr, value){
- // E[foo~="bar"]
+ // 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"
@@ -8624,7 +8637,7 @@ if(typeof dojo != "undefined"){
if(!tret){ return -1; }
var l = tret.length;
- // we calcuate the parent length as a cheap way to invalidate the
+ // 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 ){
@@ -8636,11 +8649,11 @@ if(typeof dojo != "undefined"){
root["_l"] = l;
ci = -1;
for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){
- if(_simpleNodeTest(te)){
+ if(_simpleNodeTest(te)){
te["_i"] = ++i;
- if(node === te){
+ if(node === te){
// NOTE:
- // shortcuting the return at this step in indexing works
+ // 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
@@ -8671,7 +8684,7 @@ if(typeof dojo != "undefined"){
"first-child": function(){ return _lookLeft; },
"last-child": function(){ return _lookRight; },
"only-child": function(name, condition){
- return function(node){
+ return function(node){
if(!_lookLeft(node)){ return false; }
if(!_lookRight(node)){ return false; }
return true;
@@ -8702,7 +8715,7 @@ if(typeof dojo != "undefined"){
},
"not": function(name, condition){
var p = getQueryParts(condition)[0];
- var ignores = { el: 1 };
+ var ignores = { el: 1 };
if(p.tag != "*"){
ignores.tag = 1;
}
@@ -8762,7 +8775,7 @@ if(typeof dojo != "undefined"){
}
};
- var defaultGetter = (d.isIE) ? function(cond){
+ var defaultGetter = (d.isIE < 9 || (dojo.isIE && dojo.isQuirks)) ? function(cond){
var clc = cond.toLowerCase();
if(clc == "class"){ cond = "className"; }
return function(elem){
@@ -8776,7 +8789,7 @@ if(typeof dojo != "undefined"){
var getSimpleFilterFunc = function(query, ignores){
// generates a node tester function based on the passed query part. The
- // query part is one of the structures generatd by the query parser
+ // 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
@@ -8807,7 +8820,7 @@ if(typeof dojo != "undefined"){
if(isWildcard){
cname = cname.substr(0, cname.length-1);
}
- // I dislike the regex thing, even if memozied in a cache, but it's VERY short
+ // 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|$)");
@@ -8845,7 +8858,7 @@ if(typeof dojo != "undefined"){
if(!("id" in ignores)){
if(query.id){
- ff = agree(ff, function(elem){
+ ff = agree(ff, function(elem){
return (!!elem && (elem.id == query.id));
});
}
@@ -8853,7 +8866,7 @@ if(typeof dojo != "undefined"){
if(!ff){
if(!("default" in ignores)){
- ff = yesman;
+ ff = yesman;
}
}
return ff;
@@ -8904,7 +8917,7 @@ if(typeof dojo != "undefined"){
_simpleNodeTest(te) &&
(!bag || _isUnique(te, bag)) &&
(filterFunc(te, x))
- ){
+ ){
ret.push(te);
}
}
@@ -8946,7 +8959,7 @@ if(typeof dojo != "undefined"){
// 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
- // founde, a test function is applied to weed out the ones we
+ // 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
@@ -8999,7 +9012,7 @@ if(typeof dojo != "undefined"){
var filterFunc = getSimpleFilterFunc(query, { el: 1 });
var qt = query.tag;
var wildcardTag = ("*" == qt);
- var ecs = getDoc()["getElementsByClassName"];
+ var ecs = getDoc()["getElementsByClassName"];
if(!oper){
// if there's no infix operator, then it's a descendant query. ID
@@ -9009,8 +9022,8 @@ if(typeof dojo != "undefined"){
// 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 :
+ filterFunc = (!query.loops && wildcardTag) ?
+ yesman :
getSimpleFilterFunc(query, { el: 1, id: 1 });
retFunc = function(root, arr){
@@ -9025,9 +9038,9 @@ if(typeof dojo != "undefined"){
}
}
}else if(
- ecs &&
+ ecs &&
// isAlien check. Workaround for Prototype.js being totally evil/dumb.
- /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
+ /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
query.classes.length &&
!cssCaseBug
){
@@ -9193,8 +9206,8 @@ if(typeof dojo != "undefined"){
// We need te detect the right "internal" webkit version to make this work.
var wk = "WebKit/";
var is525 = (
- d.isWebKit &&
- (nua.indexOf(wk) > 0) &&
+ d.isWebKit &&
+ (nua.indexOf(wk) > 0) &&
(parseFloat(nua.split(wk)[1]) > 528)
);
@@ -9205,7 +9218,7 @@ if(typeof dojo != "undefined"){
var qsa = "querySelectorAll";
var qsaAvail = (
- !!getDoc()[qsa] &&
+ !!getDoc()[qsa] &&
// see #5832
(!d.isSafari || (d.isSafari > 3.1) || is525 )
);
@@ -9234,7 +9247,7 @@ if(typeof dojo != "undefined"){
var domCached = _queryFuncCacheDOM[query];
if(domCached){ return domCached; }
- // TODO:
+ // 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.
@@ -9248,11 +9261,11 @@ if(typeof dojo != "undefined"){
forceDOM = true;
}
- var useQSA = (
+ 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) &&
+ (specials.indexOf(qcz) == -1) &&
// IE's QSA impl sucks on pseudos
(!d.isIE || (query.indexOf(":") == -1)) &&
@@ -9265,11 +9278,11 @@ if(typeof dojo != "undefined"){
// 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(":contains") == -1) && (query.indexOf(":checked") == -1) &&
(query.indexOf("|=") == -1) // some browsers don't grok it
);
- // TODO:
+ // 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
@@ -9278,7 +9291,7 @@ if(typeof dojo != "undefined"){
if(useQSA){
- var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ?
+ var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ?
(query + " *") : query;
return _queryFuncCacheQSA[query] = function(root){
try{
@@ -9305,9 +9318,9 @@ if(typeof dojo != "undefined"){
}else{
// DOM branch
var parts = query.split(/\s*,\s*/);
- return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
+ return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
// if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher
- getStepQueryFunc(query) :
+ 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
@@ -9337,7 +9350,7 @@ if(typeof dojo != "undefined"){
}else{
return node.uniqueID;
}
- } :
+ } :
function(node){
return (node._uid || (node._uid = ++_zipIdx));
};
@@ -9346,7 +9359,7 @@ if(typeof dojo != "undefined"){
// 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.
+ // the upside, it gives us a built in unique ID function.
var _isUnique = function(node, bag){
if(!bag){ return 1; }
var id = _nodeUID(node);
@@ -9358,7 +9371,7 @@ if(typeof dojo != "undefined"){
// returning a list of "uniques", hopefully in doucment order
var _zipIdxName = "_zipIdx";
var _zip = function(arr){
- if(arr && arr.nozip){
+ if(arr && arr.nozip){
return (qlc._wrap) ? qlc._wrap(arr) : arr;
}
// var ret = new d._NodeListCtor();
@@ -9377,7 +9390,7 @@ if(typeof dojo != "undefined"){
var szidx = _zipIdx+"";
arr[0].setAttribute(_zipIdxName, szidx);
for(var x = 1, te; te = arr[x]; x++){
- if(arr[x].getAttribute(_zipIdxName) != szidx){
+ if(arr[x].getAttribute(_zipIdxName) != szidx){
ret.push(te);
}
te.setAttribute(_zipIdxName, szidx);
@@ -9385,7 +9398,7 @@ if(typeof dojo != "undefined"){
}else if(d.isIE && arr.commentStrip){
try{
for(var x = 1, te; te = arr[x]; x++){
- if(_isElement(te)){
+ if(_isElement(te)){
ret.push(te);
}
}
@@ -9393,7 +9406,7 @@ if(typeof dojo != "undefined"){
}else{
if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; }
for(var x = 1, te; te = arr[x]; x++){
- if(arr[x][_zipIdxName] != _zipIdx){
+ if(arr[x][_zipIdxName] != _zipIdx){
ret.push(te);
}
te[_zipIdxName] = _zipIdx;
@@ -9423,11 +9436,11 @@ if(typeof dojo != "undefined"){
// * class selectors (e.g., `.foo`)
// * node type selectors like `span`
// * ` ` descendant selectors
- // * `>` child element selectors
+ // * `>` child element selectors
// * `#foo` style ID selectors
// * `*` universal selector
- // * `~`, the immediately preceeded-by sibling selector
- // * `+`, the preceeded-by sibling selector
+ // * `~`, the preceded-by sibling selector
+ // * `+`, the immediately preceded-by sibling selector
// * attribute queries:
// | * `[foo]` attribute presence selector
// | * `[foo='bar']` attribute value exact match
@@ -9448,14 +9461,14 @@ if(typeof dojo != "undefined"){
// 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 resaonable for a programmatic node querying engine to
+ // 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:
@@ -9464,10 +9477,10 @@ if(typeof dojo != "undefined"){
// | * `: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
@@ -9577,12 +9590,12 @@ if(typeof dojo != "undefined"){
// 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") ||
+ caseSensitive = (root.contentType && root.contentType=="application/xml") ||
(d.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) ||
- (!!od) &&
+ (!!od) &&
(d.isIE ? od.xml : (root.xmlVersion||od.xmlVersion));
- // NOTE:
+ // 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.
@@ -9599,16 +9612,98 @@ if(typeof dojo != "undefined"){
// FIXME: need to add infrastructure for post-filtering pseudos, ala :last
d.query.pseudos = pseudos;
- // one-off function for filtering a NodeList based on a simple selector
- d._filterQueryResult = function(nodeList, simpleFilter){
- var tmpNodeList = new d._NodeListCtor();
- var filterFunc = getSimpleFilterFunc(getQueryParts(simpleFilter)[0]);
+ // 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;
}
-})(this["queryPortability"]||this["acme"]||dojo);
+};//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");
+
+
+ defineQuery(this["queryPortability"]||this["acme"]||dojo);
+ }else{
+ defineQuery(this["queryPortability"]||this["acme"]||defineAcme());
+ }
+
+})();
/*
*/
@@ -9623,6 +9718,7 @@ dojo.provide("dojo._base.xhr");
+
(function(){
var _d = dojo, cfg = _d.config;
@@ -9663,7 +9759,7 @@ dojo.provide("dojo._base.xhr");
var type = (item.type||"").toLowerCase();
if(_in && type && !item.disabled){
if(type == "radio" || type == "checkbox"){
- if(item.checked){ ret = item.value }
+ if(item.checked){ ret = item.value; }
}else if(item.multiple){
ret = [];
_d.query("option", item).forEach(function(opt){
@@ -9677,7 +9773,7 @@ dojo.provide("dojo._base.xhr");
}
}
return ret; // Object
- }
+ };
dojo.formToObject = function(/*DOMNode||String*/ formNode){
// summary:
@@ -9704,7 +9800,7 @@ dojo.provide("dojo._base.xhr");
// yields this object structure as the result of a call to
// formToObject():
//
- // | {
+ // | {
// | blah: "blah",
// | multi: [
// | "thud",
@@ -9725,7 +9821,7 @@ dojo.provide("dojo._base.xhr");
}
});
return ret; // Object
- }
+ };
dojo.objectToQuery = function(/*Object*/ map){
// summary:
@@ -9734,7 +9830,7 @@ dojo.provide("dojo._base.xhr");
// example:
// this object:
//
- // | {
+ // | {
// | blah: "blah",
// | multi: [
// | "thud",
@@ -9743,7 +9839,7 @@ dojo.provide("dojo._base.xhr");
// | };
//
// yields the following query string:
- //
+ //
// | "blah=blah&multi=thud&multi=thonk"
// FIXME: need to implement encodeAscii!!
@@ -9764,21 +9860,21 @@ dojo.provide("dojo._base.xhr");
}
}
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:
@@ -9789,7 +9885,7 @@ dojo.provide("dojo._base.xhr");
// This string:
//
// | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
- //
+ //
// results in this object structure:
//
// | {
@@ -9797,7 +9893,7 @@ dojo.provide("dojo._base.xhr");
// | thinger: " spaces =blah",
// | zonk: "blarg"
// | }
- //
+ //
// Note that spaces and other urlencoded entities are correctly
// handled.
@@ -9822,7 +9918,7 @@ dojo.provide("dojo._base.xhr");
}
});
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
@@ -9832,7 +9928,7 @@ dojo.provide("dojo._base.xhr");
// MOW: remove dojo._contentHandlers alias in 2.0
var handlers = _d._contentHandlers = dojo.contentHandlers = {
- // summary:
+ // summary:
// A map of availble XHR transport handle types. Name matches the
// `handleAs` attribute passed to XHR calls.
//
@@ -9840,41 +9936,41 @@ dojo.provide("dojo._base.xhr");
// 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.
- //
+ // 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({
+ // | dojo.xhrGet({
// | url:"foo.txt",
// | handleAs:"makeCaps",
// | 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;
+ 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.
+ "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 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."
@@ -9892,7 +9988,7 @@ dojo.provide("dojo._base.xhr");
}
return _d.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?
@@ -9904,7 +10000,7 @@ dojo.provide("dojo._base.xhr");
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 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{
@@ -9919,7 +10015,7 @@ dojo.provide("dojo._base.xhr");
return result; // DOMDocument
},
"json-comment-optional": function(xhr){
- // summary: A contentHandler which checks the presence of comment-filtered JSON and
+ // 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);
@@ -9951,7 +10047,7 @@ dojo.provide("dojo._base.xhr");
// handleAs: String?
// Acceptable values depend on the type of IO
// transport (see specific IO calls for more information).
- // rawBody: String?
+ // 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
@@ -10096,7 +10192,7 @@ dojo.provide("dojo._base.xhr");
/*Function*/canceller,
/*Function*/okHandler,
/*Function*/errHandler){
- // summary:
+ // summary:
// sets up the Deferred and ioArgs property on the Deferred so it
// can be used in an io call.
// args:
@@ -10112,19 +10208,19 @@ dojo.provide("dojo._base.xhr");
// 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
+ // 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){
+ if(args.form){
var form = _d.byId(args.form);
- //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
+ //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);
+ ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null);
formObject = _d.formToObject(form);
}
@@ -10197,7 +10293,7 @@ dojo.provide("dojo._base.xhr");
// 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.
@@ -10214,13 +10310,13 @@ dojo.provide("dojo._base.xhr");
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.
@@ -10228,7 +10324,7 @@ dojo.provide("dojo._base.xhr");
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.
@@ -10252,7 +10348,7 @@ dojo.provide("dojo._base.xhr");
};
var _watchInFlight = function(){
- //summary:
+ //summary:
// internal method that checks each inflight XMLHttpRequest to see
// if it has completed or if the timeout situation applies.
@@ -10267,7 +10363,7 @@ dojo.provide("dojo._base.xhr");
var dfd = tif.dfd;
var func = function(){
if(!dfd || dfd.canceled || !tif.validCheck(dfd)){
- _inFlight.splice(i--, 1);
+ _inFlight.splice(i--, 1);
_pubCount -= 1;
}else if(tif.ioCheck(dfd)){
_inFlight.splice(i--, 1);
@@ -10305,7 +10401,7 @@ dojo.provide("dojo._base.xhr");
_inFlightIntvl = null;
return;
}
- }
+ };
dojo._ioCancelAll = function(){
//summary: Cancels all pending IO requests, regardless of IO type
@@ -10317,7 +10413,7 @@ dojo.provide("dojo._base.xhr");
}catch(e){/*squelch*/}
});
}catch(e){/*squelch*/}
- }
+ };
//Automatically call cancel all io calls on unload
//in IE for trac issue #2357.
@@ -10340,10 +10436,10 @@ dojo.provide("dojo._base.xhr");
_pubCount += 1;
_d.publish("/dojo/io/send", [dfd]);
}
- }
+ };
_d._ioWatch = function(dfd, validCheck, ioCheck, resHandle){
- // summary:
+ // summary:
// Watches the io request represented by dfd to see if it completes.
// dfd: Deferred
// The Deferred object to watch.
@@ -10373,16 +10469,16 @@ dojo.provide("dojo._base.xhr");
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)){
@@ -10393,7 +10489,7 @@ dojo.provide("dojo._base.xhr");
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.
@@ -10401,8 +10497,8 @@ dojo.provide("dojo._base.xhr");
if(ioArgs.query.length){
ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query;
ioArgs.query = null;
- }
- }
+ }
+ };
/*=====
dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, {
@@ -10503,13 +10599,13 @@ dojo.provide("dojo._base.xhr");
_d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle);
xhr = null;
return dfd; // dojo.Deferred
- }
+ };
dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){
- // summary:
+ // 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:
@@ -10518,7 +10614,7 @@ dojo.provide("dojo._base.xhr");
// 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:
@@ -10527,13 +10623,13 @@ dojo.provide("dojo._base.xhr");
// 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){
@@ -10558,6 +10654,7 @@ dojo.provide("dojo._base.fx");
+
/*
Animation loosely package based on Dan Pupius' work, contributed under CLA:
http://pupius.co.uk/js/Toolkit.Drawing.js
@@ -11225,14 +11322,29 @@ dojo.provide("dojo._base.browser");
+ //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);
+ });
+
+}
+
+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");
+
+
+
+
+
+
+
+
+
-//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);
-});
}
diff --git a/lib/dojo/fx.js b/lib/dojo/fx.js
index 5c70d5b9e..60782accb 100644
--- a/lib/dojo/fx.js
+++ b/lib/dojo/fx.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,7 +8,9 @@
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"); // FIXME: remove this back-compat require in 2.0
+dojo.require("dojo.fx.Toggler");
+
+
/*=====
dojo.fx = {
// summary: Effects library on top of Base animations
@@ -16,7 +18,7 @@ dojo.fx = {
=====*/
(function(){
- var d = dojo,
+ var d = dojo,
_baseObj = {
_fire: function(evt, args){
if(this[evt]){
@@ -135,14 +137,14 @@ dojo.fx = {
d.extend(_chain, _baseObj);
dojo.fx.chain = function(/*dojo.Animation[]*/ animations){
- // summary:
+ // 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,
+ // onEnd of this animation means the end of the chain,
// not the individual animations within)
//
// example:
@@ -170,7 +172,7 @@ dojo.fx = {
this._pseudoAnimation = new d.Animation({curve: [0, 1], duration: this.duration});
var self = this;
- d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"],
+ d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"],
function(evt){
self._connects.push(d.connect(self._pseudoAnimation, evt,
function(){ self._fire(evt, arguments); }
@@ -228,11 +230,11 @@ dojo.fx = {
d.extend(_combine, _baseObj);
dojo.fx.combine = function(/*dojo.Animation[]*/ animations){
- // summary:
+ // summary:
// Combine a list of `dojo.Animation`s to run in parallel
//
// description:
- // Combine an array of `dojo.Animation`s to run in parallel,
+ // Combine an array of `dojo.Animation`s to run in parallel,
// providing a new `dojo.Animation` instance encompasing each
// animation, firing standard animation events.
//
@@ -303,17 +305,17 @@ dojo.fx = {
}
}, args));
- d.connect(anim, "onEnd", function(){
+ 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.
+ // Shrink a node to nothing and hide it.
//
// description:
// Returns an animation that will shrink node defined in "args"
@@ -322,7 +324,7 @@ dojo.fx = {
// 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()
@@ -348,14 +350,14 @@ dojo.fx = {
});
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"
+ // Returns an animation that will slide "node"
// defined in args Object from its current position to
// the position defined by (args.left, args.top).
//
@@ -367,7 +369,7 @@ dojo.fx = {
// example:
// | dojo.fx.slideTo({ node: node, left:"40", top:"50", units:"px" }).play()
- var node = args.node = d.byId(args.node),
+ var node = args.node = d.byId(args.node),
top = null, left = null;
var init = (function(n){
@@ -397,7 +399,7 @@ dojo.fx = {
d.connect(anim, "beforeBegin", anim, init);
return anim; // dojo.Animation
- }
+ };
})();
diff --git a/lib/dojo/fx/Toggler.js b/lib/dojo/fx/Toggler.js
index ddc3e225d..dc4693d8e 100644
--- a/lib/dojo/fx/Toggler.js
+++ b/lib/dojo/fx/Toggler.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo.fx.Toggler"]){ //_hasResource checks added by build.
dojo._hasResource["dojo.fx.Toggler"] = true;
dojo.provide("dojo.fx.Toggler");
+
dojo.declare("dojo.fx.Toggler", null, {
// summary:
// A simple `dojo.Animation` toggler API.
@@ -16,16 +17,16 @@ dojo.declare("dojo.fx.Toggler", null, {
// 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`).
+ // 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,
+ // | showFunc: dojo.fx.wipeIn,
// | // hideFunc will default to "fadeOut"
// | });
// | t.show(100); // delay showing for 100ms
@@ -40,7 +41,7 @@ dojo.declare("dojo.fx.Toggler", null, {
// The function that returns the `dojo.Animation` to show the node
showFunc: dojo.fadeIn,
- // hideFunc: Function
+ // hideFunc: Function
// The function that returns the `dojo.Animation` to hide the node
hideFunc: dojo.fadeOut,
@@ -56,7 +57,7 @@ dojo.declare("dojo.fx.Toggler", null, {
// 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.
+ // each animation individually.
// FIXME: also would be nice to have events from the animations exposed/bridged
/*=====
diff --git a/lib/dojo/fx/easing.js b/lib/dojo/fx/easing.js
index 0ce6efbff..c26af8971 100644
--- a/lib/dojo/fx/easing.js
+++ b/lib/dojo/fx/easing.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,11 +9,13 @@ if(!dojo._hasResource["dojo.fx.easing"]){ //_hasResource checks added by build.
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
+ // summary:
+ // Collection of easing functions to use beyond the default
// `dojo._defaultEasing` function.
- //
+ //
// description:
//
// Easing functions are used to manipulate the iteration through
@@ -21,22 +23,22 @@ dojo.fx.easing = {
// 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.
+ // beginning and end.
//
- // One does not call the easing function directly, it must be passed to
+ // 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',
+ // | node: 'node',
// | duration: 2000,
- // | // note there is no ()
+ // | // note there is no ()
// | easing: dojo.fx.easing.quadIn
// | }).play();
//
@@ -151,24 +153,24 @@ dojo.fx.easing = {
},
backIn: function(/* Decimal? */n){
- // summary:
- // An easing function that starts away from the target,
+ // 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
+ //
+ // 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.
+ // 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.
+ // 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
+ // Use caution when the easing will cause values to become negative as some
// properties cannot be set to negative values.
n = n - 1;
@@ -177,12 +179,12 @@ dojo.fx.easing = {
},
backInOut: function(/* Decimal? */n){
- // summary:
+ // 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
+ // 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;
@@ -192,13 +194,13 @@ dojo.fx.easing = {
},
elasticIn: function(/* Decimal? */n){
- // summary:
+ // 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
+ //
+ // 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;
@@ -208,7 +210,7 @@ dojo.fx.easing = {
},
elasticOut: function(/* Decimal? */n){
- // summary:
+ // summary:
// An easing function that elasticly snaps around the target value,
// near the end of the Animation
//
@@ -216,7 +218,7 @@ dojo.fx.easing = {
// 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
+ // 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;
@@ -225,7 +227,7 @@ dojo.fx.easing = {
},
elasticInOut: function(/* Decimal? */n){
- // summary:
+ // summary:
// An easing function that elasticly snaps around the value, near
// the beginning and end of the Animation.
//
@@ -233,7 +235,7 @@ dojo.fx.easing = {
// 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
+ // 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;
@@ -249,7 +251,7 @@ dojo.fx.easing = {
},
bounceIn: function(/* Decimal? */n){
- // summary:
+ // summary:
// An easing function that 'bounces' near the beginning of an Animation
return (1 - dojo.fx.easing.bounceOut(1 - n)); // Decimal
},
@@ -259,7 +261,7 @@ dojo.fx.easing = {
// An easing function that 'bounces' near the end of an Animation
var s = 7.5625;
var p = 2.75;
- var l;
+ var l;
if(n < (1 / p)){
l = s * Math.pow(n, 2);
}else if(n < (2 / p)){
@@ -276,7 +278,7 @@ dojo.fx.easing = {
},
bounceInOut: function(/* Decimal? */n){
- // summary:
+ // 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
diff --git a/lib/dojo/gears.js b/lib/dojo/gears.js
index aca6c5a4f..d5595b191 100644
--- a/lib/dojo/gears.js
+++ b/lib/dojo/gears.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,8 +9,10 @@ if(!dojo._hasResource["dojo.gears"]){ //_hasResource checks added by build. Do n
dojo._hasResource["dojo.gears"] = true;
dojo.provide("dojo.gears");
+dojo.getObject("gears", true, dojo);
+
dojo.gears._gearsObject = function(){
- // summary:
+ // summary:
// factory method to get a Google Gears plugin instance to
// expose in the browser runtime environment, if present
var factory;
diff --git a/lib/dojo/hash.js b/lib/dojo/hash.js
index 6ef74b521..e7f6a400f 100644
--- a/lib/dojo/hash.js
+++ b/lib/dojo/hash.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,6 +8,8 @@
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.
@@ -27,11 +29,11 @@ dojo.provide("dojo.hash");
// 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:
- // String: the hash is set - #string.
+ // hash:
+ // the hash is set - #string.
// replace:
- // Boolean: If true, updates the hash value in the current history
- // state instead of creating a new history state.
+ // 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.
@@ -50,17 +52,16 @@ dojo.provide("dojo.hash");
location.href = "#" + hash;
}
return hash; // String
- }
+ };
// Global vars
- var _recentHash = null,
- _ieUriMonitor = null,
+ 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) : "";
+ return (i >= 0) ? str.substring(i+1) : "";
}
function _getHash(){
@@ -92,12 +93,12 @@ dojo.provide("dojo.hash");
return;
}
location.replace("#"+hash);
- _pollLocation();
+ !_connect && _pollLocation();
}
function IEUriMonitor(){
// summary:
- // Determine if the browser's URI has changed or if the user has pressed the
+ // Determine if the browser's URI has changed or if the user has pressed the
// back or forward button. If so, call _dispatchEvent.
//
// description:
@@ -147,6 +148,13 @@ dojo.provide("dojo.hash");
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";
@@ -165,7 +173,7 @@ dojo.provide("dojo.hash");
this.isTransitioning = function(){
return transitioning;
- }
+ };
this.pollLocation = function(){
if(!ifrOffline) {
@@ -216,13 +224,13 @@ dojo.provide("dojo.hash");
}
}
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
- dojo.connect(dojo.global,"onhashchange",_dispatchEvent);
+ _connect = dojo.connect(dojo.global,"onhashchange",_dispatchEvent);
}else{
if(document.addEventListener){ // Non-IE
_recentHash = _getHash();
@@ -230,7 +238,7 @@ dojo.provide("dojo.hash");
}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.
}
});
diff --git a/lib/dojo/html.js b/lib/dojo/html.js
index ec5c4986e..f88f899cc 100644
--- a/lib/dojo/html.js
+++ b/lib/dojo/html.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,25 +8,26 @@
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");
-// the parser might be needed..
-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,
+ 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
};
@@ -46,7 +47,7 @@ dojo.require("dojo.parser");
// node:
// the parent element
// content:
- // the content to be set on the parent element.
+ // 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
@@ -72,7 +73,7 @@ dojo.require("dojo.parser");
};
// we wrap up the content-setting operation in a object
- dojo.declare("dojo.html._ContentSetter", null,
+ dojo.declare("dojo.html._ContentSetter", null,
{
// node: DomNode|String
// An node which will be the parent element that we set content into
@@ -83,11 +84,11 @@ dojo.require("dojo.parser");
content: "",
// id: String?
- // Usually only used internally, and auto-generated with each instance
+ // Usually only used internally, and auto-generated with each instance
id: "",
// cleanContent: Boolean
- // Should the content be treated as a full html document,
+ // Should the content be treated as a full html document,
// and the real content stripped of <html>, <body> wrapper before injection
cleanContent: false,
@@ -98,6 +99,17 @@ dojo.require("dojo.parser");
// 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){
@@ -115,14 +127,14 @@ dojo.require("dojo.parser");
if(!this.id){
this.id = [
"Setter",
- (node) ? node.id || node.tagName : "",
+ (node) ? node.id || node.tagName : "",
idCounter++
].join("_");
}
},
set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){
// summary:
- // front-end to the set-content sequence
+ // 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
@@ -142,9 +154,9 @@ dojo.require("dojo.parser");
},
setContent: function(){
// summary:
- // sets the content on the node
+ // sets the content on the node
- var node = this.node;
+ var node = this.node;
if(!node) {
// can't proceed
throw new Error(this.declaredClass + ": setContent given no node");
@@ -156,7 +168,7 @@ dojo.require("dojo.parser");
// 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);
+ var errMess = this.onContentError(e);
try{
node.innerHTML = errMess;
}catch(e){
@@ -172,7 +184,7 @@ dojo.require("dojo.parser");
// cleanly empty out existing content
// destroy any widgets from a previous run
- // NOTE: if you dont want this you'll need to empty
+ // 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) {
@@ -182,17 +194,17 @@ dojo.require("dojo.parser");
});
delete this.parseResults;
}
- // this is fast, but if you know its already empty or safe, you could
+ // 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
+ // 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
+ // This default implementation checks for cleanContent and extractContent flags to
// optionally pre-process html string content
var cont = this.content;
@@ -230,21 +242,21 @@ dojo.require("dojo.parser");
// summary
// manually reset the Setter instance if its being re-used for example for another set()
// description
- // tearDown() is not called automatically.
+ // 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;
+ delete this.parseResults;
+ delete this.node;
+ delete this.content;
},
onContentError: function(err){
- return "Error occured setting content: " + 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
+ // 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;
@@ -252,21 +264,28 @@ dojo.require("dojo.parser");
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];
+ this[key] = params[key];
}
},
_parse: function(){
- // summary:
+ // 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,
- dir: this.dir,
- lang: this.lang
+ noStart: !this.startup,
+ inherited: inherited,
+ scope: this.parserScope
});
}catch(e){
this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id);
@@ -299,29 +318,29 @@ dojo.require("dojo.parser");
// node:
// the parent element that will receive the content
// cont:
- // the content to be set on the parent element.
+ // 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:
+ // 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});
+ // 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{
+ }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 }
+ var op = new dojo.html._ContentSetter(dojo.mixin(
+ params,
+ { content: cont, node: node }
));
return op.set();
}
diff --git a/lib/dojo/i18n.js b/lib/dojo/i18n.js
index d06a8f25e..893490fe0 100644
--- a/lib/dojo/i18n.js
+++ b/lib/dojo/i18n.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,13 +9,16 @@ if(!dojo._hasResource["dojo.i18n"]){ //_hasResource checks added by build. Do no
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)
};
=====*/
-dojo.i18n.getLocalization = function(/*String*/packageName, /*String*/bundleName, /*String?*/locale){
+// 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.
@@ -43,7 +46,7 @@ dojo.i18n.getLocalization = function(/*String*/packageName, /*String*/bundleName
// look for nearest locale match
var elements = locale.split('-');
var module = [packageName,"nls",bundleName].join('.');
- var bundle = dojo._loadedModules[module];
+ var bundle = dojo._loadedModules[module];
if(bundle){
var localization;
for(var i = elements.length; i > 0; i--){
@@ -93,7 +96,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
var targetLocale = dojo.i18n.normalizeLocale(locale);
var bundlePackage = [moduleName, "nls", bundleName].join(".");
- // NOTE:
+ // 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.
@@ -103,7 +106,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
// 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){
@@ -120,7 +123,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
}
if(!bestLocale){
bestLocale = "ROOT";
- }
+ }
}
//See if the desired locale is already loaded.
@@ -152,6 +155,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
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;
@@ -166,7 +170,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
}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.
@@ -184,8 +188,8 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
(function(){
// If other locales are used, dojo.requireLocalization should load them as
- // well, by default.
- //
+ // 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.
diff --git a/lib/dojo/io/iframe.js b/lib/dojo/io/iframe.js
index 5b2af45a1..aa8ddf290 100644
--- a/lib/dojo/io/iframe.js
+++ b/lib/dojo/io/iframe.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.io.iframe"]){ //_hasResource checks added by build.
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(){
@@ -49,7 +51,7 @@ dojo.declare("dojo.io.iframe.__ioArgs", dojo.__IoArgs, {
=====*/
dojo.io.iframe = {
- // summary:
+ // summary:
// Sends an Ajax I/O call using and Iframe (for instance, to upload files)
create: function(/*String*/fname, /*String*/onloadstr, /*String?*/uri){
@@ -79,30 +81,12 @@ dojo.io.iframe = {
}
turi = (dojo.config["dojoBlankHtmlUrl"]||dojo.moduleUrl("dojo", "resources/blank.html"));
}
- var ifrstr = dojo.isIE ? '<iframe name="'+fname+'" src="'+turi+'" onload="'+onloadstr+'">' : 'iframe';
- cframe = dojo.doc.createElement(ifrstr);
- with(cframe){
- name = fname;
- setAttribute("name", fname);
- id = fname;
- }
- dojo.body().appendChild(cframe);
- window[fname] = cframe;
-
- with(cframe.style){
- if(!(dojo.isSafari < 3)){
- //We can't change the src in Safari 2.0.3 if absolute position. Bizarro.
- position = "absolute";
- }
- left = top = "1px";
- height = width = "1px";
- visibility = "hidden";
- }
+ 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());
- if(!dojo.isIE){
- this.setSrc(cframe, turi, true);
- cframe.onload = new Function(onloadstr);
- }
+ window[fname] = cframe;
return cframe;
},
@@ -122,11 +106,8 @@ dojo.io.iframe = {
}else{
// Fun with DOM 0 incompatibilities!
var idoc;
- //WebKit > 521 corresponds with Safari 3, which started with 522 WebKit version.
- if(dojo.isIE || dojo.isWebKit > 521){
+ if(dojo.isIE || dojo.isWebKit){
idoc = iframe.contentWindow.document;
- }else if(dojo.isSafari){
- idoc = iframe.document;
}else{ // if(d.isMozilla){
idoc = iframe.contentWindow;
}
@@ -142,8 +123,8 @@ dojo.io.iframe = {
idoc.location.replace(src);
}
}
- }catch(e){
- console.log("dojo.io.iframe.setSrc: ", e);
+ }catch(e){
+ console.log("dojo.io.iframe.setSrc: ", e);
}
},
@@ -152,7 +133,7 @@ dojo.io.iframe = {
var doc = iframeNode.contentDocument || // W3
(
(
- (iframeNode.name) && (iframeNode.document) &&
+ (iframeNode.name) && (iframeNode.document) &&
(dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow) &&
(dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow.document)
)
@@ -165,7 +146,7 @@ dojo.io.iframe = {
},
send: function(/*dojo.io.iframe.__ioArgs*/args){
- //summary:
+ //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.
@@ -195,8 +176,8 @@ dojo.io.iframe = {
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 IE. Refs #6334.
- if(dojo.isIE){
+ // 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, "><");
@@ -218,7 +199,7 @@ dojo.io.iframe = {
}catch(e){
value = e;
}finally{
- ioArgs._callNext();
+ ioArgs._callNext();
}
return value;
},
@@ -238,7 +219,7 @@ dojo.io.iframe = {
dojo.io.iframe._currentDfd = null;
dojo.io.iframe._fireNextRequest();
}
- }
+ };
this._dfdQueue.push(dfd);
this._fireNextRequest();
@@ -297,16 +278,7 @@ dojo.io.iframe = {
// if we have things in content, we need to add them to the form
// before submission
var pHandler = function(name, value) {
- var tn;
- if(dojo.isIE){
- tn = dojo.doc.createElement("<input type='hidden' name='"+name+"'>");
- }else{
- tn = dojo.doc.createElement("input");
- tn.type = "hidden";
- tn.name = name;
- }
- tn.value = value;
- fn.appendChild(tn);
+ dojo.create("input", {type: "hidden", name: name, value: value}, fn);
ioArgs._contentToClean.push(name);
};
for(var x in content){
@@ -325,7 +297,7 @@ dojo.io.iframe = {
}
}
}
- //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
+ //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");
@@ -406,6 +378,6 @@ dojo.io.iframe = {
ioArgs._finished = true;
}
-}
+};
}
diff --git a/lib/dojo/io/script.js b/lib/dojo/io/script.js
index 9730c977d..a44e9f2ee 100644
--- a/lib/dojo/io/script.js
+++ b/lib/dojo/io/script.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.io.script"]){ //_hasResource checks added by build.
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(){
@@ -24,13 +26,13 @@ dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, {
// 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
+ // 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:
+ // A string of JavaScript that when evaluated like so:
// "typeof(" + checkString + ") != 'undefined'"
- // being true means that the script fetched has been loaded.
+ // 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
@@ -43,7 +45,7 @@ dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, {
}
});
=====*/
-;(function(){
+(function(){
var loadEvent = dojo.isIE ? "onreadystatechange" : "load",
readyRegExp = /complete|loaded/;
@@ -105,7 +107,7 @@ dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, {
},
_makeScriptDeferred: function(/*Object*/args){
- //summary:
+ //summary:
// sets up a Deferred object for an IO request.
var dfd = dojo._ioSetArgs(args, this._deferredCancel, this._deferredOk, this._deferredError);
@@ -152,7 +154,7 @@ dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, {
//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.
+ //Add script to list of things that can be removed.
if(ioArgs.canDelete){
dojo.io.script._addDeadScript(ioArgs);
}
@@ -247,14 +249,14 @@ dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, {
},
_jsonpCallback: function(/*JSON Object*/json){
- //summary:
+ //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;
}
- }
+ };
})();
}
diff --git a/lib/dojo/jaxer.js b/lib/dojo/jaxer.js
index fdc492f1c..2ac115e18 100644
--- a/lib/dojo/jaxer.js
+++ b/lib/dojo/jaxer.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo.jaxer"]){ //_hasResource checks added by build. Do n
dojo._hasResource["dojo.jaxer"] = true;
dojo.provide("dojo.jaxer");
+
if(typeof print == "function"){
console.debug = Jaxer.Log.debug;
console.warn = Jaxer.Log.warn;
diff --git a/lib/dojo/lib/backCompat.js b/lib/dojo/lib/backCompat.js
new file mode 100644
index 000000000..101f4e520
--- /dev/null
+++ b/lib/dojo/lib/backCompat.js
@@ -0,0 +1,283 @@
+/*
+ Copyright (c) 2004-2011, The 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
new file mode 100644
index 000000000..94a3fefae
--- /dev/null
+++ b/lib/dojo/lib/kernel.js
@@ -0,0 +1,26 @@
+/*
+ Copyright (c) 2004-2011, The 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
new file mode 100644
index 000000000..cb5cc2a43
--- /dev/null
+++ b/lib/dojo/lib/main-browser.js
@@ -0,0 +1,61 @@
+/*
+ Copyright (c) 2004-2011, The 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
new file mode 100644
index 000000000..93a57f76b
--- /dev/null
+++ b/lib/dojo/lib/plugins/i18n.js
@@ -0,0 +1,94 @@
+/*
+ Copyright (c) 2004-2011, The 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
new file mode 100644
index 000000000..75894a32a
--- /dev/null
+++ b/lib/dojo/lib/plugins/text.js
@@ -0,0 +1,70 @@
+/*
+ Copyright (c) 2004-2011, The 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/nls/fi/colors.js b/lib/dojo/nls/fi/colors.js
index 454e644e4..17cdf1684 100644
--- a/lib/dojo/nls/fi/colors.js
+++ b/lib/dojo/nls/fi/colors.js
@@ -1 +1 @@
-({"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
+({"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
diff --git a/lib/dojo/nls/kk/colors.js b/lib/dojo/nls/kk/colors.js
new file mode 100644
index 000000000..19b90679d
--- /dev/null
+++ b/lib/dojo/nls/kk/colors.js
@@ -0,0 +1 @@
+({"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
diff --git a/lib/dojo/nls/pl/colors.js b/lib/dojo/nls/pl/colors.js
index 852268c42..2fa71bd1b 100644
--- a/lib/dojo/nls/pl/colors.js
+++ b/lib/dojo/nls/pl/colors.js
@@ -1 +1 @@
-({"lightsteelblue":"jasny stalowoniebieski","orangered":"pomarańczowoczerwony","midnightblue":"ciemnogranatowy","cadetblue":"niebieskoszary","seashell":"muszla","slategrey":"łupkowy szary","coral":"koralowy","darkturquoise":"ciemnoturkusowy","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":"przytłumiony szary","orange":"pomarańczowy","white":"biały","navajowhite":"piaskowy","royalblue":"błękit królewski","deeppink":"głęboki różowy","lime":"limetkowy","oldlace":"bladopomarańczowy","chartreuse":"jaskrawozielony","darkcyan":"ciemny cyjan","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"kawowy","darkviolet":"ciemnofioletowy","lightslategrey":"jasny łupkowy szary","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"wodny","sienna":"siena","mintcream":"jasnomiętowy","rosybrown":"różowobrązowy","mediumslateblue":"średni łupkowy niebieski","magenta":"magenta","lightseagreen":"jasna morska zieleń","cyan":"cyjan","olivedrab":"oliwkowa zieleń","darkgoldenrod":"ciemnogliniany","slateblue":"łupkowy niebieski","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia morska zieleń","maroon":"bordowy","darkslategray":"ciemny łupkowy szary","mediumturquoise":"średni turkusowy","ghostwhite":"bladobiały","darkblue":"ciemnoniebieski","mediumvioletred":"średni fioletowoczerwony","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":"cyrankowy","floralwhite":"kwiatowa biel","cornflowerblue":"chabrowy","paleturquoise":"bladoturkusowy","purple":"purpurowy","gainsboro":"bladoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"melon","darkseagreen":"ciemna morska zieleń","lightcoral":"jasnokoralowy","palevioletred":"blady fioletowoczerwony","mediumpurple":"średnia purpura","saddlebrown":"skórzany brązowy","darkmagenta":"ciemna magenta","thistle":"bladofioletowy","whitesmoke":"przydymiony biały","wheat":"pszeniczny","violet":"fioletowy","lightskyblue":"jasny błękit nieba","goldenrod":"gliniany","mediumblue":"średni niebieski","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny łupkowy szary","peru":"jasnobrązowy","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasnogliniana żółć","blanchedalmond":"migdałowy","aliceblue":"bladoniebieski","bisque":"biszkoptowy","slategray":"łupkowy szary","palegoldenrod":"bladogliniany","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"kolor drewna","dodgerblue":"błękit Dodgers","darkgray":"ciemnoszary","lightcyan":"jasny cyjan","powderblue":"pudrowy niebieski","blueviolet":"niebieskofioletowy","orchid":"orchidea","dimgray":"przytłumiony szary","beige":"beżowy","fuchsia":"fuksja","lavenderblush":"lawendoworóżowy","hotpink":"intensywny różowy","steelblue":"stalowy niebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"limetkowozielony","indianred":"kasztanowy","papayawhip":"papaja","lightslategray":"jasny łupkowy szary","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"kukurydziany","black":"czarny","seagreen":"morska zieleń","darkslateblue":"ciemny łupkowy niebieski","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazur","peachpuff":"brzoskwiniowy","darkolivegreen":"ciemnooliwkowy","yellowgreen":"żółtozielony"}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/nls/pt-pt/colors.js b/lib/dojo/nls/pt-pt/colors.js
index e01afd2c1..5038b537e 100644
--- a/lib/dojo/nls/pt-pt/colors.js
+++ b/lib/dojo/nls/pt-pt/colors.js
@@ -1 +1 @@
-({"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 escuro","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 escuro","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
+({"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
diff --git a/lib/dojo/nls/pt/colors.js b/lib/dojo/nls/pt/colors.js
index 897efc3c1..0695a0ff6 100644
--- a/lib/dojo/nls/pt/colors.js
+++ b/lib/dojo/nls/pt/colors.js
@@ -1 +1 @@
-({"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":"marrom","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
+({"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
diff --git a/lib/dojo/nls/sl/colors.js b/lib/dojo/nls/sl/colors.js
index e009ce9f7..15d3ac7ba 100644
--- a/lib/dojo/nls/sl/colors.js
+++ b/lib/dojo/nls/sl/colors.js
@@ -1 +1 @@
-({"lightsteelblue":"svetlo jeklena modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"zelenkasto modra","seashell":"morska školjka","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":"umazano siva","orange":"oranžna","white":"bela","navajowhite":"navajsko bela","royalblue":"kraljevsko modra","deeppink":"temno roza","lime":"rumeno zelena","oldlace":"stara čipka","chartreuse":"svetlo rumena zelena","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travnato zelena","lightyellow":"svetlo rumena","tan":"kožno rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno rumenkasto rjava","green":"zelena","deepskyblue":"temno nebesno modra","aqua":"akva","sienna":"siena","mintcream":"mentolno smetanasta","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"olivno sivo rjava","darkgoldenrod":"temno zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednje akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"prosojno bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično-rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"roza","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejna","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarsko modra","lemonchiffon":"limonina","teal":"zeleno modra","floralwhite":"cvetno bela","cornflowerblue":"plavično modra","paleturquoise":"bledo turkizna","purple":"škrlatna","gainsboro":"pepelnato siva","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":"temno magenta","thistle":"osatna","whitesmoke":"umazano bela","wheat":"žitna","violet":"vijolična","lightskyblue":"svetlo nebesno modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebesno 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":"mandljeva","aliceblue":"alice modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"grčav les","dodgerblue":"koruzno modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"smodniško modra","blueviolet":"modro vijolična","orchid":"orhidejna","dimgray":"umazano siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"bleščeča sivka","hotpink":"živo roza","steelblue":"jekleno modra","tomato":"paradižnikova","lightpink":"svetlo roza","limegreen":"citronsko zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejna","cornsilk":"koruzni laski","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"rumenkasto rjava","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurna","peachpuff":"breskova","darkolivegreen":"temno olivno zelena","yellowgreen":"rumeno zelena"}) \ No newline at end of file
+({"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
diff --git a/lib/dojo/nls/tt-rss-layer_ROOT.js b/lib/dojo/nls/tt-rss-layer_ROOT.js
index 1b351daf4..5cd71420f 100644
--- a/lib/dojo/nls/tt-rss-layer_ROOT.js
+++ b/lib/dojo/nls/tt-rss-layer_ROOT.js
@@ -1 +1 @@
-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:]","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"};
+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"};
diff --git a/lib/dojo/nls/tt-rss-layer_ar.js b/lib/dojo/nls/tt-rss-layer_ar.js
index 6a19c6d6a..464e31646 100644
--- a/lib/dojo/nls/tt-rss-layer_ar.js
+++ b/lib/dojo/nls/tt-rss-layer_ar.js
@@ -1 +1 @@
-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":"∞","patternDigit":"#","minusSign":"-","decimal":"٫","nan":"ليس رقم","nativeZeroDigit":"٠","perMille":"؉","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_ca.js b/lib/dojo/nls/tt-rss-layer_ca.js
index 0f56ef882..4cc759041 100644
--- a/lib/dojo/nls/tt-rss-layer_ca.js
+++ b/lib/dojo/nls/tt-rss-layer_ca.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_cs.js b/lib/dojo/nls/tt-rss-layer_cs.js
index 93ed7c8f1..8c008a467 100644
--- a/lib/dojo/nls/tt-rss-layer_cs.js
+++ b/lib/dojo/nls/tt-rss-layer_cs.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_da.js b/lib/dojo/nls/tt-rss-layer_da.js
index 7f8be8c68..365eb98da 100644
--- a/lib/dojo/nls/tt-rss-layer_da.js
+++ b/lib/dojo/nls/tt-rss-layer_da.js
@@ -1 +1 @@
-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 ugyldig.","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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_de-de.js b/lib/dojo/nls/tt-rss-layer_de-de.js
index e5bb92237..f43af10d1 100644
--- a/lib/dojo/nls/tt-rss-layer_de-de.js
+++ b/lib/dojo/nls/tt-rss-layer_de-de.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_de.js b/lib/dojo/nls/tt-rss-layer_de.js
index 5500fc19b..9d0939e4a 100644
--- a/lib/dojo/nls/tt-rss-layer_de.js
+++ b/lib/dojo/nls/tt-rss-layer_de.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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 0a4594e3c..379759746 100644
--- a/lib/dojo/nls/tt-rss-layer_el.js
+++ b/lib/dojo/nls/tt-rss-layer_el.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","decimalFormat":"#,##0.###","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_en-gb.js b/lib/dojo/nls/tt-rss-layer_en-gb.js
index 382f40413..729bd63b5 100644
--- a/lib/dojo/nls/tt-rss-layer_en-gb.js
+++ b/lib/dojo/nls/tt-rss-layer_en-gb.js
@@ -1 +1 @@
-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":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_en-us.js b/lib/dojo/nls/tt-rss-layer_en-us.js
index af4f269ee..d8be077fe 100644
--- a/lib/dojo/nls/tt-rss-layer_en-us.js
+++ b/lib/dojo/nls/tt-rss-layer_en-us.js
@@ -1 +1 @@
-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":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_en.js b/lib/dojo/nls/tt-rss-layer_en.js
index b1eac5b9d..2cb4b5732 100644
--- a/lib/dojo/nls/tt-rss-layer_en.js
+++ b/lib/dojo/nls/tt-rss-layer_en.js
@@ -1 +1 @@
-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":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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 971c82e96..832d1fbba 100644
--- a/lib/dojo/nls/tt-rss-layer_es-es.js
+++ b/lib/dojo/nls/tt-rss-layer_es-es.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_es.js b/lib/dojo/nls/tt-rss-layer_es.js
index d9c37c058..daec5d53d 100644
--- a/lib/dojo/nls/tt-rss-layer_es.js
+++ b/lib/dojo/nls/tt-rss-layer_es.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "};
+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 0a78dd3c9..29f0b1a40 100644
--- a/lib/dojo/nls/tt-rss-layer_fi-fi.js
+++ b/lib/dojo/nls/tt-rss-layer_fi-fi.js
@@ -1 +1 @@
-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":"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.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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_fi.js b/lib/dojo/nls/tt-rss-layer_fi.js
index 3932b9873..86fc0bcb7 100644
--- a/lib/dojo/nls/tt-rss-layer_fi.js
+++ b/lib/dojo/nls/tt-rss-layer_fi.js
@@ -1 +1 @@
-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":"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.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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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 e46a35a24..1fba0709c 100644
--- a/lib/dojo/nls/tt-rss-layer_fr-fr.js
+++ b/lib/dojo/nls/tt-rss-layer_fr-fr.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_fr.js b/lib/dojo/nls/tt-rss-layer_fr.js
index 8595a42d0..7d5f281e2 100644
--- a/lib/dojo/nls/tt-rss-layer_fr.js
+++ b/lib/dojo/nls/tt-rss-layer_fr.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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 59bc21f1f..bc4572cc2 100644
--- a/lib/dojo/nls/tt-rss-layer_he-il.js
+++ b/lib/dojo/nls/tt-rss-layer_he-il.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_he.js b/lib/dojo/nls/tt-rss-layer_he.js
index a30b4434c..3efc22fc5 100644
--- a/lib/dojo/nls/tt-rss-layer_he.js
+++ b/lib/dojo/nls/tt-rss-layer_he.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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 3e7728585..2567d6834 100644
--- a/lib/dojo/nls/tt-rss-layer_hu.js
+++ b/lib/dojo/nls/tt-rss-layer_hu.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_it-it.js b/lib/dojo/nls/tt-rss-layer_it-it.js
index ad0d6549c..d2df8f60a 100644
--- a/lib/dojo/nls/tt-rss-layer_it-it.js
+++ b/lib/dojo/nls/tt-rss-layer_it-it.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+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"};
diff --git a/lib/dojo/nls/tt-rss-layer_it.js b/lib/dojo/nls/tt-rss-layer_it.js
index 640baacbc..e34368d15 100644
--- a/lib/dojo/nls/tt-rss-layer_it.js
+++ b/lib/dojo/nls/tt-rss-layer_it.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+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 84aa8786b..016cf5d5c 100644
--- a/lib/dojo/nls/tt-rss-layer_ja-jp.js
+++ b/lib/dojo/nls/tt-rss-layer_ja-jp.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+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"};
diff --git a/lib/dojo/nls/tt-rss-layer_ja.js b/lib/dojo/nls/tt-rss-layer_ja.js
index d71241d29..13da053da 100644
--- a/lib/dojo/nls/tt-rss-layer_ja.js
+++ b/lib/dojo/nls/tt-rss-layer_ja.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+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 a79a5e02d..36e6ab5bf 100644
--- a/lib/dojo/nls/tt-rss-layer_ko-kr.js
+++ b/lib/dojo/nls/tt-rss-layer_ko-kr.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_ko.js b/lib/dojo/nls/tt-rss-layer_ko.js
index da86270d5..a919765c0 100644
--- a/lib/dojo/nls/tt-rss-layer_ko.js
+++ b/lib/dojo/nls/tt-rss-layer_ko.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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 c6ca50890..d4c87d203 100644
--- a/lib/dojo/nls/tt-rss-layer_nb.js
+++ b/lib/dojo/nls/tt-rss-layer_nb.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_nl-nl.js b/lib/dojo/nls/tt-rss-layer_nl-nl.js
index bbafa6a2f..6b5f10a11 100644
--- a/lib/dojo/nls/tt-rss-layer_nl-nl.js
+++ b/lib/dojo/nls/tt-rss-layer_nl-nl.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_nl.js b/lib/dojo/nls/tt-rss-layer_nl.js
index 4ba9f5ee4..78bfcfca6 100644
--- a/lib/dojo/nls/tt-rss-layer_nl.js
+++ b/lib/dojo/nls/tt-rss-layer_nl.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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 d69dca84c..dd78bb0fb 100644
--- a/lib/dojo/nls/tt-rss-layer_pl.js
+++ b/lib/dojo/nls/tt-rss-layer_pl.js
@@ -1 +1 @@
-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":"jasny stalowoniebieski","orangered":"pomarańczowoczerwony","midnightblue":"ciemnogranatowy","cadetblue":"niebieskoszary","seashell":"muszla","slategrey":"łupkowy szary","coral":"koralowy","darkturquoise":"ciemnoturkusowy","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":"przytłumiony szary","orange":"pomarańczowy","white":"biały","navajowhite":"piaskowy","royalblue":"błękit królewski","deeppink":"głęboki różowy","lime":"limetkowy","oldlace":"bladopomarańczowy","chartreuse":"jaskrawozielony","darkcyan":"ciemny cyjan","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"kawowy","darkviolet":"ciemnofioletowy","lightslategrey":"jasny łupkowy szary","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"wodny","sienna":"siena","mintcream":"jasnomiętowy","rosybrown":"różowobrązowy","mediumslateblue":"średni łupkowy niebieski","magenta":"magenta","lightseagreen":"jasna morska zieleń","cyan":"cyjan","olivedrab":"oliwkowa zieleń","darkgoldenrod":"ciemnogliniany","slateblue":"łupkowy niebieski","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia morska zieleń","maroon":"bordowy","darkslategray":"ciemny łupkowy szary","mediumturquoise":"średni turkusowy","ghostwhite":"bladobiały","darkblue":"ciemnoniebieski","mediumvioletred":"średni fioletowoczerwony","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":"cyrankowy","floralwhite":"kwiatowa biel","cornflowerblue":"chabrowy","paleturquoise":"bladoturkusowy","purple":"purpurowy","gainsboro":"bladoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"melon","darkseagreen":"ciemna morska zieleń","lightcoral":"jasnokoralowy","palevioletred":"blady fioletowoczerwony","mediumpurple":"średnia purpura","saddlebrown":"skórzany brązowy","darkmagenta":"ciemna magenta","thistle":"bladofioletowy","whitesmoke":"przydymiony biały","wheat":"pszeniczny","violet":"fioletowy","lightskyblue":"jasny błękit nieba","goldenrod":"gliniany","mediumblue":"średni niebieski","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny łupkowy szary","peru":"jasnobrązowy","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasnogliniana żółć","blanchedalmond":"migdałowy","aliceblue":"bladoniebieski","bisque":"biszkoptowy","slategray":"łupkowy szary","palegoldenrod":"bladogliniany","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"kolor drewna","dodgerblue":"błękit Dodgers","darkgray":"ciemnoszary","lightcyan":"jasny cyjan","powderblue":"pudrowy niebieski","blueviolet":"niebieskofioletowy","orchid":"orchidea","dimgray":"przytłumiony szary","beige":"beżowy","fuchsia":"fuksja","lavenderblush":"lawendoworóżowy","hotpink":"intensywny różowy","steelblue":"stalowy niebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"limetkowozielony","indianred":"kasztanowy","papayawhip":"papaja","lightslategray":"jasny łupkowy szary","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"kukurydziany","black":"czarny","seagreen":"morska zieleń","darkslateblue":"ciemny łupkowy niebieski","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazur","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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_pt-br.js b/lib/dojo/nls/tt-rss-layer_pt-br.js
index a35c5bb52..c78390e9b 100644
--- a/lib/dojo/nls/tt-rss-layer_pt-br.js
+++ b/lib/dojo/nls/tt-rss-layer_pt-br.js
@@ -1 +1 @@
-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":"marrom","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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_pt-pt.js b/lib/dojo/nls/tt-rss-layer_pt-pt.js
index a54df6dbf..7e805cd00 100644
--- a/lib/dojo/nls/tt-rss-layer_pt-pt.js
+++ b/lib/dojo/nls/tt-rss-layer_pt-pt.js
@@ -1 +1 @@
-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 escuro","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 escuro","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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_pt.js b/lib/dojo/nls/tt-rss-layer_pt.js
index 2e2d70bbb..8cc90f5cc 100644
--- a/lib/dojo/nls/tt-rss-layer_pt.js
+++ b/lib/dojo/nls/tt-rss-layer_pt.js
@@ -1 +1 @@
-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":"marrom","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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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 19e4d548b..293429a4a 100644
--- a/lib/dojo/nls/tt-rss-layer_ru.js
+++ b/lib/dojo/nls/tt-rss-layer_ru.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_sk.js b/lib/dojo/nls/tt-rss-layer_sk.js
index 7b3b6d1a5..273f62030 100644
--- a/lib/dojo/nls/tt-rss-layer_sk.js
+++ b/lib/dojo/nls/tt-rss-layer_sk.js
@@ -1 +1 @@
-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:]","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"};
+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"};
diff --git a/lib/dojo/nls/tt-rss-layer_sl.js b/lib/dojo/nls/tt-rss-layer_sl.js
index f76c70841..b9697650b 100644
--- a/lib/dojo/nls/tt-rss-layer_sl.js
+++ b/lib/dojo/nls/tt-rss-layer_sl.js
@@ -1 +1 @@
-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 jeklena modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"zelenkasto modra","seashell":"morska školjka","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":"umazano siva","orange":"oranžna","white":"bela","navajowhite":"navajsko bela","royalblue":"kraljevsko modra","deeppink":"temno roza","lime":"rumeno zelena","oldlace":"stara čipka","chartreuse":"svetlo rumena zelena","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travnato zelena","lightyellow":"svetlo rumena","tan":"kožno rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno rumenkasto rjava","green":"zelena","deepskyblue":"temno nebesno modra","aqua":"akva","sienna":"siena","mintcream":"mentolno smetanasta","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"olivno sivo rjava","darkgoldenrod":"temno zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednje akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"prosojno bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično-rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"roza","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejna","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarsko modra","lemonchiffon":"limonina","teal":"zeleno modra","floralwhite":"cvetno bela","cornflowerblue":"plavično modra","paleturquoise":"bledo turkizna","purple":"škrlatna","gainsboro":"pepelnato siva","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":"temno magenta","thistle":"osatna","whitesmoke":"umazano bela","wheat":"žitna","violet":"vijolična","lightskyblue":"svetlo nebesno modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebesno 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":"mandljeva","aliceblue":"alice modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"grčav les","dodgerblue":"koruzno modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"smodniško modra","blueviolet":"modro vijolična","orchid":"orhidejna","dimgray":"umazano siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"bleščeča sivka","hotpink":"živo roza","steelblue":"jekleno modra","tomato":"paradižnikova","lightpink":"svetlo roza","limegreen":"citronsko zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejna","cornsilk":"koruzni laski","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"rumenkasto rjava","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurna","peachpuff":"breskova","darkolivegreen":"temno 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 zunaj obsega. ","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 možnosti","nextMessage":"Dodatne možnosti"};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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_sv.js b/lib/dojo/nls/tt-rss-layer_sv.js
index b8ea0caf6..d52287cf1 100644
--- a/lib/dojo/nls/tt-rss-layer_sv.js
+++ b/lib/dojo/nls/tt-rss-layer_sv.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_th.js b/lib/dojo/nls/tt-rss-layer_th.js
index 0189c3fb9..95820b7bb 100644
--- a/lib/dojo/nls/tt-rss-layer_th.js
+++ b/lib/dojo/nls/tt-rss-layer_th.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_tr.js b/lib/dojo/nls/tt-rss-layer_tr.js
index 73e5d8126..163130bf4 100644
--- a/lib/dojo/nls/tt-rss-layer_tr.js
+++ b/lib/dojo/nls/tt-rss-layer_tr.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+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":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_xx.js b/lib/dojo/nls/tt-rss-layer_xx.js
index c54e6ea35..a4f0b8535 100644
--- a/lib/dojo/nls/tt-rss-layer_xx.js
+++ b/lib/dojo/nls/tt-rss-layer_xx.js
@@ -1 +1 @@
-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:]","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"};
+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 05243b8ac..e16eeb4be 100644
--- a/lib/dojo/nls/tt-rss-layer_zh-cn.js
+++ b/lib/dojo/nls/tt-rss-layer_zh-cn.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+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"};
diff --git a/lib/dojo/nls/tt-rss-layer_zh-tw.js b/lib/dojo/nls/tt-rss-layer_zh-tw.js
index 4925db23c..9ac816dd9 100644
--- a/lib/dojo/nls/tt-rss-layer_zh-tw.js
+++ b/lib/dojo/nls/tt-rss-layer_zh-tw.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+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"};
diff --git a/lib/dojo/nls/tt-rss-layer_zh.js b/lib/dojo/nls/tt-rss-layer_zh.js
index ed7ddffdf..0b391dbbb 100644
--- a/lib/dojo/nls/tt-rss-layer_zh.js
+++ b/lib/dojo/nls/tt-rss-layer_zh.js
@@ -1 +1 @@
-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:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+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/colors.js b/lib/dojo/nls/zh/colors.js
index 35368f394..0ffb2d8f9 100644
--- a/lib/dojo/nls/zh/colors.js
+++ b/lib/dojo/nls/zh/colors.js
@@ -1 +1 @@
-({"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
+({"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
diff --git a/lib/dojo/number.js b/lib/dojo/number.js
index 33aa6dd52..30fcb6142 100644
--- a/lib/dojo/number.js
+++ b/lib/dojo/number.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,12 +8,12 @@
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,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh");
+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 = {
@@ -118,7 +118,7 @@ dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.
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:
@@ -144,7 +144,7 @@ dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/incr
// 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
@@ -157,7 +157,7 @@ if((0.9).toFixed() == 0){
d = 0;
}
return round(v, p, m) + (v > 0 ? d : -d);
- }
+ };
})();
}
@@ -180,7 +180,7 @@ dojo.number.__FormatAbsoluteOptions = function(){
=====*/
dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
- // summary:
+ // summary:
// Apply numeric pattern to absolute value using options. Gives no
// consideration to local customs.
// value:
@@ -295,7 +295,7 @@ dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
// 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 || {};
@@ -383,7 +383,7 @@ dojo.number._parseInfo = function(/*Object?*/options){
// normalize whitespace and return
return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
-}
+};
/*=====
dojo.number.__ParseOptions = function(){
@@ -494,10 +494,10 @@ dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*
var re = "";
if(q && (flags.places!==0)){
re = "\\" + flags.decimal;
- if(flags.places == Infinity){
- re = "(?:" + re + "\\d+)?";
+ if(flags.places == Infinity){
+ re = "(?:" + re + "\\d+)?";
}else{
- re += "\\d{" + flags.places + "}";
+ re += "\\d{" + flags.places + "}";
}
}
return re;
@@ -506,9 +506,9 @@ dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*
);
var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
- function(q){
+ function(q){
if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
- return "";
+ return "";
}
);
@@ -540,7 +540,7 @@ dojo.number.__IntegerRegexpFlags = function(){
=====*/
dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
- // summary:
+ // summary:
// Builds a regular expression that matches an integer
// assign default values to missing parameters
@@ -579,6 +579,6 @@ dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags
);
return signRE + numberRE; // String
-}
+};
}
diff --git a/lib/dojo/package.json b/lib/dojo/package.json
new file mode 100644
index 000000000..5855be51f
--- /dev/null
+++ b/lib/dojo/package.json
@@ -0,0 +1,21 @@
+{
+ "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
diff --git a/lib/dojo/parser.js b/lib/dojo/parser.js
index 7ae035691..bd52030e0 100644
--- a/lib/dojo/parser.js
+++ b/lib/dojo/parser.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,14 +10,14 @@ 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
+ // summary:
+ // The Dom/Widget parsing package
var d = dojo;
- this._attrName = d._scopeName + "Type";
- this._query = "[" + this._attrName + "]";
function val2type(/*Object*/ value){
// summary:
@@ -42,13 +42,13 @@ dojo.parser = new function(){
case "number":
return value.length ? Number(value) : NaN;
case "boolean":
- // for checked/disabled value might be "" or "checked". interpret as true.
+ // 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
+ // (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));
}
@@ -77,7 +77,7 @@ dojo.parser = new function(){
}
}
- var instanceClasses = {
+ var dummyClass = {}, instanceClasses = {
// map from fully qualified name (like "dijit.Button") to structure like
// { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
};
@@ -85,45 +85,70 @@ dojo.parser = new function(){
// 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).
- dojo.connect(dojo, "extend", function(){
+ // TODO: remove this in 2.0, when we stop caching parameters.
+ d.connect(d, "extend", function(){
instanceClasses = {};
});
- function getClassInfo(/*String*/ className){
+ 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,
+ // {
+ // cls: dijit.Button,
// params: { label: "string", disabled: "boolean"}
// }
- if(!instanceClasses[className]){
+ var c = instanceClasses[className];
+ if(!c){
// get pointer to widget class
- var cls = d.getObject(className);
+ var cls = d.getObject(className), params = null;
if(!cls){ return null; } // class not defined [yet]
-
- var proto = cls.prototype;
-
- // get table of parameter names & types
- var params = {}, dummyClass = {};
- for(var name in proto){
- if(name.charAt(0)=="_"){ continue; } // skip internal properties
- if(name in dummyClass){ continue; } // skip "constructor" and "toString"
- var defVal = proto[name];
- params[name]=val2type(defVal);
+ if(!skipParamsLookup){ // from fastpath, we don't need to lookup the attrs on the proto because they are explicit
+ params = getProtoInfo(cls.prototype, {})
}
-
- instanceClasses[className] = { cls: cls, params: params };
+ 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 instanceClasses[className];
+
+ return c;
}
- this._functionFromScript = function(script){
+ 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("args");
+ 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+"]; ";
@@ -137,7 +162,7 @@ dojo.parser = new function(){
});
}
return new Function(preamble+script.innerHTML+suffix);
- }
+ };
this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){
// summary:
@@ -158,69 +183,106 @@ dojo.parser = new function(){
// exist.
// args: Object?
// An object used to hold kwArgs for instantiation.
- // Supports 'noStart' and inherited.
- var thelist = [], dp = dojo.parser;
+ // 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.s
- var node, type, clsInfo, clazz, scripts;
+ // 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;
- clsInfo = obj.clsInfo || (type && getClassInfo(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
+ // old (backwards compatible) format of nodes[] array, simple array of DOMNodes. no fastpath/data-dojo-type support here.
node = obj;
- type = dp._attrName in mixin ? mixin[dp._attrName] : node.getAttribute(dp._attrName);
+ type = attrName in mixin ? mixin[attrName] : node.getAttribute(attrName);
clsInfo = type && getClassInfo(type);
clazz = clsInfo && clsInfo.cls;
- scripts = (clazz && (clazz._noScript || clazz.prototype._noScript) ? [] :
+ 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
+ // 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 = {},
- attributes = node.attributes;
+ var params = {};
+
if(args.defaults){
// settings for the document itself (or whatever subtree is being parsed)
- dojo.mixin(params, args.defaults);
+ d._mixin(params, args.defaults);
}
if(obj.inherited){
// settings from dir=rtl or lang=... on a node above this node
- dojo.mixin(params, obj.inherited);
+ 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 + "'");
+ }
+ }
- // read parameters (ie, attributes) specified on DOMNode
- // 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?
+ // 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 _type = clsInfo.params[name];
- if(typeof value == "string"){
- params[name] = str2obj(value, _type);
- }else{
- params[name] = value;
+ 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;
+ }
}
}
@@ -235,9 +297,10 @@ dojo.parser = new function(){
d.forEach(scripts, function(script){
node.removeChild(script);
- var event = script.getAttribute("event"),
+ // 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);
+ nf = d.parser._functionFromScript(script, attrData);
if(event){
if(type == "dojo/connect"){
connects.push({event: event, func: nf});
@@ -255,7 +318,8 @@ dojo.parser = new function(){
thelist.push(instance);
// map it to the JS namespace if that makes sense
- var jsname = node.getAttribute("jsId");
+ // 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);
}
@@ -279,9 +343,9 @@ dojo.parser = new function(){
// 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 &&
- instance.startup &&
- !instance._started &&
+ if( !args.noStart && instance &&
+ dojo.isFunction(instance.startup) &&
+ !instance._started &&
(!instance.getParent || !instance.getParent())
){
instance.startup();
@@ -291,34 +355,57 @@ dojo.parser = new function(){
return thelist;
};
- this.parse = function(/*DomNode?*/ rootNode, /* Object? */ args){
+ 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
- // dojoType="qualified.class.name"
+ // 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
+ // object can be passed in this place. If the `args` object has a
// `rootNode` member, that is used.
//
- // args:
+ // args: Object
// a kwArgs object passed along to instantiate()
- //
+ //
// * noStart: Boolean?
// when set will prevent the parser from calling .startup()
- // when locating the nodes.
+ // when locating the nodes.
// * rootNode: DomNode?
// identical to the function's `rootNode` argument, though
- // allowed to be passed in via this `args object.
+ // 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:
@@ -326,10 +413,10 @@ dojo.parser = new function(){
//
// example:
// Parse all classes within the node with id="foo"
- // | dojo.parser.parse(dojo.byId(foo));
+ // | dojo.parser.parse(dojo.byId('foo'));
//
// example:
- // Parse all classes in a page, but do not call .startup() on any
+ // Parse all classes in a page, but do not call .startup() on any
// child
// | dojo.parser.parse({ noStart: true })
//
@@ -337,7 +424,7 @@ dojo.parser = new function(){
// 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 });
+ // | dojo.parser.parse({ noStart:true, rootNode: someNode });
// determine the root node based on the passed arguments.
var root;
@@ -347,8 +434,12 @@ dojo.parser = new function(){
}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-"
- var attrName = this._attrName;
function scan(parent, list){
// summary:
// Parent is an Object representing a DOMNode, with or without a dojoType specified.
@@ -357,7 +448,7 @@ dojo.parser = new function(){
// parent: Object
// Object representing the parent node, like
// | {
- // | node: DomNode, // scan children of this node
+ // | 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
@@ -370,6 +461,7 @@ dojo.parser = new function(){
// 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;
@@ -377,20 +469,31 @@ dojo.parser = new function(){
});
// if parent is a widget, then search for <script type=dojo/*> tags and put them in scripts[].
- var scripts = parent.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;
+ 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){
- var type = recurse && child.getAttribute(attrName);
+ // 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 specified, add to output array of nodes to instantiate
+ // if dojoType/data-dojo-type specified, add to output array of nodes to instantiate
var params = {
"type": type,
- clsInfo: getClassInfo(type), // note: won't find classes declared via dojo.Declaration
+ 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
@@ -403,7 +506,7 @@ dojo.parser = new function(){
}else if(scripts && child.nodeName.toLowerCase() == "script"){
// if <script type="dojo/...">, save in scripts[]
type = child.getAttribute("type");
- if (type && /^dojo\//i.test(type)) {
+ if (type && /^dojo\/\w/i.test(type)) {
scripts.push(child);
}
}else if(recurse){
@@ -417,17 +520,24 @@ dojo.parser = new function(){
}
}
+ // 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 ? dojo.byId(root) : dojo.body(),
- inherited: (args && args.inherited) || {
- dir: dojo._isBodyLtr() ? "ltr" : "rtl"
- }
+ node: root,
+ inherited: inherited
}, list);
// go build the object instances
- return this.instantiate(list, null, args); // Array
+ var mixin = args && args.template ? {template: true} : null;
+ return this.instantiate(list, mixin, args); // Array
};
}();
@@ -435,14 +545,14 @@ dojo.parser = new function(){
//after the a11y test.
(function(){
- var parseRunner = function(){
+ var parseRunner = function(){
if(dojo.config.parseOnLoad){
- dojo.parser.parse();
+ dojo.parser.parse();
}
};
// FIXME: need to clobber cross-dependency!!
- if(dojo.exists("dijit.wai.onload") && (dijit.wai.onload === dojo._loaders[0])){
+ if(dojo.getObject("dijit.wai.onload") === dojo._loaders[0]){
dojo._loaders.splice(1, 0, parseRunner);
}else{
dojo._loaders.unshift(parseRunner);
diff --git a/lib/dojo/regexp.js b/lib/dojo/regexp.js
index 1da68f452..947ecf1d5 100644
--- a/lib/dojo/regexp.js
+++ b/lib/dojo/regexp.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.regexp"]){ //_hasResource checks added by build. Do
dojo._hasResource["dojo.regexp"] = true;
dojo.provide("dojo.regexp");
+dojo.getObject("regexp", true, dojo);
+
/*=====
dojo.regexp = {
// summary: Regular expressions and Builder resources
@@ -27,7 +29,7 @@ dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){
}
return "\\" + ch;
}); // String
-}
+};
dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){
// summary:
@@ -42,7 +44,7 @@ dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boole
// A single value or an array of values.
// re:
// A function. Takes one parameter and converts it to a regular
- // expression.
+ // expression.
// nonCapture:
// If true, uses non-capturing match, otherwise matches are retained
// by regular expression. Defaults to false
@@ -61,15 +63,15 @@ dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boole
// 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.
+ // by regular expression.
return "(" + (nonCapture ? "?:":"") + expression + ")"; // String
-}
+};
}
diff --git a/lib/dojo/resources/_modules.js b/lib/dojo/resources/_modules.js
index ecfd266c4..2afef9a6c 100644
--- a/lib/dojo/resources/_modules.js
+++ b/lib/dojo/resources/_modules.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -36,7 +36,7 @@ dojo.rpc = {
dojo.baseUrl = {
// summary: The root relative path to dojo.js (as a string)
- // example:
+ // example:
// if(typeof dojo != "undefined"){ console.log(dojo.baseUrl); }
};
diff --git a/lib/dojo/robot.js b/lib/dojo/robot.js
index 6cbe0bebc..40bc746ee 100644
--- a/lib/dojo/robot.js
+++ b/lib/dojo/robot.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -8,10 +8,12 @@
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.experimental("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
diff --git a/lib/dojo/robotx.js b/lib/dojo/robotx.js
index 7f49b64a0..3a07c6903 100644
--- a/lib/dojo/robotx.js
+++ b/lib/dojo/robotx.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.robotx"]){ //_hasResource checks added by build. Do
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
@@ -16,18 +18,48 @@ dojo.experimental("dojo.robotx");
// dojo.require this file
(function(){
-// have to wait for test page to load before testing!
-doh.robot._runsemaphore.lock.push("dojo.robotx.lock");
-var iframe = document.getElementById('robotapplication');
+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(){
- //iframe = document.getElementById('robotapplication');
+ // initial load handler: update the document and start the tests
doh.robot._updateDocument();
onIframeLoad = null;
var scrollRoot = (document.compatMode == 'BackCompat')? document.body : document.documentElement;
@@ -35,7 +67,15 @@ var onIframeLoad=function(){
if(consoleHeight){
iframe.style.height = (scrollRoot.clientHeight - consoleHeight)+"px";
}
- doh.run();
+ // 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(){
@@ -66,6 +106,9 @@ if(iframe['attachEvent'] !== undefined){
dojo.connect(iframe, 'onload', iframeLoad);
}
+
+
+
dojo.mixin(doh.robot,{
_updateDocument: function(){
dojo.setContext(iframe.contentWindow, iframe.contentWindow.document);
@@ -84,22 +127,13 @@ dojo.mixin(doh.robot,{
// 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;
- 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=url;
- document.getElementsByTagName("head")[0].appendChild(base);
- });
+ // see above note about race conditions
+ if(robotReady){
+ attachIframe();
+
+ }
},
waitForPageToLoad: function(/*Function*/ submitActions){
@@ -134,7 +168,6 @@ dojo.mixin(doh.robot,{
}
});
-
})();
}
diff --git a/lib/dojo/rpc/JsonService.js b/lib/dojo/rpc/JsonService.js
index 757e328be..064fd0fee 100644
--- a/lib/dojo/rpc/JsonService.js
+++ b/lib/dojo/rpc/JsonService.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -10,6 +10,7 @@ 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",
@@ -45,7 +46,7 @@ dojo.declare("dojo.rpc.JsonService", dojo.rpc.RpcService, {
url: url||this.serviceUrl,
postData: this.createRequest(method, parameters),
contentType: this.contentType,
- timeout: this.timeout,
+ timeout: this.timeout,
handleAs: "json-comment-optional"
});
def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler));
diff --git a/lib/dojo/rpc/JsonpService.js b/lib/dojo/rpc/JsonpService.js
index 31e95077b..ecdadc7fc 100644
--- a/lib/dojo/rpc/JsonpService.js
+++ b/lib/dojo/rpc/JsonpService.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -11,9 +11,10 @@ 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
+ // Generic JSONP service. Minimally extends RpcService to allow
// easy definition of nearly any JSONP style service. Example
// SMD files exist in dojox.data
@@ -25,10 +26,10 @@ dojo.declare("dojo.rpc.JsonpService", dojo.rpc.RpcService, {
dojo.forEach(this.required, function(req){
if(req=="" || req==undefined){
- throw new Error("Required Service Argument not found: "+req);
+ throw new Error("Required Service Argument not found: "+req);
}
});
- }
+ }
},
strictArgChecks: false,
@@ -50,7 +51,7 @@ dojo.declare("dojo.rpc.JsonpService", dojo.rpc.RpcService, {
callbackParamName: this.callbackParamName||"callback",
content: this.createRequest(parameters),
timeout: this.timeout,
- handleAs: "json",
+ handleAs: "json",
preventCache: true
});
def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler));
diff --git a/lib/dojo/rpc/RpcService.js b/lib/dojo/rpc/RpcService.js
index 7ff71415e..5ef5dae7f 100644
--- a/lib/dojo/rpc/RpcService.js
+++ b/lib/dojo/rpc/RpcService.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo.rpc.RpcService"]){ //_hasResource checks added by bu
dojo._hasResource["dojo.rpc.RpcService"] = true;
dojo.provide("dojo.rpc.RpcService");
+
dojo.declare("dojo.rpc.RpcService", null, {
constructor: function(args){
//summary:
@@ -25,7 +26,7 @@ dojo.declare("dojo.rpc.RpcService", null, {
// 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)){
@@ -99,7 +100,7 @@ dojo.declare("dojo.rpc.RpcService", null, {
// deferredRequestHandler: Deferred
// The deferred object handling a request.
- var tf = dojo.hitch(this,
+ var tf = dojo.hitch(this,
function(obj){
if(obj.error!=null){
var err;
@@ -114,7 +115,7 @@ dojo.declare("dojo.rpc.RpcService", null, {
err.errorObject = obj;
deferredRequestHandler.errback(err);
}else{
- deferredRequestHandler.callback(this.parseResults(obj));
+ deferredRequestHandler.callback(this.parseResults(obj));
}
}
);
@@ -160,7 +161,7 @@ dojo.declare("dojo.rpc.RpcService", null, {
dojo.forEach(object.methods, function(m){
if(m && m.name){
this[m.name] = this.generateMethod( m.name,
- m.parameters,
+ m.parameters,
m.url||m.serviceUrl||m.serviceURL);
if(!dojo.isFunction(this[m.name])){
throw new Error("RpcService: Failed to create" + m.name + "()");
diff --git a/lib/dojo/store/Cache.js b/lib/dojo/store/Cache.js
new file mode 100644
index 000000000..d08d17099
--- /dev/null
+++ b/lib/dojo/store/Cache.js
@@ -0,0 +1,152 @@
+/*
+ Copyright (c) 2004-2011, The 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.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.
+ }
+});
+=====*/
+
+}
diff --git a/lib/dojo/store/DataStore.js b/lib/dojo/store/DataStore.js
new file mode 100644
index 000000000..99c81fd5d
--- /dev/null
+++ b/lib/dojo/store/DataStore.js
@@ -0,0 +1,142 @@
+/*
+ Copyright (c) 2004-2011, The 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.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]];
+ }
+});
+
+}
diff --git a/lib/dojo/store/JsonRest.js b/lib/dojo/store/JsonRest.js
new file mode 100644
index 000000000..5f9254c3e
--- /dev/null
+++ b/lib/dojo/store/JsonRest.js
@@ -0,0 +1,146 @@
+/*
+ Copyright (c) 2004-2011, The 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.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);
+ }
+});
+
+}
diff --git a/lib/dojo/store/Memory.js b/lib/dojo/store/Memory.js
new file mode 100644
index 000000000..b9001cdaf
--- /dev/null
+++ b/lib/dojo/store/Memory.js
@@ -0,0 +1,164 @@
+/*
+ Copyright (c) 2004-2011, The 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.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;
+ }
+ }
+});
+
+}
diff --git a/lib/dojo/store/Observable.js b/lib/dojo/store/Observable.js
new file mode 100644
index 000000000..f231e0321
--- /dev/null
+++ b/lib/dojo/store/Observable.js
@@ -0,0 +1,173 @@
+/*
+ Copyright (c) 2004-2011, The 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.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;
+};
+
+}
diff --git a/lib/dojo/store/README b/lib/dojo/store/README
new file mode 100644
index 000000000..cb33da077
--- /dev/null
+++ b/lib/dojo/store/README
@@ -0,0 +1,10 @@
+This folder contains the stores and utilities implementing the proposed new Dojo Object Store API,
+a successor and unifier to Dojo Data, Dojo Storage, and potentially Dojo Model. These
+stores are brand new, and designed to provide simple lightweight implementations
+providing core functionality for typical applications. These modules are under active
+development, and exist here at this time to provide maximum visibility to the
+efforts to design and develop this new API and set of base stores. The goal is
+to have these stores ready for Dojo 1.6. In the meantime, these stores are likely to
+have API changes, may be missing some functionality, tests, and/or documentation.
+If these modules are not deemed suitably stable by the 1.6 release, this directory (or
+individual modules) will be removed and be given a later release target. \ No newline at end of file
diff --git a/lib/dojo/store/api/Store.js b/lib/dojo/store/api/Store.js
new file mode 100644
index 000000000..ca26226d3
--- /dev/null
+++ b/lib/dojo/store/api/Store.js
@@ -0,0 +1,304 @@
+/*
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ 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.
+ }
+});
+
+});
diff --git a/lib/dojo/store/util/QueryResults.js b/lib/dojo/store/util/QueryResults.js
new file mode 100644
index 000000000..a237d1dce
--- /dev/null
+++ b/lib/dojo/store/util/QueryResults.js
@@ -0,0 +1,67 @@
+/*
+ Copyright (c) 2004-2011, The 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.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;
+};
+
+}
diff --git a/lib/dojo/store/util/SimpleQueryEngine.js b/lib/dojo/store/util/SimpleQueryEngine.js
new file mode 100644
index 000000000..4b29f20cb
--- /dev/null
+++ b/lib/dojo/store/util/SimpleQueryEngine.js
@@ -0,0 +1,116 @@
+/*
+ Copyright (c) 2004-2011, The 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.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;
+};
+
+}
diff --git a/lib/dojo/string.js b/lib/dojo/string.js
index 1eba34043..2e1cc5015 100644
--- a/lib/dojo/string.js
+++ b/lib/dojo/string.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,8 +9,10 @@ if(!dojo._hasResource["dojo.string"]){ //_hasResource checks added by build. Do
dojo._hasResource["dojo.string"] = true;
dojo.provide("dojo.string");
+dojo.getObject("string", true, dojo);
+
/*=====
-dojo.string = {
+dojo.string = {
// summary: String utilities for Dojo
};
=====*/
@@ -61,22 +63,22 @@ dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boo
return end ? out + pad : pad + out; // String
};
-dojo.string.substitute = function( /*String*/ template,
- /*Object|Array*/map,
- /*Function?*/ transform,
+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:
+ // template:
// a string with expressions in the form `${key}` to be replaced or
- // `${key:format}` which specifies a format function. keys are case-sensitive.
+ // `${key:format}` which specifies a format function. keys are case-sensitive.
// map:
// hash to search for substitutions
- // transform:
+ // transform:
// a function to process all parameters before substitution takes
// place, e.g. mylib.encodeXML
- // thisObject:
+ // thisObject:
// where to look for optional format function; default to the global
// namespace
// example:
@@ -119,7 +121,7 @@ dojo.string.substitute = function( /*String*/ template,
// | );
thisObject = thisObject || dojo.global;
- transform = transform ?
+ transform = transform ?
dojo.hitch(thisObject, transform) : function(v){ return v; };
return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
diff --git a/lib/dojo/tt-rss-layer.js b/lib/dojo/tt-rss-layer.js
index 295fd957a..2c0f3489d 100644
--- a/lib/dojo/tt-rss-layer.js
+++ b/lib/dojo/tt-rss-layer.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -11,4 +11,4 @@
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.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;this._attrName=d._scopeName+"Type";this._query="["+this._attrName+"]";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={};dojo.connect(dojo,"extend",function(){_1a={};});function _1b(_1c){if(!_1a[_1c]){var cls=d.getObject(_1c);if(!cls){return null;}var _1d=cls.prototype;var _1e={},_1f={};for(var _20 in _1d){if(_20.charAt(0)=="_"){continue;}if(_20 in _1f){continue;}var _21=_1d[_20];_1e[_20]=_15(_21);}_1a[_1c]={cls:cls,params:_1e};}return _1a[_1c];};this._functionFromScript=function(_22){var _23="";var _24="";var _25=_22.getAttribute("args");if(_25){d.forEach(_25.split(/\s*,\s*/),function(_26,idx){_23+="var "+_26+" = arguments["+idx+"]; ";});}var _27=_22.getAttribute("with");if(_27&&_27.length){d.forEach(_27.split(/\s*,\s*/),function(_28){_23+="with("+_28+"){";_24+="}";});}return new Function(_23+_22.innerHTML+_24);};this.instantiate=function(_29,_2a,_2b){var _2c=[],dp=dojo.parser;_2a=_2a||{};_2b=_2b||{};d.forEach(_29,function(obj){if(!obj){return;}var _2d,_2e,_2f,_30,_31;if(obj.node){_2d=obj.node;_2e=obj.type;_2f=obj.clsInfo||(_2e&&_1b(_2e));_30=_2f&&_2f.cls;_31=obj.scripts;}else{_2d=obj;_2e=dp._attrName in _2a?_2a[dp._attrName]:_2d.getAttribute(dp._attrName);_2f=_2e&&_1b(_2e);_30=_2f&&_2f.cls;_31=(_30&&(_30._noScript||_30.prototype._noScript)?[]:d.query("> script[type^='dojo/']",_2d));}if(!_2f){throw new Error("Could not load class '"+_2e);}var _32={},_33=_2d.attributes;if(_2b.defaults){dojo.mixin(_32,_2b.defaults);}if(obj.inherited){dojo.mixin(_32,obj.inherited);}for(var _34 in _2f.params){var _35=_34 in _2a?{value:_2a[_34],specified:true}:_33.getNamedItem(_34);if(!_35||(!_35.specified&&(!dojo.isIE||_34.toLowerCase()!="value"))){continue;}var _36=_35.value;switch(_34){case "class":_36="className" in _2a?_2a.className:_2d.className;break;case "style":_36="style" in _2a?_2a.style:(_2d.style&&_2d.style.cssText);}var _37=_2f.params[_34];if(typeof _36=="string"){_32[_34]=_17(_36,_37);}else{_32[_34]=_36;}}var _38=[],_39=[];d.forEach(_31,function(_3a){_2d.removeChild(_3a);var _3b=_3a.getAttribute("event"),_2e=_3a.getAttribute("type"),nf=d.parser._functionFromScript(_3a);if(_3b){if(_2e=="dojo/connect"){_38.push({event:_3b,func:nf});}else{_32[_3b]=nf;}}else{_39.push(nf);}});var _3c=_30.markupFactory||_30.prototype&&_30.prototype.markupFactory;var _3d=_3c?_3c(_32,_2d,_30):new _30(_32,_2d);_2c.push(_3d);var _3e=_2d.getAttribute("jsId");if(_3e){d.setObject(_3e,_3d);}d.forEach(_38,function(_3f){d.connect(_3d,_3f.event,null,_3f.func);});d.forEach(_39,function(_40){_40.call(_3d);});});if(!_2a._started){d.forEach(_2c,function(_41){if(!_2b.noStart&&_41&&_41.startup&&!_41._started&&(!_41.getParent||!_41.getParent())){_41.startup();}});}return _2c;};this.parse=function(_42,_43){var _44;if(!_43&&_42&&_42.rootNode){_43=_42;_44=_43.rootNode;}else{_44=_42;}var _45=this._attrName;function _46(_47,_48){var _49=dojo.clone(_47.inherited);dojo.forEach(["dir","lang"],function(_4a){var val=_47.node.getAttribute(_4a);if(val){_49[_4a]=val;}});var _4b=_47.scripts;var _4c=!_47.clsInfo||!_47.clsInfo.cls.prototype.stopParser;for(var _4d=_47.node.firstChild;_4d;_4d=_4d.nextSibling){if(_4d.nodeType==1){var _4e=_4c&&_4d.getAttribute(_45);if(_4e){var _4f={"type":_4e,clsInfo:_1b(_4e),node:_4d,scripts:[],inherited:_49};_48.push(_4f);_46(_4f,_48);}else{if(_4b&&_4d.nodeName.toLowerCase()=="script"){_4e=_4d.getAttribute("type");if(_4e&&/^dojo\//i.test(_4e)){_4b.push(_4d);}}else{if(_4c){_46({node:_4d,inherited:_49},_48);}}}}}};var _50=[];_46({node:_44?dojo.byId(_44):dojo.body(),inherited:(_43&&_43.inherited)||{dir:dojo._isBodyLtr()?"ltr":"rtl"}},_50);return this.instantiate(_50,null,_43);};}();(function(){var _51=function(){if(dojo.config.parseOnLoad){dojo.parser.parse();}};if(dojo.exists("dijit.wai.onload")&&(dijit.wai.onload===dojo._loaders[0])){dojo._loaders.splice(1,0,_51);}else{dojo._loaders.unshift(_51);}})();}if(!dojo._hasResource["dojo.window"]){dojo._hasResource["dojo.window"]=true;dojo.provide("dojo.window");dojo.window.getBox=function(){var _52=(dojo.doc.compatMode=="BackCompat")?dojo.body():dojo.doc.documentElement;var _53=dojo._docScroll();return {w:_52.clientWidth,h:_52.clientHeight,l:_53.x,t:_53.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(_54,pos){try{_54=dojo.byId(_54);var doc=_54.ownerDocument||dojo.doc,_55=doc.body||dojo.body(),_56=doc.documentElement||_55.parentNode,_57=dojo.isIE,_58=dojo.isWebKit;if((!(dojo.isMoz||_57||_58||dojo.isOpera)||_54==_55||_54==_56)&&(typeof _54.scrollIntoView!="undefined")){_54.scrollIntoView(false);return;}var _59=doc.compatMode=="BackCompat",_5a=_59?_55:_56,_5b=_58?_55:_5a,_5c=_5a.clientWidth,_5d=_5a.clientHeight,rtl=!dojo._isBodyLtr(),_5e=pos||dojo.position(_54),el=_54.parentNode,_5f=function(el){return ((_57<=6||(_57&&_59))?false:(dojo.style(el,"position").toLowerCase()=="fixed"));};if(_5f(_54)){return;}while(el){if(el==_55){el=_5b;}var _60=dojo.position(el),_61=_5f(el);if(el==_5b){_60.w=_5c;_60.h=_5d;if(_5b==_56&&_57&&rtl){_60.x+=_5b.offsetWidth-_60.w;}if(_60.x<0||!_57){_60.x=0;}if(_60.y<0||!_57){_60.y=0;}}else{var pb=dojo._getPadBorderExtents(el);_60.w-=pb.w;_60.h-=pb.h;_60.x+=pb.l;_60.y+=pb.t;}if(el!=_5b){var _62=el.clientWidth,_63=_60.w-_62;if(_62>0&&_63>0){_60.w=_62;if(_57&&rtl){_60.x+=_63;}}_62=el.clientHeight;_63=_60.h-_62;if(_62>0&&_63>0){_60.h=_62;}}if(_61){if(_60.y<0){_60.h+=_60.y;_60.y=0;}if(_60.x<0){_60.w+=_60.x;_60.x=0;}if(_60.y+_60.h>_5d){_60.h=_5d-_60.y;}if(_60.x+_60.w>_5c){_60.w=_5c-_60.x;}}var l=_5e.x-_60.x,t=_5e.y-Math.max(_60.y,0),r=l+_5e.w-_60.w,bot=t+_5e.h-_60.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);_5e.x+=el.scrollLeft;el.scrollLeft+=(_57>=8&&!_59&&rtl)?-s:s;_5e.x-=el.scrollLeft;}if(bot*t>0){_5e.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_5e.y-=el.scrollTop;}el=(el!=_5b)&&!_61&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);_54.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(_64){if(this._hash[_64.id]){throw new Error("Tried to register widget with id=="+_64.id+" but that id is already registered");}this._hash[_64.id]=_64;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_65,_66){_66=_66||dojo.global;var i=0,id;for(id in this._hash){_65.call(_66,this._hash[id],i++,this._hash);}return this;},filter:function(_67,_68){_68=_68||dojo.global;var res=new dijit.WidgetSet(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_67.call(_68,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,_69;for(id in this._hash){_69=this._hash[id];if(_69.declaredClass==cls){res.add(_69);}}return res;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(_6a,_6b){return dojo.map(this.toArray(),_6a,_6b);},every:function(_6c,_6d){_6d=_6d||dojo.global;var x=0,i;for(i in this._hash){if(!_6c.call(_6d,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(_6e,_6f){_6f=_6f||dojo.global;var x=0,i;for(i in this._hash){if(_6e.call(_6f,this._hash[i],x++,this._hash)){return true;}}return false;}});(function(){dijit.registry=new dijit.WidgetSet();var _70=dijit.registry._hash,_71=dojo.attr,_72=dojo.hasAttr,_73=dojo.style;dijit.byId=function(id){return typeof id=="string"?_70[id]:id;};var _74={};dijit.getUniqueId=function(_75){var id;do{id=_75+"_"+(_75 in _74?++_74[_75]:_74[_75]=0);}while(_70[id]);return dijit._scopeName=="dijit"?id:dijit._scopeName+"_"+id;};dijit.findWidgets=function(_76){var _77=[];function _78(_79){for(var _7a=_79.firstChild;_7a;_7a=_7a.nextSibling){if(_7a.nodeType==1){var _7b=_7a.getAttribute("widgetId");if(_7b){_77.push(_70[_7b]);}else{_78(_7a);}}}};_78(_76);return _77;};dijit._destroyAll=function(){dijit._curFocus=null;dijit._prevFocus=null;dijit._activeStack=[];dojo.forEach(dijit.findWidgets(dojo.body()),function(_7c){if(!_7c._destroyed){if(_7c.destroyRecursive){_7c.destroyRecursive();}else{if(_7c.destroy){_7c.destroy();}}}});};if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit._destroyAll();});}dijit.byNode=function(_7d){return _70[_7d.getAttribute("widgetId")];};dijit.getEnclosingWidget=function(_7e){while(_7e){var id=_7e.getAttribute&&_7e.getAttribute("widgetId");if(id){return _70[id];}_7e=_7e.parentNode;}return null;};var _7f=(dijit._isElementShown=function(_80){var s=_73(_80);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_71(_80,"type")!="hidden");});dijit.hasDefaultTabStop=function(_81){switch(_81.nodeName.toLowerCase()){case "a":return _72(_81,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":if(dojo.isMoz){try{return _81.contentDocument.designMode=="on";}catch(err){return false;}}else{if(dojo.isWebKit){var doc=_81.contentDocument,_82=doc&&doc.body;return _82&&_82.contentEditable=="true";}else{try{doc=_81.contentWindow.document;_82=doc&&doc.body;return _82&&_82.firstChild&&_82.firstChild.contentEditable=="true";}catch(e){return false;}}}default:return _81.contentEditable=="true";}};var _83=(dijit.isTabNavigable=function(_84){if(_71(_84,"disabled")){return false;}else{if(_72(_84,"tabIndex")){return _71(_84,"tabIndex")>=0;}else{return dijit.hasDefaultTabStop(_84);}}});dijit._getTabNavigable=function(_85){var _86,_87,_88,_89,_8a,_8b;var _8c=function(_8d){dojo.query("> *",_8d).forEach(function(_8e){if((dojo.isIE&&_8e.scopeName!=="HTML")||!_7f(_8e)){return;}if(_83(_8e)){var _8f=_71(_8e,"tabIndex");if(!_72(_8e,"tabIndex")||_8f==0){if(!_86){_86=_8e;}_87=_8e;}else{if(_8f>0){if(!_88||_8f<_89){_89=_8f;_88=_8e;}if(!_8a||_8f>=_8b){_8b=_8f;_8a=_8e;}}}}if(_8e.nodeName.toUpperCase()!="SELECT"){_8c(_8e);}});};if(_7f(_85)){_8c(_85);}return {first:_86,last:_87,lowest:_88,highest:_8a};};dijit.getFirstInTabbingOrder=function(_90){var _91=dijit._getTabNavigable(dojo.byId(_90));return _91.lowest?_91.lowest:_91.first;};dijit.getLastInTabbingOrder=function(_92){var _93=dijit._getTabNavigable(dojo.byId(_92));return _93.last?_93.last:_93.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};}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(_94){var _95=dojo.doc,_96=_94.mark;if(_96){if(dojo.global.getSelection){var sel=dojo.global.getSelection();if(sel&&sel.removeAllRanges){if(_96.pRange){var r=_96;var n=r.node;n.selectionStart=r.start;n.selectionEnd=r.end;}else{sel.removeAllRanges();sel.addRange(_96);}}else{console.warn("No idea how to restore selection for this browser!");}}else{if(_95.selection&&_96){var rg;if(_96.pRange){rg=_96.range;}else{if(dojo.isArray(_96)){rg=_95.body.createControlRange();dojo.forEach(_96,function(n){rg.addElement(n);});}else{rg=_95.body.createTextRange();rg.moveToBookmark(_96);}}rg.select();}}}},getFocus:function(_97,_98){var _99=!dijit._curFocus||(_97&&dojo.isDescendant(dijit._curFocus,_97.domNode))?dijit._prevFocus:dijit._curFocus;return {node:_99,bookmark:(_99==dijit._curFocus)&&dojo.withGlobal(_98||dojo.global,dijit.getBookmark),openedForWindow:_98};},focus:function(_9a){if(!_9a){return;}var _9b="node" in _9a?_9a.node:_9a,_9c=_9a.bookmark,_9d=_9a.openedForWindow,_9e=_9c?_9c.isCollapsed:false;if(_9b){var _9f=(_9b.tagName.toLowerCase()=="iframe")?_9b.contentWindow:_9b;if(_9f&&_9f.focus){try{_9f.focus();}catch(e){}}dijit._onFocusNode(_9b);}if(_9c&&dojo.withGlobal(_9d||dojo.global,dijit.isCollapsed)&&!_9e){if(_9d){_9d.focus();}try{dojo.withGlobal(_9d||dojo.global,dijit.moveToBookmark,null,[_9c]);}catch(e2){}}},_activeStack:[],registerIframe:function(_a0){return dijit.registerWin(_a0.contentWindow,_a0);},unregisterIframe:function(_a1){dijit.unregisterWin(_a1);},registerWin:function(_a2,_a3){var _a4=function(evt){dijit._justMouseDowned=true;setTimeout(function(){dijit._justMouseDowned=false;},0);if(dojo.isIE&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}dijit._onTouchNode(_a3||evt.target||evt.srcElement,"mouse");};var doc=dojo.isIE?_a2.document.documentElement:_a2.document;if(doc){if(dojo.isIE){doc.attachEvent("onmousedown",_a4);var _a5=function(evt){if(evt.srcElement.tagName.toLowerCase()!="#document"&&dijit.isTabNavigable(evt.srcElement)){dijit._onFocusNode(_a3||evt.srcElement);}else{dijit._onTouchNode(_a3||evt.srcElement);}};doc.attachEvent("onactivate",_a5);var _a6=function(evt){dijit._onBlurNode(_a3||evt.srcElement);};doc.attachEvent("ondeactivate",_a6);return function(){doc.detachEvent("onmousedown",_a4);doc.detachEvent("onactivate",_a5);doc.detachEvent("ondeactivate",_a6);doc=null;};}else{doc.addEventListener("mousedown",_a4,true);var _a7=function(evt){dijit._onFocusNode(_a3||evt.target);};doc.addEventListener("focus",_a7,true);var _a8=function(evt){dijit._onBlurNode(_a3||evt.target);};doc.addEventListener("blur",_a8,true);return function(){doc.removeEventListener("mousedown",_a4,true);doc.removeEventListener("focus",_a7,true);doc.removeEventListener("blur",_a8,true);doc=null;};}}},unregisterWin:function(_a9){_a9&&_a9();},_onBlurNode:function(_aa){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(_ab,by){if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);delete dijit._clearActiveWidgetsTimer;}var _ac=[];try{while(_ab){var _ad=dojo.attr(_ab,"dijitPopupParent");if(_ad){_ab=dijit.byId(_ad).domNode;}else{if(_ab.tagName&&_ab.tagName.toLowerCase()=="body"){if(_ab===dojo.body()){break;}_ab=dojo.window.get(_ab.ownerDocument).frameElement;}else{var id=_ab.getAttribute&&_ab.getAttribute("widgetId"),_ae=id&&dijit.byId(id);if(_ae&&!(by=="mouse"&&_ae.get("disabled"))){_ac.unshift(id);}_ab=_ab.parentNode;}}}}catch(e){}dijit._setStack(_ac,by);},_onFocusNode:function(_af){if(!_af){return;}if(_af.nodeType==9){return;}dijit._onTouchNode(_af);if(_af==dijit._curFocus){return;}if(dijit._curFocus){dijit._prevFocus=dijit._curFocus;}dijit._curFocus=_af;dojo.publish("focusNode",[_af]);},_setStack:function(_b0,by){var _b1=dijit._activeStack;dijit._activeStack=_b0;for(var _b2=0;_b2<Math.min(_b1.length,_b0.length);_b2++){if(_b1[_b2]!=_b0[_b2]){break;}}var _b3;for(var i=_b1.length-1;i>=_b2;i--){_b3=dijit.byId(_b1[i]);if(_b3){_b3._focused=false;_b3._hasBeenBlurred=true;if(_b3._onBlur){_b3._onBlur(by);}dojo.publish("widgetBlur",[_b3,by]);}}for(i=_b2;i<_b0.length;i++){_b3=dijit.byId(_b0[i]);if(_b3){_b3._focused=true;if(_b3._onFocus){_b3._onFocus(by);}dojo.publish("widgetFocus",[_b3,by]);}}}});dojo.addOnLoad(function(){var _b4=dijit.registerWin(window);if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit.unregisterWin(_b4);_b4=null;});}});}if(!dojo._hasResource["dojo.AdapterRegistry"]){dojo._hasResource["dojo.AdapterRegistry"]=true;dojo.provide("dojo.AdapterRegistry");dojo.AdapterRegistry=function(_b5){this.pairs=[];this.returnWrappers=_b5||false;};dojo.extend(dojo.AdapterRegistry,{register:function(_b6,_b7,_b8,_b9,_ba){this.pairs[((_ba)?"unshift":"push")]([_b6,_b7,_b8,_b9]);},match:function(){for(var i=0;i<this.pairs.length;i++){var _bb=this.pairs[i];if(_bb[1].apply(this,arguments)){if((_bb[3])||(this.returnWrappers)){return _bb[2];}else{return _bb[2].apply(this,arguments);}}}throw new Error("No match found");},unregister:function(_bc){for(var i=0;i<this.pairs.length;i++){var _bd=this.pairs[i];if(_bd[0]==_bc){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(_be,pos,_bf,_c0){var _c1=dojo.map(_bf,function(_c2){var c={corner:_c2,pos:{x:pos.x,y:pos.y}};if(_c0){c.pos.x+=_c2.charAt(1)=="L"?_c0.x:-_c0.x;c.pos.y+=_c2.charAt(0)=="T"?_c0.y:-_c0.y;}return c;});return dijit._place(_be,_c1);};dijit._place=function(_c3,_c4,_c5){var _c6=dojo.window.getBox();if(!_c3.parentNode||String(_c3.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(_c3);}var _c7=null;dojo.some(_c4,function(_c8){var _c9=_c8.corner;var pos=_c8.pos;if(_c5){_c5(_c3,_c8.aroundCorner,_c9);}var _ca=_c3.style;var _cb=_ca.display;var _cc=_ca.visibility;_ca.visibility="hidden";_ca.display="";var mb=dojo.marginBox(_c3);_ca.display=_cb;_ca.visibility=_cc;var _cd=Math.max(_c6.l,_c9.charAt(1)=="L"?pos.x:(pos.x-mb.w)),_ce=Math.max(_c6.t,_c9.charAt(0)=="T"?pos.y:(pos.y-mb.h)),_cf=Math.min(_c6.l+_c6.w,_c9.charAt(1)=="L"?(_cd+mb.w):pos.x),_d0=Math.min(_c6.t+_c6.h,_c9.charAt(0)=="T"?(_ce+mb.h):pos.y),_d1=_cf-_cd,_d2=_d0-_ce,_d3=(mb.w-_d1)+(mb.h-_d2);if(_c7==null||_d3<_c7.overflow){_c7={corner:_c9,aroundCorner:_c8.aroundCorner,x:_cd,y:_ce,w:_d1,h:_d2,overflow:_d3};}return !_d3;});_c3.style.left=_c7.x+"px";_c3.style.top=_c7.y+"px";if(_c7.overflow&&_c5){_c5(_c3,_c7.aroundCorner,_c7.corner);}return _c7;};dijit.placeOnScreenAroundNode=function(_d4,_d5,_d6,_d7){_d5=dojo.byId(_d5);var _d8=_d5.style.display;_d5.style.display="";var _d9=dojo.position(_d5,true);_d5.style.display=_d8;return dijit._placeOnScreenAroundRect(_d4,_d9.x,_d9.y,_d9.w,_d9.h,_d6,_d7);};dijit.placeOnScreenAroundRectangle=function(_da,_db,_dc,_dd){return dijit._placeOnScreenAroundRect(_da,_db.x,_db.y,_db.width,_db.height,_dc,_dd);};dijit._placeOnScreenAroundRect=function(_de,x,y,_df,_e0,_e1,_e2){var _e3=[];for(var _e4 in _e1){_e3.push({aroundCorner:_e4,corner:_e1[_e4],pos:{x:x+(_e4.charAt(1)=="L"?0:_df),y:y+(_e4.charAt(0)=="T"?0:_e0)}});}return dijit._place(_de,_e3,_e2);};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(_e5,_e6,_e7,_e8){return dijit.placementRegistry.match.apply(dijit.placementRegistry,arguments);};dijit.getPopupAroundAlignment=function(_e9,_ea){var _eb={};dojo.forEach(_e9,function(pos){switch(pos){case "after":_eb[_ea?"BR":"BL"]=_ea?"BL":"BR";break;case "before":_eb[_ea?"BL":"BR"]=_ea?"BR":"BL";break;case "below":_eb[_ea?"BL":"BR"]=_ea?"TL":"TR";_eb[_ea?"BR":"BL"]=_ea?"TR":"TL";break;case "above":default:_eb[_ea?"TL":"TR"]=_ea?"BL":"BR";_eb[_ea?"TR":"TL"]=_ea?"BR":"BL";break;}});return _eb;};}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,moveOffScreen:function(_ec){var _ed=_ec.parentNode;if(!_ed||!dojo.hasClass(_ed,"dijitPopup")){_ed=dojo.create("div",{"class":"dijitPopup",style:{visibility:"hidden",top:"-9999px"}},dojo.body());dijit.setWaiRole(_ed,"presentation");_ed.appendChild(_ec);}var s=_ec.style;s.display="";s.visibility="";s.position="";s.top="0px";dojo.style(_ed,{visibility:"hidden",top:"-9999px"});},getTopPopup:function(){var _ee=this._stack;for(var pi=_ee.length-1;pi>0&&_ee[pi].parent===_ee[pi-1].widget;pi--){}return _ee[pi];},open:function(_ef){var _f0=this._stack,_f1=_ef.popup,_f2=_ef.orient||((_ef.parent?_ef.parent.isLeftToRight():dojo._isBodyLtr())?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"}),_f3=_ef.around,id=(_ef.around&&_ef.around.id)?(_ef.around.id+"_dropdown"):("popup_"+this._idGen++);var _f4=_f1.domNode.parentNode;if(!_f4||!dojo.hasClass(_f4,"dijitPopup")){this.moveOffScreen(_f1.domNode);_f4=_f1.domNode.parentNode;}dojo.attr(_f4,{id:id,style:{zIndex:this._beginZIndex+_f0.length},"class":"dijitPopup "+(_f1.baseClass||_f1["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:_ef.parent?_ef.parent.id:""});if(dojo.isIE||dojo.isMoz){var _f5=_f4.childNodes[1];if(!_f5){_f5=new dijit.BackgroundIframe(_f4);}}var _f6=_f3?dijit.placeOnScreenAroundElement(_f4,_f3,_f2,_f1.orient?dojo.hitch(_f1,"orient"):null):dijit.placeOnScreen(_f4,_ef,_f2=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_ef.padding);_f4.style.visibility="visible";_f1.domNode.style.visibility="visible";var _f7=[];_f7.push(dojo.connect(_f4,"onkeypress",this,function(evt){if(evt.charOrCode==dojo.keys.ESCAPE&&_ef.onCancel){dojo.stopEvent(evt);_ef.onCancel();}else{if(evt.charOrCode===dojo.keys.TAB){dojo.stopEvent(evt);var _f8=this.getTopPopup();if(_f8&&_f8.onCancel){_f8.onCancel();}}}}));if(_f1.onCancel){_f7.push(dojo.connect(_f1,"onCancel",_ef.onCancel));}_f7.push(dojo.connect(_f1,_f1.onExecute?"onExecute":"onChange",this,function(){var _f9=this.getTopPopup();if(_f9&&_f9.onExecute){_f9.onExecute();}}));_f0.push({wrapper:_f4,iframe:_f5,widget:_f1,parent:_ef.parent,onExecute:_ef.onExecute,onCancel:_ef.onCancel,onClose:_ef.onClose,handlers:_f7});if(_f1.onOpen){_f1.onOpen(_f6);}return _f6;},close:function(_fa){var _fb=this._stack;while(dojo.some(_fb,function(_fc){return _fc.widget==_fa;})){var top=_fb.pop(),_fd=top.wrapper,_fe=top.iframe,_ff=top.widget,_100=top.onClose;if(_ff.onClose){_ff.onClose();}dojo.forEach(top.handlers,dojo.disconnect);if(_ff&&_ff.domNode){this.moveOffScreen(_ff.domNode);}else{dojo.destroy(_fd);}if(_100){_100();}}}};dijit._frames=new function(){var _101=[];this.pop=function(){var _102;if(_101.length){_102=_101.pop();_102.style.display="";}else{if(dojo.isIE){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\");'>";_102=dojo.doc.createElement(html);}else{_102=dojo.create("iframe");_102.src="javascript:\"\"";_102.className="dijitBackgroundIframe";dojo.style(_102,"opacity",0.1);}_102.tabIndex=-1;dijit.setWaiRole(_102,"presentation");}return _102;};this.push=function(_103){_103.style.display="none";_101.push(_103);};}();dijit.BackgroundIframe=function(node){if(!node.id){throw new Error("no id");}if(dojo.isIE||dojo.isMoz){var _104=dijit._frames.pop();node.appendChild(_104);if(dojo.isIE<7){this.resize(node);this._conn=dojo.connect(node,"onresize",this,function(){this.resize(node);});}else{dojo.style(_104,{width:"100%",height:"100%"});}this.iframe=_104;}};dojo.extend(dijit.BackgroundIframe,{resize:function(node){if(this.iframe&&dojo.isIE<7){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,_105=d.isOpera,maj=Math.floor,ff=d.isFF,_106=d.boxModel.replace(/-/,""),_107={dj_ie:ie,dj_ie6:maj(ie)==6,dj_ie7:maj(ie)==7,dj_ie8:maj(ie)==8,dj_quirks:d.isQuirks,dj_iequirks:ie&&d.isQuirks,dj_opera:_105,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};_107["dj_"+_106]=true;var _108="";for(var clz in _107){if(_107[clz]){_108+=clz+" ";}}html.className=d.trim(html.className+" "+_108);dojo._loaders.unshift(function(){if(!dojo._isBodyLtr()){var _109="dj_rtl dijitRtl "+_108.replace(/ /g,"-rtl ");html.className=d.trim(html.className+" "+_109);}});})();}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,_10a,node,_10b,obj,_10c,_10d,_10e){if(obj!=this._obj){this.stop();this._initialDelay=_10d||500;this._subsequentDelay=_10c||0.9;this._minDelay=_10e||10;this._obj=obj;this._evt=evt;this._node=node;this._currentTimeout=-1;this._count=-1;this._callback=dojo.hitch(_10a,_10b);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,_10f,_110,_111,_112,_113,_114){if(_10f.keyCode){_10f.charOrCode=_10f.keyCode;dojo.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_10f.charCode){_10f.charOrCode=String.fromCharCode(_10f.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==_10f.charOrCode&&(_10f.ctrlKey===undefined||_10f.ctrlKey==evt.ctrlKey)&&(_10f.altKey===undefined||_10f.altKey==evt.altKey)&&(_10f.metaKey===undefined||_10f.metaKey==(evt.metaKey||false))&&(_10f.shiftKey===undefined||_10f.shiftKey==evt.shiftKey)){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_110,node,_111,_10f,_112,_113,_114);}else{if(dijit.typematic._obj==_10f){dijit.typematic.stop();}}}),dojo.connect(node,"onkeyup",this,function(evt){if(dijit.typematic._obj==_10f){dijit.typematic.stop();}})];},addMouseListener:function(node,_115,_116,_117,_118,_119){var dc=dojo.connect;return [dc(node,"mousedown",this,function(evt){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_115,node,_116,node,_117,_118,_119);}),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,_115,node,_116,node,_117,_118,_119);setTimeout(dojo.hitch(this,dijit.typematic.stop),50);}})];},addListener:function(_11a,_11b,_11c,_11d,_11e,_11f,_120,_121){return this.addKeyListener(_11b,_11c,_11d,_11e,_11f,_120,_121).concat(this.addMouseListener(_11a,_11d,_11e,_11f,_120,_121));}};}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 _122=cs.backgroundImage;var _123=(cs.borderTopColor==cs.borderRightColor)||(_122!=null&&(_122=="none"||_122=="url(invalid-url:)"));dojo[_123?"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,{_XhtmlRoles:/banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,hasWaiRole:function(elem,role){var _124=this.getWaiRole(elem);return role?(_124.indexOf(role)>-1):(_124.length>0);},getWaiRole:function(elem){return dojo.trim((dojo.attr(elem,"role")||"").replace(this._XhtmlRoles,"").replace("wairole:",""));},setWaiRole:function(elem,role){var _125=dojo.attr(elem,"role")||"";if(!this._XhtmlRoles.test(_125)){dojo.attr(elem,"role",role);}else{if((" "+_125+" ").indexOf(" "+role+" ")<0){var _126=dojo.trim(_125.replace(this._XhtmlRoles,""));var _127=dojo.trim(_125.replace(_126,""));dojo.attr(elem,"role",_127+(_127?" ":"")+role);}}},removeWaiRole:function(elem,role){var _128=dojo.attr(elem,"role");if(!_128){return;}if(role){var t=dojo.trim((" "+_128+" ").replace(" "+role+" "," "));dojo.attr(elem,"role",t);}else{elem.removeAttribute("role");}},hasWaiState:function(elem,_129){return elem.hasAttribute?elem.hasAttribute("aria-"+_129):!!elem.getAttribute("aria-"+_129);},getWaiState:function(elem,_12a){return elem.getAttribute("aria-"+_12a)||"";},setWaiState:function(elem,_12b,_12c){elem.setAttribute("aria-"+_12b,_12c);},removeWaiState:function(elem,_12d){elem.removeAttribute("aria-"+_12d);}});}if(!dojo._hasResource["dijit._base"]){dojo._hasResource["dijit._base"]=true;dojo.provide("dijit._base");}if(!dojo._hasResource["dijit._Widget"]){dojo._hasResource["dijit._Widget"]=true;dojo.provide("dijit._Widget");dojo.require("dijit._base");dojo.connect(dojo,"_connect",function(_12e,_12f){if(_12e&&dojo.isFunction(_12e._onConnect)){_12e._onConnect(_12f);}});dijit._connectOnUseEventHandler=function(_130){};dijit._lastKeyDownNode=null;if(dojo.isIE){(function(){var _131=function(evt){dijit._lastKeyDownNode=evt.srcElement;};dojo.doc.attachEvent("onkeydown",_131);dojo.addOnWindowUnload(function(){dojo.doc.detachEvent("onkeydown",_131);});})();}else{dojo.doc.addEventListener("keydown",function(evt){dijit._lastKeyDownNode=evt.target;},true);}(function(){var _132={},_133=function(_134){var dc=_134.declaredClass;if(!_132[dc]){var r=[],_135,_136=_134.constructor.prototype;for(var _137 in _136){if(dojo.isFunction(_136[_137])&&(_135=_137.match(/^_set([a-zA-Z]*)Attr$/))&&_135[1]){r.push(_135[1].charAt(0).toLowerCase()+_135[1].substr(1));}}_132[dc]=r;}return _132[dc]||[];};dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_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,_blankGif:(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif")).toString(),postscript:function(_138,_139){this.create(_138,_139);},create:function(_13a,_13b){this.srcNodeRef=dojo.byId(_13b);this._connects=[];this._subscribes=[];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];}}if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_13a){this.params=_13a;dojo.mixin(this,_13a);}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 _13c=this.srcNodeRef;if(_13c&&_13c.parentNode){_13c.parentNode.replaceChild(this.domNode,_13c);}for(attr in this.params){this._onConnect(attr);}}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 _13d=function(attr,_13e){if((_13e.params&&attr in _13e.params)||_13e[attr]){_13e.set(attr,_13e[attr]);}};for(var attr in this.attributeMap){_13d(attr,this);}dojo.forEach(_133(this),function(a){if(!(a in this.attributeMap)){_13d(a,this);}},this);},postMixInProperties:function(){},buildRendering:function(){this.domNode=this.srcNodeRef||dojo.create("div");},postCreate:function(){if(this.baseClass){var _13f=this.baseClass.split(" ");if(!this.isLeftToRight()){_13f=_13f.concat(dojo.map(_13f,function(name){return name+"Rtl";}));}dojo.addClass(this.domNode,_13f);}},startup:function(){this._started=true;},destroyRecursive:function(_140){this._beingDestroyed=true;this.destroyDescendants(_140);this.destroy(_140);},destroy:function(_141){this._beingDestroyed=true;this.uninitialize();var d=dojo,dfe=d.forEach,dun=d.unsubscribe;dfe(this._connects,function(_142){dfe(_142,d.disconnect);});dfe(this._subscribes,function(_143){dun(_143);});dfe(this._supportingWidgets||[],function(w){if(w.destroyRecursive){w.destroyRecursive();}else{if(w.destroy){w.destroy();}}});this.destroyRendering(_141);dijit.registry.remove(this.id);this._destroyed=true;},destroyRendering:function(_144){if(this.bgIframe){this.bgIframe.destroy(_144);delete this.bgIframe;}if(this.domNode){if(_144){dojo.removeAttr(this.domNode,"widgetId");}else{dojo.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_144){dojo.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_145){dojo.forEach(this.getChildren(),function(_146){if(_146.destroyRecursive){_146.destroyRecursive(_145);}});},uninitialize:function(){return false;},onFocus:function(){},onBlur:function(){},_onFocus:function(e){this.onFocus();},_onBlur:function(){this.onBlur();},_onConnect:function(_147){if(_147 in this._deferredConnects){var _148=this[this._deferredConnects[_147]||"domNode"];this.connect(_148,_147.toLowerCase(),_147);delete this._deferredConnects[_147];}},_setClassAttr:function(_149){var _14a=this[this.attributeMap["class"]||"domNode"];dojo.removeClass(_14a,this["class"]);this["class"]=_149;dojo.addClass(_14a,_149);},_setStyleAttr:function(_14b){var _14c=this[this.attributeMap.style||"domNode"];if(dojo.isObject(_14b)){dojo.style(_14c,_14b);}else{if(_14c.style.cssText){_14c.style.cssText+="; "+_14b;}else{_14c.style.cssText=_14b;}}this.style=_14b;},setAttribute:function(attr,_14d){dojo.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");this.set(attr,_14d);},_attrToDom:function(attr,_14e){var _14f=this.attributeMap[attr];dojo.forEach(dojo.isArray(_14f)?_14f:[_14f],function(_150){var _151=this[_150.node||_150||"domNode"];var type=_150.type||"attribute";switch(type){case "attribute":if(dojo.isFunction(_14e)){_14e=dojo.hitch(this,_14e);}var _152=_150.attribute?_150.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);dojo.attr(_151,_152,_14e);break;case "innerText":_151.innerHTML="";_151.appendChild(dojo.doc.createTextNode(_14e));break;case "innerHTML":_151.innerHTML=_14e;break;case "class":dojo.removeClass(_151,this[attr]);dojo.addClass(_151,_14e);break;}},this);this[attr]=_14e;},attr:function(name,_153){if(dojo.config.isDebug){var _154=arguments.callee._ach||(arguments.callee._ach={}),_155=(arguments.callee.caller||"unknown caller").toString();if(!_154[_155]){dojo.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_155,"","2.0");_154[_155]=true;}}var args=arguments.length;if(args>=2||typeof name==="object"){return this.set.apply(this,arguments);}else{return this.get(name);}},get:function(name){var _156=this._getAttrNames(name);return this[_156.g]?this[_156.g]():this[name];},set:function(name,_157){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _158=this._getAttrNames(name);if(this[_158.s]){var _159=this[_158.s].apply(this,Array.prototype.slice.call(arguments,1));}else{if(name in this.attributeMap){this._attrToDom(name,_157);}var _15a=this[name];this[name]=_157;}return _159||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"});},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):[];},nodesWithKeyClick:["input","button"],connect:function(obj,_15b,_15c){var d=dojo,dc=d._connect,_15d=[];if(_15b=="ondijitclick"){if(dojo.indexOf(this.nodesWithKeyClick,obj.nodeName.toLowerCase())==-1){var m=d.hitch(this,_15c);_15d.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;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);}}));}_15b="onclick";}_15d.push(dc(obj,_15b,this,_15c));this._connects.push(_15d);return _15d;},disconnect:function(_15e){for(var i=0;i<this._connects.length;i++){if(this._connects[i]==_15e){dojo.forEach(_15e,dojo.disconnect);this._connects.splice(i,1);return;}}},subscribe:function(_15f,_160){var d=dojo,_161=d.subscribe(_15f,this,_160);this._subscribes.push(_161);return _161;},unsubscribe:function(_162){for(var i=0;i<this._subscribes.length;i++){if(this._subscribes[i]==_162){dojo.unsubscribe(_162);this._subscribes.splice(i,1);return;}}},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):dojo._isBodyLtr();},isFocusable:function(){return this.focus&&(dojo.style(this.domNode,"display")!="none");},placeAt:function(_163,_164){if(_163.declaredClass&&_163.addChild){_163.addChild(this,_164);}else{dojo.place(this.domNode,_163,_164);}return this;},_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.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(_165,map,_166,_167){_167=_167||dojo.global;_166=_166?dojo.hitch(_167,_166):function(v){return v;};return _165.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_168,key,_169){var _16a=dojo.getObject(key,false,map);if(_169){_16a=dojo.getObject(_169,false,_167).call(_167,_16a,key);}return _166(_16a,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");(function(){var _16b={};dojo.cache=function(_16c,url,_16d){if(typeof _16c=="string"){var _16e=dojo.moduleUrl(_16c,url);}else{_16e=_16c;_16d=url;}var key=_16e.toString();var val=_16d;if(_16d!=undefined&&!dojo.isString(_16d)){val=("value" in _16d?_16d.value:undefined);}var _16f=_16d&&_16d.sanitize?true:false;if(typeof val=="string"){val=_16b[key]=_16f?dojo.cache._sanitize(val):val;}else{if(val===null){delete _16b[key];}else{if(!(key in _16b)){val=dojo._getText(key);_16b[key]=_16f?dojo.cache._sanitize(val):val;}val=_16b[key];}}return val;};dojo.cache._sanitize=function(val){if(val){val=val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _170=val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_170){val=_170[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=[];},_stringRepl:function(tmpl){var _171=this.declaredClass,_172=this;return dojo.string.substitute(tmpl,this,function(_173,key){if(key.charAt(0)=="!"){_173=dojo.getObject(key.substr(1),false,_172);}if(typeof _173=="undefined"){throw new Error(_171+" template:"+key);}if(_173==null){return "";}return key.charAt(0)=="!"?_173:_173.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){var _174=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);var node;if(dojo.isString(_174)){node=dojo._toDom(this._stringRepl(_174));if(node.nodeType!=1){throw new Error("Invalid template: "+_174);}}else{node=_174.cloneNode(true);}this.domNode=node;this._attachTemplateNodes(node);if(this.widgetsInTemplate){var _175=dojo.parser,qry,attr;if(_175._query!="[dojoType]"){qry=_175._query;attr=_175._attrName;_175._query="[dojoType]";_175._attrName="dojoType";}var cw=(this._startupWidgets=dojo.parser.parse(node,{noStart:!this._earlyTemplatedStartup,inherited:{dir:this.dir,lang:this.lang}}));if(qry){_175._query=qry;_175._attrName=attr;}this._supportingWidgets=dijit.findWidgets(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}this._fillContent(this.srcNodeRef);},_fillContent:function(_176){var dest=this.containerNode;if(_176&&dest){while(_176.hasChildNodes()){dest.appendChild(_176.firstChild);}}},_attachTemplateNodes:function(_177,_178){_178=_178||function(n,p){return n.getAttribute(p);};var _179=dojo.isArray(_177)?_177:(_177.all||_177.getElementsByTagName("*"));var x=dojo.isArray(_177)?0:-1;for(;x<_179.length;x++){var _17a=(x==-1)?_177:_179[x];if(this.widgetsInTemplate&&_178(_17a,"dojoType")){continue;}var _17b=_178(_17a,"dojoAttachPoint");if(_17b){var _17c,_17d=_17b.split(/\s*,\s*/);while((_17c=_17d.shift())){if(dojo.isArray(this[_17c])){this[_17c].push(_17a);}else{this[_17c]=_17a;}this._attachPoints.push(_17c);}}var _17e=_178(_17a,"dojoAttachEvent");if(_17e){var _17f,_180=_17e.split(/\s*,\s*/);var trim=dojo.trim;while((_17f=_180.shift())){if(_17f){var _181=null;if(_17f.indexOf(":")!=-1){var _182=_17f.split(":");_17f=trim(_182[0]);_181=trim(_182[1]);}else{_17f=trim(_17f);}if(!_181){_181=_17f;}this.connect(_17a,_17f,_181);}}}var role=_178(_17a,"waiRole");if(role){dijit.setWaiRole(_17a,role);}var _183=_178(_17a,"waiState");if(_183){dojo.forEach(_183.split(/\s*,\s*/),function(_184){if(_184.indexOf("-")!=-1){var pair=_184.split("-");dijit.setWaiState(_17a,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(_185){delete this[_185];},this);this._attachPoints=[];this.inherited(arguments);}});dijit._Templated._templateCache={};dijit._Templated.getCachedTemplate=function(_186,_187,_188){var _189=dijit._Templated._templateCache;var key=_187||_186;var _18a=_189[key];if(_18a){try{if(!_18a.ownerDocument||_18a.ownerDocument==dojo.doc){return _18a;}}catch(e){}dojo.destroy(_18a);}if(!_187){_187=dojo.cache(_186,{sanitize:true});}_187=dojo.string.trim(_187);if(_188||_187.match(/\$\{([^\}]+)\}/g)){return (_189[key]=_187);}else{var node=dojo._toDom(_187);if(node.nodeType!=1){throw new Error("Invalid template: "+_187);}return (_189[key]=node);}};if(dojo.isIE){dojo.addOnWindowUnload(function(){var _18b=dijit._Templated._templateCache;for(var key in _18b){var _18c=_18b[key];if(typeof _18c=="object"){dojo.destroy(_18c);}delete _18b[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(_18d,_18e){var _18f=this.containerNode;if(_18e&&typeof _18e=="number"){var _190=this.getChildren();if(_190&&_190.length>=_18e){_18f=_190[_18e-1].domNode;_18e="after";}}dojo.place(_18d.domNode,_18f,_18e);if(this._started&&!_18d._started){_18d.startup();}},removeChild:function(_191){if(typeof _191=="number"&&_191>0){_191=this.getChildren()[_191];}if(_191){var node=_191.domNode;if(node&&node.parentNode){node.parentNode.removeChild(node);}}},hasChildren:function(){return this.getChildren().length>0;},destroyDescendants:function(_192){dojo.forEach(this.getChildren(),function(_193){_193.destroyRecursive(_192);});},_getSiblingOfChild:function(_194,dir){var node=_194.domNode,_195=(dir>0?"nextSibling":"previousSibling");do{node=node[_195];}while(node&&(node.nodeType!=1||!dijit.byNode(node)));return node&&dijit.byNode(node);},getIndexOfChild:function(_196){return dojo.indexOf(this.getChildren(),_196);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_197){_197.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 _198=dijit.getEnclosingWidget(this.domNode.parentNode);return _198&&_198.isContainer?_198:null;},_getSibling:function(_199){var node=this.domNode;do{node=node[_199+"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,postCreate:function(){dojo.addClass(this.domNode,"dijitContainer");this.inherited(arguments);},startup:function(){if(this._started){return;}this.inherited(arguments);var _19a=this.getParent&&this.getParent();if(!(_19a&&_19a.isLayoutContainer)){this.resize();this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){this.resize();});}},resize:function(_19b,_19c){var node=this.domNode;if(_19b){dojo.marginBox(node,_19b);if(_19b.t){node.style.top=_19b.t+"px";}if(_19b.l){node.style.left=_19b.l+"px";}}var mb=_19c||{};dojo.mixin(mb,_19b||{});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(_19d){dojo.addClass(_19d.domNode,this.baseClass+"-child");if(_19d.baseClass){dojo.addClass(_19d.domNode,this.baseClass+"-"+_19d.baseClass);}},addChild:function(_19e,_19f){this.inherited(arguments);if(this._started){this._setupChild(_19e);}},removeChild:function(_1a0){dojo.removeClass(_1a0.domNode,this.baseClass+"-child");if(_1a0.baseClass){dojo.removeClass(_1a0.domNode,this.baseClass+"-"+_1a0.baseClass);}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 _1a1=function(word){return word.substring(0,1).toUpperCase()+word.substring(1);};var size=function(_1a2,dim){_1a2.resize?_1a2.resize(dim):dojo.marginBox(_1a2.domNode,dim);dojo.mixin(_1a2,dojo.marginBox(_1a2.domNode));dojo.mixin(_1a2,dim);};dijit.layout.layoutChildren=function(_1a3,dim,_1a4){dim=dojo.mixin({},dim);dojo.addClass(_1a3,"dijitLayoutContainer");_1a4=dojo.filter(_1a4,function(item){return item.layoutAlign!="client";}).concat(dojo.filter(_1a4,function(item){return item.layoutAlign=="client";}));dojo.forEach(_1a4,function(_1a5){var elm=_1a5.domNode,pos=_1a5.layoutAlign;var _1a6=elm.style;_1a6.left=dim.l+"px";_1a6.top=dim.t+"px";_1a6.bottom=_1a6.right="auto";dojo.addClass(elm,"dijitAlign"+_1a1(pos));if(pos=="top"||pos=="bottom"){size(_1a5,{w:dim.w});dim.h-=_1a5.h;if(pos=="top"){dim.t+=_1a5.h;}else{_1a6.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){size(_1a5,{h:dim.h});dim.w-=_1a5.w;if(pos=="left"){dim.l+=_1a5.w;}else{_1a6.left=dim.l+dim.w+"px";}}else{if(pos=="client"){size(_1a5,dim);}}}});};})();}if(!dojo._hasResource["dijit._CssStateMixin"]){dojo._hasResource["dijit._CssStateMixin"]=true;dojo.provide("dijit._CssStateMixin");dojo.declare("dijit._CssStateMixin",[],{cssStateNodes:{},postCreate:function(){this.inherited(arguments);dojo.forEach(["onmouseenter","onmouseleave","onmousedown"],function(e){this.connect(this.domNode,e,"_cssMouseEvent");},this);this.connect(this,"set",function(name,_1a7){if(arguments.length>=2&&{disabled:true,readOnly:true,checked:true,selected:true}[name]){this._setStateClass();}});dojo.forEach(["_onFocus","_onBlur"],function(ap){this.connect(this,ap,"_setStateClass");},this);for(var ap in this.cssStateNodes){this._trackMouseState(this[ap],this.cssStateNodes[ap]);}this._setStateClass();},_cssMouseEvent:function(_1a8){if(!this.disabled){switch(_1a8.type){case "mouseenter":case "mouseover":this._hovering=true;this._active=this._mouseDown;break;case "mouseleave":case "mouseout":this._hovering=false;this._active=false;break;case "mousedown":this._active=true;this._mouseDown=true;var _1a9=this.connect(dojo.body(),"onmouseup",function(){this._active=false;this._mouseDown=false;this._setStateClass();this.disconnect(_1a9);});break;}this._setStateClass();}},_setStateClass:function(){var _1aa=this.baseClass.split(" ");function _1ab(_1ac){_1aa=_1aa.concat(dojo.map(_1aa,function(c){return c+_1ac;}),"dijit"+_1ac);};if(!this.isLeftToRight()){_1ab("Rtl");}if(this.checked){_1ab("Checked");}if(this.state){_1ab(this.state);}if(this.selected){_1ab("Selected");}if(this.disabled){_1ab("Disabled");}else{if(this.readOnly){_1ab("ReadOnly");}else{if(this._active){_1ab("Active");}else{if(this._hovering){_1ab("Hover");}}}}if(this._focused){_1ab("Focused");}var tn=this.stateNode||this.domNode,_1ad={};dojo.forEach(tn.className.split(" "),function(c){_1ad[c]=true;});if("_stateClasses" in this){dojo.forEach(this._stateClasses,function(c){delete _1ad[c];});}dojo.forEach(_1aa,function(c){_1ad[c]=true;});var _1ae=[];for(var c in _1ad){_1ae.push(c);}tn.className=_1ae.join(" ");this._stateClasses=_1aa;},_trackMouseState:function(node,_1af){var _1b0=false,_1b1=false,_1b2=false;var self=this,cn=dojo.hitch(this,"connect",node);function _1b3(){var _1b4=("disabled" in self&&self.disabled)||("readonly" in self&&self.readonly);dojo.toggleClass(node,_1af+"Hover",_1b0&&!_1b1&&!_1b4);dojo.toggleClass(node,_1af+"Active",_1b1&&!_1b4);dojo.toggleClass(node,_1af+"Focused",_1b2&&!_1b4);};cn("onmouseenter",function(){_1b0=true;_1b3();});cn("onmouseleave",function(){_1b0=false;_1b1=false;_1b3();});cn("onmousedown",function(){_1b1=true;_1b3();});cn("onmouseup",function(){_1b1=false;_1b3();});cn("onfocus",function(){_1b2=true;_1b3();});cn("onblur",function(){_1b2=false;_1b3();});this.connect(this,"set",function(name,_1b5){if(name=="disabled"||name=="readOnly"){_1b3();}});}});}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(_1b6){this.disabled=_1b6;dojo.attr(this.focusNode,"disabled",_1b6);if(this.valueNode){dojo.attr(this.valueNode,"disabled",_1b6);}dijit.setWaiState(this.focusNode,"disabled",_1b6);if(_1b6){this._hovering=false;this._active=false;var _1b7="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:"focusNode";dojo.forEach(dojo.isArray(_1b7)?_1b7:[_1b7],function(_1b8){var node=this[_1b8];if(dojo.isWebKit||dijit.hasDefaultTabStop(node)){node.setAttribute("tabIndex","-1");}else{node.removeAttribute("tabIndex");}},this);}else{this.focusNode.setAttribute("tabIndex",this.tabIndex);}},setDisabled:function(_1b9){dojo.deprecated("setDisabled("+_1b9+") is deprecated. Use set('disabled',"+_1b9+") instead.","","2.0");this.set("disabled",_1b9);},_onFocus:function(e){if(this.scrollOnFocus){dojo.window.scrollIntoView(this.domNode);}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&!this.readOnly&&this.focusNode&&(dojo.style(this.domNode,"display")!="none");},focus:function(){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(_1ba){},_onChangeActive:false,_handleOnChange:function(_1bb,_1bc){this._lastValue=_1bb;if(this._lastValueReported==undefined&&(_1bc===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_1bb;}if((this.intermediateChanges||_1bc||_1bc===undefined)&&((typeof _1bb!=typeof this._lastValueReported)||this.compare(_1bb,this._lastValueReported)!=0)){this._lastValueReported=_1bb;if(this._onChangeActive){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);}this._onChangeHandle=setTimeout(dojo.hitch(this,function(){this._onChangeHandle=null;this.onChange(_1bb);}),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(_1bd){dojo.deprecated("dijit.form._FormWidget:setValue("+_1bd+") is deprecated. Use set('value',"+_1bd+") instead.","","2.0");this.set("value",_1bd);},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&&this.isFocusable()){var _1be=this.connect(dojo.body(),"onmouseup",function(){if(this.isFocusable()){this.focus();}this.disconnect(_1be);});}}});dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"",readOnly:"focusNode"}),_setReadOnlyAttr:function(_1bf){this.readOnly=_1bf;dojo.attr(this.focusNode,"readOnly",_1bf);dijit.setWaiState(this.focusNode,"readonly",_1bf);},postCreate:function(){this.inherited(arguments);if(dojo.isIE){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._resetValue=this.value;}},_setValueAttr:function(_1c0,_1c1){this.value=_1c0;this._handleOnChange(_1c0,_1c1);},_getValueAttr:function(){return this._lastValue;},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 _1c2=this.domNode;var _1c3=_1c2.parentNode;var _1c4=_1c2.firstChild||_1c2;var _1c5=_1c4.style.filter;var _1c6=this;while(_1c3&&_1c3.clientHeight==0){(function ping(){var _1c7=_1c6.connect(_1c3,"onscroll",function(e){_1c6.disconnect(_1c7);_1c4.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_1c4.style.filter=_1c5;},0);});})();_1c3=_1c3.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 _1c8=this;dojo.mixin(_1c8,args);_1c8.node=args.node;_1c8._showArgs=dojo.mixin({},args);_1c8._showArgs.node=_1c8.node;_1c8._showArgs.duration=_1c8.showDuration;_1c8.showAnim=_1c8.showFunc(_1c8._showArgs);_1c8._hideArgs=dojo.mixin({},args);_1c8._hideArgs.node=_1c8.node;_1c8._hideArgs.duration=_1c8.hideDuration;_1c8.hideAnim=_1c8.hideFunc(_1c8._hideArgs);dojo.connect(_1c8.showAnim,"beforeBegin",dojo.hitch(_1c8.hideAnim,"stop",true));dojo.connect(_1c8.hideAnim,"beforeBegin",dojo.hitch(_1c8.showAnim,"stop",true));},show:function(_1c9){return this.showAnim.play(_1c9||0);},hide:function(_1ca){return this.hideAnim.play(_1ca||0);}});}if(!dojo._hasResource["dojo.fx"]){dojo._hasResource["dojo.fx"]=true;dojo.provide("dojo.fx");(function(){var d=dojo,_1cb={_fire:function(evt,args){if(this[evt]){this[evt].apply(this,args||[]);}return this;}};var _1cc=function(_1cd){this._index=-1;this._animations=_1cd||[];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(_1cc,{_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(_1ce,_1cf){if(!this._current){this._current=this._animations[this._index=0];}if(!_1cf&&this._current.status()=="playing"){return this;}var _1d0=d.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_1d1=d.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_1d2=d.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);d.disconnect(_1d0);d.disconnect(_1d1);d.disconnect(_1d2);});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(_1d3,_1d4){this.pause();var _1d5=this.duration*_1d3;this._current=null;d.some(this._animations,function(a){if(a.duration<=_1d5){this._current=a;return true;}_1d5-=a.duration;return false;});if(this._current){this._current.gotoPercent(_1d5/this._current.duration,_1d4);}return this;},stop:function(_1d6){if(this._current){if(_1d6){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(_1cc,_1cb);dojo.fx.chain=function(_1d7){return new _1cc(_1d7);};var _1d8=function(_1d9){this._animations=_1d9||[];this._connects=[];this._finished=0;this.duration=0;d.forEach(_1d9,function(a){var _1da=a.duration;if(a.delay){_1da+=a.delay;}if(this.duration<_1da){this.duration=_1da;}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(_1d8,{_doAction:function(_1db,args){d.forEach(this._animations,function(a){a[_1db].apply(a,args);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_1dc,args){var t=this._pseudoAnimation;t[_1dc].apply(t,args);},play:function(_1dd,_1de){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(_1df,_1e0){var ms=this.duration*_1df;d.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_1e0);});this._call("gotoPercent",arguments);return this;},stop:function(_1e1){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(_1d8,_1cb);dojo.fx.combine=function(_1e2){return new _1d8(_1e2);};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 _1e3=d.style(node,"height");return Math.max(_1e3,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,_1e4,args){args=args||{};var a=dojo.fx.combine(this.map(function(item){var _1e5={node:item};dojo.mixin(_1e5,args);return obj[_1e4](_1e5);}));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(_1e6,_1e7,_1e8,_1e9,_1ea){var _1eb=dojo.fx.combine(this.map(function(item){return dojo.animateProperty({node:item,properties:_1e6,duration:_1e7||350,easing:_1e8});}));if(_1e9){dojo.connect(_1eb,"onEnd",_1e9);}return _1eb.play(_1ea||0);}});}if(!dojo._hasResource["dojo.colors"]){dojo._hasResource["dojo.colors"]=true;dojo.provide("dojo.colors");(function(){var _1ec=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(_1ed,obj){var m=_1ed.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=[_1ec(m1,m2,H+1/3)*256,_1ec(m1,m2,H)*256,_1ec(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,obj);}}return null;};var _1ee=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(_1ee(t.r,0,255));t.g=Math.round(_1ee(t.g,0,255));t.b=Math.round(_1ee(t.b,0,255));t.a=_1ee(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.i18n.getLocalization=function(_1ef,_1f0,_1f1){_1f1=dojo.i18n.normalizeLocale(_1f1);var _1f2=_1f1.split("-");var _1f3=[_1ef,"nls",_1f0].join(".");var _1f4=dojo._loadedModules[_1f3];if(_1f4){var _1f5;for(var i=_1f2.length;i>0;i--){var loc=_1f2.slice(0,i).join("_");if(_1f4[loc]){_1f5=_1f4[loc];break;}}if(!_1f5){_1f5=_1f4.ROOT;}if(_1f5){var _1f6=function(){};_1f6.prototype=_1f5;return new _1f6();}}throw new Error("Bundle not found: "+_1f0+" in "+_1ef+" , locale="+_1f1);};dojo.i18n.normalizeLocale=function(_1f7){var _1f8=_1f7?_1f7.toLowerCase():dojo.locale;if(_1f8=="root"){_1f8="ROOT";}return _1f8;};dojo.i18n._requireLocalization=function(_1f9,_1fa,_1fb,_1fc){var _1fd=dojo.i18n.normalizeLocale(_1fb);var _1fe=[_1f9,"nls",_1fa].join(".");var _1ff="";if(_1fc){var _200=_1fc.split(",");for(var i=0;i<_200.length;i++){if(_1fd["indexOf"](_200[i])==0){if(_200[i].length>_1ff.length){_1ff=_200[i];}}}if(!_1ff){_1ff="ROOT";}}var _201=_1fc?_1ff:_1fd;var _202=dojo._loadedModules[_1fe];var _203=null;if(_202){if(dojo.config.localizationComplete&&_202._built){return;}var _204=_201.replace(/-/g,"_");var _205=_1fe+"."+_204;_203=dojo._loadedModules[_205];}if(!_203){_202=dojo["provide"](_1fe);var syms=dojo._getModuleSymbols(_1f9);var _206=syms.concat("nls").join("/");var _207;dojo.i18n._searchLocalePath(_201,_1fc,function(loc){var _208=loc.replace(/-/g,"_");var _209=_1fe+"."+_208;var _20a=false;if(!dojo._loadedModules[_209]){dojo["provide"](_209);var _20b=[_206];if(loc!="ROOT"){_20b.push(loc);}_20b.push(_1fa);var _20c=_20b.join("/")+".js";_20a=dojo._loadPath(_20c,null,function(hash){var _20d=function(){};_20d.prototype=_207;_202[_208]=new _20d();for(var j in hash){_202[_208][j]=hash[j];}});}else{_20a=true;}if(_20a&&_202[_208]){_207=_202[_208];}else{_202[_208]=_207;}if(_1fc){return true;}});}if(_1fc&&_1fd!=_1ff){_202[_1fd.replace(/-/g,"_")]=_202[_1ff.replace(/-/g,"_")];}};(function(){var _20e=dojo.config.extraLocale;if(_20e){if(!_20e instanceof Array){_20e=[_20e];}var req=dojo.i18n._requireLocalization;dojo.i18n._requireLocalization=function(m,b,_20f,_210){req(m,b,_20f,_210);if(_20f){return;}for(var i=0;i<_20e.length;i++){req(m,b,_20e[i],_210);}};}})();dojo.i18n._searchLocalePath=function(_211,down,_212){_211=dojo.i18n.normalizeLocale(_211);var _213=_211.split("-");var _214=[];for(var i=_213.length;i>0;i--){_214.push(_213.slice(0,i).join("-"));}_214.push(false);if(down){_214.reverse();}for(var j=_214.length-1;j>=0;j--){var loc=_214[j]||"ROOT";var stop=_212(loc);if(stop){break;}}};dojo.i18n._preloadLocalizations=function(_215,_216){function _217(_218){_218=dojo.i18n.normalizeLocale(_218);dojo.i18n._searchLocalePath(_218,true,function(loc){for(var i=0;i<_216.length;i++){if(_216[i]==loc){dojo["require"](_215+"_"+loc);return true;}}return false;});};_217();var _219=dojo.config.extraLocale||[];for(var i=0;i<_219.length;i++){_217(_219[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(_21a,_21b){this._cells=[];var url=this._blankGif;var _21c=dojo.getObject(this.dyeClass);for(var row=0;row<_21a.length;row++){var _21d=dojo.create("tr",{tabIndex:"-1"},this.gridNode);for(var col=0;col<_21a[row].length;col++){var _21e=_21a[row][col];if(_21e){var _21f=new _21c(_21e);var _220=dojo.create("td",{"class":this.cellClass,tabIndex:"-1",title:_21b[_21e]});_21f.fillCell(_220,url);this.connect(_220,"ondijitclick","_onCellClick");this._trackMouseState(_220,this.cellClass);dojo.place(_220,_21d);_220.index=this._cells.length;this._cells.push({node:_220,dye:_21f});}}}this._xDim=_21a[0].length;this._yDim=_21a.length;var _221={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};for(var key in _221){this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _222=_221[key];return function(_223){this._navigateByKey(_222,_223);};}(),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 _224=evt.currentTarget,_225=this._getDye(_224).getValue();this._setCurrent(_224);setTimeout(dojo.hitch(this,function(){dijit.focus(_224);this._setValueAttr(_225,true);}));dojo.removeClass(_224,"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(_226,_227){this.value=null;if(this._selectedCell>=0){dojo.removeClass(this._cells[this._selectedCell].node,"dijitPaletteCellSelected");}this._selectedCell=-1;if(_226){for(var i=0;i<this._cells.length;i++){if(_226==this._cells[i].dye.getValue()){this._selectedCell=i;this.value=_226;dojo.addClass(this._cells[i].node,"dijitPaletteCellSelected");if(_227||_227===undefined){this.onChange(_226);}break;}}}},onChange:function(_228){},_navigateByKey:function(_229,_22a){if(_22a==-1){return;}var _22b=this._currentFocus.index+_229;if(_22b<this._cells.length&&_22b>-1){var _22c=this._cells[_22b].node;this._setCurrent(_22c);setTimeout(dojo.hitch(dijit,"focus",_22c),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"]]},_imagePaths:{"7x10":dojo.moduleUrl("dijit.themes","a11y/colors7x10.png"),"3x4":dojo.moduleUrl("dijit.themes","a11y/colors3x4.png"),"7x10-rtl":dojo.moduleUrl("dijit.themes","a11y/colors7x10-rtl.png"),"3x4-rtl":dojo.moduleUrl("dijit.themes","a11y/colors3x4-rtl.png")},templateString:dojo.cache("dijit","templates/ColorPalette.html","<div class=\"dijitInline dijitColorPalette\">\n\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\" alt=\"\"/>\n\t<table class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\">\n\t\t<tbody dojoAttachPoint=\"gridNode\"></tbody>\n\t</table>\n</div>\n"),baseClass:"dijitColorPalette",dyeClass:"dijit._Color",buildRendering:function(){this.inherited(arguments);this.imageNode.setAttribute("src",this._imagePaths[this.palette+(this.isLeftToRight()?"":"-rtl")].toString());var _22d=dojo.i18n.getLocalization("dojo","colors",this.lang);this._preparePalette(this._palettes[this.palette],_22d);}});dojo.declare("dijit._Color",dojo.Color,{constructor:function(_22e){this._alias=_22e;this.setColor(dojo.Color.named[_22e]);},getValue:function(){return this.toHex();},fillCell:function(cell,_22f){dojo.create("img",{src:_22f,"class":"dijitPaletteImg",alt:this._alias},cell);}});}if(!dojo._hasResource["dojo.dnd.common"]){dojo._hasResource["dojo.dnd.common"]=true;dojo.provide("dojo.dnd.common");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.dnd.getViewport=function(){var d=dojo.doc,dd=d.documentElement,w=window,b=dojo.body();if(dojo.isMozilla){return {w:dd.clientWidth,h:w.innerHeight};}else{if(!dojo.isOpera&&w.innerWidth){return {w:w.innerWidth,h:w.innerHeight};}else{if(!dojo.isOpera&&dd&&dd.clientWidth){return {w:dd.clientWidth,h:dd.clientHeight};}else{if(b.clientWidth){return {w:b.clientWidth,h:b.clientHeight};}}}}return null;};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.dnd.getViewport(),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 _230=n.scrollLeft,_231=n.scrollTop;n.scrollLeft=n.scrollLeft+dx;n.scrollTop=n.scrollTop+dy;if(_230!=n.scrollLeft||_231!=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);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=this.host=host,d=node.ownerDocument,_232=dojo.connect(d,"onmousemove",this,"onFirstMove");this.events=[dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent),_232];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.pop());},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,_233){this.node=dojo.byId(node);if(!_233){_233={};}this.handle=_233.handle?dojo.byId(_233.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_233.delay>0?_233.delay:0;this.skip=_233.skip;this.mover=_233.mover?_233.mover:dojo.dnd.Mover;this.events=[dojo.connect(this.handle,"onmousedown",this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_234,node){return new dojo.dnd.Moveable(node,_234);},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,"onmouseup",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(_235){dojo.publish("/dnd/move/start",[_235]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_236){dojo.publish("/dnd/move/stop",[_236]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_237,e){},onMove:function(_238,_239,e){this.onMoving(_238,_239);var s=_238.node.style;s.left=_239.l+"px";s.top=_239.t+"px";this.onMoved(_238,_239);},onMoving:function(_23a,_23b){},onMoved:function(_23c,_23d){}});}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(_23e,node){return new dojo.dnd.move.constrainedMoveable(node,_23e);},constructor:function(node,_23f){if(!_23f){_23f={};}this.constraints=_23f.constraints;this.within=_23f.within;},onFirstMove:function(_240){var c=this.constraintBox=this.constraints.call(this,_240);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo.marginBox(_240.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_241,_242){var c=this.constraintBox,s=_241.node.style;s.left=(_242.l<c.l?c.l:c.r<_242.l?c.r:_242.l)+"px";s.top=(_242.t<c.t?c.t:c.b<_242.t?c.b:_242.t)+"px";}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_243,node){return new dojo.dnd.move.boxConstrainedMoveable(node,_243);},constructor:function(node,_244){var box=_244&&_244.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_245,node){return new dojo.dnd.move.parentConstrainedMoveable(node,_245);},constructor:function(node,_246){var area=_246&&_246.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.move.constrainedMover=function(fun,_247){dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");var _248=function(node,e,_249){dojo.dnd.Mover.call(this,node,e,_249);};dojo.extend(_248,dojo.dnd.Mover.prototype);dojo.extend(_248,{onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox,c=this.constraintBox,l=m.l+e.pageX,t=m.t+e.pageY;l=l<c.l?c.l:c.r<l?c.r:l;t=t<c.t?c.t:c.b<t?c.b:t;this.host.onMove(this,{l:l,t:t});},onFirstMove:function(){dojo.dnd.Mover.prototype.onFirstMove.call(this);var c=this.constraintBox=fun.call(this);c.r=c.l+c.w;c.b=c.t+c.h;if(_247){var mb=dojo.marginBox(this.node);c.r-=mb.w;c.b-=mb.h;}}});return _248;};dojo.dnd.move.boxConstrainedMover=function(box,_24a){dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");return dojo.dnd.move.constrainedMover(function(){return box;},_24a);};dojo.dnd.move.parentConstrainedMover=function(area,_24b){dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");var fun=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;};return dojo.dnd.move.constrainedMover(fun,_24b);};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 _24c=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(node,_24d){if(!_24d){_24d={};}if(_24d.timeout&&typeof _24d.timeout=="number"&&_24d.timeout>=0){this.timeout=_24d.timeout;}},markupFactory:function(_24e,node){return new dojo.dnd.TimedMoveable(node,_24e);},onMoveStop:function(_24f){if(_24f._timer){clearTimeout(_24f._timer);_24c.call(this,_24f,_24f._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_250,_251){_250._leftTop=_251;if(!_250._timer){var _252=this;_250._timer=setTimeout(function(){_250._timer=null;_24c.call(_252,_250,_250._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,{reset:function(){dojo.forEach(this.getDescendants(),function(_253){if(_253.reset){_253.reset();}});},validate:function(){var _254=false;return dojo.every(dojo.map(this.getDescendants(),function(_255){_255._hasBeenBlurred=true;var _256=_255.disabled||!_255.validate||_255.validate();if(!_256&&!_254){dojo.window.scrollIntoView(_255.containerNode||_255.domNode);_255.focus();_254=true;}return _256;}),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(_257){if(!_257.name){return;}var _258=map[_257.name]||(map[_257.name]=[]);_258.push(_257);});for(var name in map){if(!map.hasOwnProperty(name)){continue;}var _259=map[name],_25a=dojo.getObject(name,false,obj);if(_25a===undefined){continue;}if(!dojo.isArray(_25a)){_25a=[_25a];}if(typeof _259[0].checked=="boolean"){dojo.forEach(_259,function(w,i){w.set("value",dojo.indexOf(_25a,w.value)!=-1);});}else{if(_259[0].multiple){_259[0].set("value",_25a);}else{dojo.forEach(_259,function(w,i){w.set("value",_25a[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(_25b){var name=_25b.name;if(!name||_25b.disabled){return;}var _25c=_25b.get("value");if(typeof _25b.checked=="boolean"){if(/Radio/.test(_25b.declaredClass)){if(_25c!==false){dojo.setObject(name,_25c,obj);}else{_25c=dojo.getObject(name,false,obj);if(_25c===undefined){dojo.setObject(name,null,obj);}}}else{var ary=dojo.getObject(name,false,obj);if(!ary){ary=[];dojo.setObject(name,ary,obj);}if(_25c!==false){ary.push(_25c);}}}else{var prev=dojo.getObject(name,false,obj);if(typeof prev!="undefined"){if(dojo.isArray(prev)){prev.push(_25c);}else{dojo.setObject(name,[prev,_25c],obj);}}else{dojo.setObject(name,_25c,obj);}}});return obj;},isValid:function(){this._invalidWidgets=dojo.filter(this.getDescendants(),function(_25d){return !_25d.disabled&&_25d.isValid&&!_25d.isValid();});return !this._invalidWidgets.length;},onValidStateChange:function(_25e){},_widgetChange:function(_25f){var _260=this._lastValidState;if(!_25f||this._lastValidState===undefined){_260=this.isValid();if(this._lastValidState===undefined){this._lastValidState=_260;}}else{if(_25f.isValid){this._invalidWidgets=dojo.filter(this._invalidWidgets||[],function(w){return (w!=_25f);},this);if(!_25f.isValid()&&!_25f.get("disabled")){this._invalidWidgets.push(_25f);}_260=(this._invalidWidgets.length===0);}}if(_260!==this._lastValidState){this._lastValidState=_260;this.onValidStateChange(_260);}},connectChildren:function(){dojo.forEach(this._changeConnections,dojo.hitch(this,"disconnect"));var _261=this;var _262=(this._changeConnections=[]);dojo.forEach(dojo.filter(this.getDescendants(),function(item){return item.validate;}),function(_263){_262.push(_261.connect(_263,"validate",dojo.hitch(_261,"_widgetChange",_263)));_262.push(_261.connect(_263,"_setDisabledAttr",dojo.hitch(_261,"_widgetChange",_263)));});this._widgetChange(null);},startup:function(){this.inherited(arguments);this._changeConnections=[];this.connectChildren();}});}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(_264){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.get("value"));},_getFocusItems:function(_265){var _266=dijit._getTabNavigable(dojo.byId(_265));this._firstFocusItem=_266.lowest||_266.first||_265;this._lastFocusItem=_266.last||_266.highest||this._firstFocusItem;if(dojo.isMoz&&this._firstFocusItem.tagName.toLowerCase()=="input"&&dojo.getNodeProp(this._firstFocusItem,"type").toLowerCase()=="file"){dojo.attr(_265,"tabIndex","0");this._firstFocusItem=_265;}}});}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");},_setClassAttr:function(_267){this.node.className="dijitDialogUnderlay "+_267;},postCreate:function(){dojo.body().appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _268=dojo.window.getBox();os.top=_268.t+"px";os.left=_268.l+"px";is.width=_268.w+"px";is.height=_268.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();this.domNode.style.display="none";},uninitialize:function(){if(this.bgIframe){this.bgIframe.destroy();}this.inherited(arguments);}});}if(!dojo._hasResource["dojo.html"]){dojo._hasResource["dojo.html"]=true;dojo.provide("dojo.html");(function(){var _269=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 _26a=cont.length,i=0;i<cont.length;i=_26a==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,constructor:function(_26b,node){dojo.mixin(this,_26b||{});node=this.node=dojo.byId(this.node||node);if(!this.id){this.id=["Setter",(node)?node.id||node.tagName:"",_269++].join("_");}},set:function(cont,_26c){if(undefined!==cont){this.content=cont;}if(_26c){this._mixin(_26c);}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 _26d=this.onContentError(e);try{node.innerHTML=_26d;}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 _26e=cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_26e){cont=_26e[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(_26f){var _270={},key;for(key in _26f){if(key in _270){continue;}this[key]=_26f[key];}},_parse:function(){var _271=this.node;try{this.parseResults=dojo.parser.parse({rootNode:_271,dir:this.dir,lang:this.lang});}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(type,err,_272){var _273=this["on"+type+"Error"].call(this,err);if(_272){console.error(_272,err);}else{if(_273){dojo.html._setNodeContent(this.node,_273,true);}}}});dojo.html.set=function(node,cont,_274){if(undefined==cont){console.warn("dojo.html.set: no cont argument provided, using empty string");cont="";}if(!_274){return dojo.html._setNodeContent(node,cont,true);}else{var op=new dojo.html._ContentSetter(dojo.mixin(_274,{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,{href:"",extractContent:false,parseOnLoad:true,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",doLayout:true,ioArgs:{},isContainer:true,isLayoutContainer:true,onLoadDeferred:null,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{title:[]}),postMixInProperties:function(){this.inherited(arguments);var _275=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_275);this.errorMessage=dojo.string.substitute(this.errorMessage,_275);if(!this.href&&this.srcNodeRef&&this.srcNodeRef.innerHTML){this.isLoaded=true;}},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},postCreate:function(){this.domNode.title="";if(!dojo.attr(this.domNode,"role")){dijit.setWaiRole(this.domNode,"group");}dojo.addClass(this.domNode,this.baseClass);},startup:function(){if(this._started){return;}var _276=dijit._Contained.prototype.getParent.call(this);this._childOfLayoutWidget=_276&&_276.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;if(this.isLoaded){dojo.forEach(this.getChildren(),function(_277){_277.startup();});}if(this._isShown()||this.preload){this._onShow();}this.inherited(arguments);},_checkIfSingleChild:function(){var _278=dojo.query("> *",this.containerNode).filter(function(node){return node.tagName!=="SCRIPT";}),_279=_278.filter(function(node){return dojo.hasAttr(node,"dojoType")||dojo.hasAttr(node,"widgetId");}),_27a=dojo.filter(_279.map(dijit.byNode),function(_27b){return _27b&&_27b.domNode&&_27b.resize;});if(_278.length==_279.length&&_27a.length==1){this._singleChild=_27a[0];}else{delete this._singleChild;}dojo.toggleClass(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},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.href=href;if(this._created&&(this.preload||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.href="";this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));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(_27c){if(this._beingDestroyed){return;}this.inherited(arguments);},resize:function(_27d,_27e){if(!this._wasShown){this._onShow();}this._resizeCalled=true;if(_27d){dojo.marginBox(this.domNode,_27d);}var cn=this.containerNode;if(cn===this.domNode){var mb=_27e||{};dojo.mixin(mb,_27d||{});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();},_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;return (node.style.display!="none")&&(node.style.visibility!="hidden")&&!dojo.hasClass(node,"dijitHidden");}}},_onShow:function(){if(this.href){if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){this.refresh();}}else{if(!this._childOfLayoutWidget&&this._needLayout){this._layoutChildren();}}this.inherited(arguments);this._wasShown=true;},refresh:function(){this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var self=this;var _27f={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(dojo.isObject(this.ioArgs)){dojo.mixin(_27f,this.ioArgs);}var hand=(this._xhrDfd=(this.ioMethod||dojo.xhrGet)(_27f));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.isLoaded=true;try{this.onLoadDeferred.callback(data);this.onLoad(data);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);}},_onUnloadHandler:function(){this.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 _280=this._contentSetter;dojo.forEach(this.getChildren(),function(_281){if(_281.destroyRecursive){_281.destroyRecursive();}});if(_280){dojo.forEach(_280.parseResults,function(_282){if(_282.destroyRecursive&&_282.domNode&&_282.domNode.parentNode==dojo.body()){_282.destroyRecursive();}});delete _280.parseResults;}dojo.html._emptyNode(this.containerNode);delete this._singleChild;},_setContent:function(cont,_283){this.destroyDescendants();var _284=this._contentSetter;if(!(_284&&_284 instanceof dojo.html._ContentSetter)){_284=this._contentSetter=new dojo.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){var _285=this.onContentError(e);try{this.containerNode.innerHTML=_285;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _286=dojo.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:this.parseOnLoad,dir:this.dir,lang:this.lang},this._contentSetterParams||{});dojo.mixin(_284,_286);_284.set((dojo.isObject(cont)&&cont.domNode)?cont.domNode:cont);delete this._contentSetterParams;if(!_283){dojo.forEach(this.getChildren(),function(_287){if(!this.parseOnLoad||_287.getParent){_287.startup();}},this);this._scheduleLayout();this._onLoadHandler(cont);}},_onError:function(type,err,_288){this.onLoadDeferred.errback(err);var _289=this["on"+type+"Error"].call(this,err);if(_288){console.error(_288,err);}else{if(_289){this._setContent(_289,true);}}},_scheduleLayout:function(){if(this._isShown()){this._layoutChildren();}else{this._needLayout=true;}},_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(_28a){if(_28a.resize){_28a.resize();}});}delete this._needLayout;},onLoad:function(data){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(_28b){},onDownloadError:function(_28c){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 waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presentation\"></div>\n</div>\n"),postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");this.containerNode.title=this.title;},orient:function(node,_28d,_28e){var c=this._currentOrientClass;if(c){dojo.removeClass(this.domNode,c);}c="dijitTooltipAB"+(_28e.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_28e.charAt(0)=="T"?"Below":"Above");dojo.addClass(this.domNode,c);this._currentOrientClass=c;},onOpen:function(pos){this.orient(this.domNode,pos.aroundCorner,pos.corner);this._onShow();if(this.autofocus){this._getFocusItems(this.containerNode);dijit.focus(this._firstFocusItem);}},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 _28f=(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(!_28f){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_28f){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\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"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=\"onclick: onCancel\" title=\"${buttonCancel}\">\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 _290=dojo.i18n.getLocalization("dijit","common");dojo.mixin(this,_290);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){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});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(" ")};this._fadeIn=dojo.fadeIn({node:node,duration:this.duration,beforeBegin:dojo.hitch(this,function(){var _291=dijit._underlay;if(!_291){_291=dijit._underlay=new dijit.DialogUnderlay(this.underlayAttrs);}else{_291.set(this.underlayAttrs);}var ds=dijit._dialogStack,_292=948+ds.length*2;if(ds.length==1){_291.show();}dojo.style(dijit._underlay.domNode,"zIndex",_292);dojo.style(this.domNode,"zIndex",_292+1);}),onEnd:dojo.hitch(this,function(){if(this.autofocus){this._getFocusItems(this.domNode);dijit.focus(this._firstFocusItem);}})});this._fadeOut=dojo.fadeOut({node:node,duration:this.duration,onEnd:dojo.hitch(this,function(){node.style.display="none";var ds=dijit._dialogStack;if(ds.length==0){dijit._underlay.hide();}else{dojo.style(dijit._underlay.domNode,"zIndex",948+ds.length*2);dijit._underlay.set(ds[ds.length-1].underlayAttrs);}if(this.refocus){var _293=this._savedFocus;if(ds.length>0){var pd=ds[ds.length-1];if(!dojo.isDescendant(_293.node,pd.domNode)){pd._getFocusItems(pd.domNode);_293=pd._firstFocusItem;}}dijit.focus(_293);}})});},uninitialize:function(){var _294=false;if(this._fadeIn&&this._fadeIn.status()=="playing"){_294=true;this._fadeIn.stop();}if(this._fadeOut&&this._fadeOut.status()=="playing"){_294=true;this._fadeOut.stop();}if((this.open||_294)&&!dijit._underlay._destroyed){dijit._underlay.hide();}if(this._moveable){this._moveable.destroy();}this.inherited(arguments);},_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.marginBox(this.domNode);var _295=dojo.window.getBox();if(mb.w>=_295.w||mb.h>=_295.h){var w=Math.min(mb.w,Math.floor(_295.w*0.75)),h=Math.min(mb.h,Math.floor(_295.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,_296=dojo.window.getBox(),p=this._relativePosition,bb=p?null:dojo._getBorderBox(node),l=Math.floor(_296.l+(p?p.x:(_296.w-bb.w)/2)),t=Math.floor(_296.t+(p?p.y:(_296.h-bb.h)/2));dojo.style(node,{left:l+"px",top:t+"px"});}},_onKey:function(evt){var ds=dijit._dialogStack;if(ds[ds.length-1]!=this){return;}if(evt.charOrCode){var dk=dojo.keys;var node=evt.target;if(evt.charOrCode===dk.TAB){this._getFocusItems(this.domNode);}var _297=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){if(!_297){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_297){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._alreadyInitialized){this._setup();this._alreadyInitialized=true;}if(this._fadeOut.status()=="playing"){this._fadeOut.stop();}this._modalconnects.push(dojo.connect(window,"onscroll",this,"layout"));this._modalconnects.push(dojo.connect(window,"onresize",this,function(){var _298=dojo.window.getBox();if(!this._oldViewport||_298.h!=this._oldViewport.h||_298.w!=this._oldViewport.w){this.layout();this._oldViewport=_298;}}));this._modalconnects.push(dojo.connect(dojo.doc.documentElement,"onkeypress",this,"_onKey"));dojo.style(this.domNode,{opacity:0,display:""});this.open=true;this._onShow();this._size();this._position();dijit._dialogStack.push(this);this._fadeIn.play();this._savedFocus=dijit.getFocus(this);},hide:function(){var ds=dijit._dialogStack;if(!this._alreadyInitialized||this!=ds[ds.length-1]){return;}if(this._fadeIn.status()=="playing"){this._fadeIn.stop();}ds.pop();this._fadeOut.play();if(this._scrollConnected){this._scrollConnected=false;}dojo.forEach(this._modalconnects,dojo.disconnect);this._modalconnects=[];if(this._relativePosition){delete this._relativePosition;}this.open=false;this.onHide();},layout:function(){if(this.domNode.style.display!="none"){if(dijit._underlay){dijit._underlay.layout();}this._position();}},destroy:function(){dojo.forEach(this._modalconnects,dojo.disconnect);if(this.refocus&&this.open){setTimeout(dojo.hitch(dijit,"focus",this._savedFocus),25);}this.inherited(arguments);}});dojo.declare("dijit.Dialog",[dijit.layout.ContentPane,dijit._DialogBase],{});dijit._dialogStack=[];}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;}this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseUp");this.toggleDropDown();},_onDropDownMouseUp:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _299=this.dropDown,_29a=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&&!_29a){if(dojo.hasClass(t,"dijitPopup")){_29a=true;}else{t=t.parentNode;}}if(_29a){t=e.target;if(_299.onItemClick){var _29b;while(t&&!(_29b=dijit.byNode(t))){t=t.parentNode;}if(_29b&&_29b.onClick&&_29b.getParent){_29b.getParent().onItemClick(_29b,e);}}return;}}}if(this._opened&&_299.focus){window.setTimeout(dojo.hitch(_299,"focus"),1);}},_onDropDownClick:function(e){if(this._stopClickEvents){dojo.stopEvent(e);}},_setupDropdown:function(){this._buttonNode=this._buttonNode||this.focusNode||this.domNode;this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;this._aroundNode=this._aroundNode||this.domNode;this.connect(this._buttonNode,"onmousedown","_onDropDownMouseDown");this.connect(this._buttonNode,"onclick","_onDropDownClick");this.connect(this._buttonNode,"onkeydown","_onDropDownKeydown");this.connect(this._buttonNode,"onkeyup","_onKey");if(this._setStateClass){this.connect(this,"openDropDown","_setStateClass");this.connect(this,"closeDropDown","_setStateClass");}var _29c={"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"+_29c+"ArrowButton");},postCreate:function(){this._setupDropdown();this.inherited(arguments);},destroyDescendants:function(){if(this.dropDown){if(!this.dropDown._destroyed){this.dropDown.destroyRecursive();}delete this.dropDown;}this.inherited(arguments);},_onDropDownKeydown:function(e){if(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.keyCode==dojo.keys.SPACE){e.preventDefault();}},_onKey:function(e){if(this.disabled||this.readOnly){return;}var d=this.dropDown;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){return;}}if(d&&this._opened&&e.keyCode==dojo.keys.ESCAPE){this.toggleDropDown();}else{if(d&&!this._opened&&(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.keyCode==dojo.keys.SPACE)){this.toggleDropDown();if(d.focus){setTimeout(dojo.hitch(d,"focus"),1);}}}},_onBlur:function(){this.closeDropDown();this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_29d){_29d();},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}this.focus();var _29e=this.dropDown;if(!_29e){return;}if(!this._opened){if(!this.isLoaded()){this.loadDropDown(dojo.hitch(this,"openDropDown"));return;}else{this.openDropDown();}}else{this.closeDropDown();}},openDropDown:function(){var _29f=this.dropDown;var _2a0=_29f.domNode;var self=this;if(!this._preparedNode){dijit.popup.moveOffScreen(_2a0);this._preparedNode=true;if(_2a0.style.width){this._explicitDDWidth=true;}if(_2a0.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _2a1={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_2a1.width="";}if(!this._explicitDDHeight){_2a1.height="";}dojo.style(_2a0,_2a1);var mb=dojo.marginBox(_2a0);var _2a2=(this.maxHeight&&mb.h>this.maxHeight);dojo.style(_2a0,{overflowX:"hidden",overflowY:_2a2?"auto":"hidden"});if(_2a2){mb.h=this.maxHeight;if("w" in mb){mb.w+=16;}}else{delete mb.h;}delete mb.t;delete mb.l;if(this.forceWidth){mb.w=this.domNode.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,this.domNode.offsetWidth);}else{delete mb.w;}}if(dojo.isFunction(_29f.resize)){_29f.resize(mb);}else{dojo.marginBox(_2a0,mb);}}var _2a3=dijit.popup.open({parent:this,popup:_29f,around:this._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;self.state="";}});dojo.attr(this._popupStateNode,"popupActive","true");dojo.addClass(self._popupStateNode,"dijitHasDropDownOpen");this._opened=true;this.state="Opened";return _2a3;},closeDropDown:function(_2a4){if(this._opened){if(_2a4){this.focus();}dijit.popup.close(this.dropDown);this._opened=false;this.state="";}}});}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\twaiRole=\"button\" waiState=\"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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"valueNode",iconClass:{node:"iconNode",type:"class"}}),_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 _2a5=dijit.byNode(node);if(_2a5&&typeof _2a5._onSubmit=="function"){_2a5._onSubmit(e);break;}}}else{if(this.valueNode){this.valueNode.click();e.preventDefault();}}}},_fillContent:function(_2a6){if(_2a6&&(!this.params||!("label" in this.params))){this.set("label",_2a6.innerHTML);}},postCreate:function(){dojo.setSelectable(this.focusNode,false);this.inherited(arguments);},_setShowLabelAttr:function(val){if(this.containerNode){dojo.toggleClass(this.containerNode,"dijitDisplayNone",!val);}this.showLabel=val;},onClick:function(e){return true;},_clicked:function(e){},setLabel:function(_2a7){dojo.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_2a7);},_setLabelAttr:function(_2a8){this.containerNode.innerHTML=this.label=_2a8;if(this.showLabel==false&&!this.params.title){this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});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\twaiRole=\"button\" waiState=\"haspopup-true,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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),_fillContent:function(){if(this.srcNodeRef){var _2a9=dojo.query("*",this.srcNodeRef);dijit.form.DropDownButton.superclass._fillContent.call(this,_2a9[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown){var _2aa=dojo.query("[widgetId]",this.dropDownContainer)[0];this.dropDown=dijit.byNode(_2aa);delete this.dropDownContainer;}dijit.popup.moveOffScreen(this.dropDown.domNode);this.inherited(arguments);},isLoaded:function(){var _2ab=this.dropDown;return (!_2ab.href||_2ab.isLoaded);},loadDropDown:function(){var _2ac=this.dropDown;if(!_2ac){return;}if(!this.isLoaded()){var _2ad=dojo.connect(_2ac,"onLoad",this,function(){dojo.disconnect(_2ad);this.openDropDown();});_2ac.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' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"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\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"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\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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(_2ae){dijit.focus(_2ae=="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(_2af,_2b0){this.checked=_2af;dojo.attr(this.focusNode||this.domNode,"checked",_2af);dijit.setWaiState(this.focusNode||this.domNode,"pressed",_2af);this._handleOnChange(_2af,_2b0);},setChecked:function(_2b1){dojo.deprecated("setChecked("+_2b1+") is deprecated. Use set('checked',"+_2b1+") instead.","","2.0");this.set("checked",_2b1);},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\" waiRole=\"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(_2b2){this.readOnly=_2b2;dojo.attr(this.focusNode,"readOnly",_2b2);dijit.setWaiState(this.focusNode,"readonly",_2b2);},_setValueAttr:function(_2b3,_2b4){if(typeof _2b3=="string"){this.value=_2b3;dojo.attr(this.focusNode,"value",_2b3);_2b3=true;}if(this._created){this.set("checked",_2b3,_2b4);}},_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(_2b5){},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);this.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){return false;}return this.inherited(arguments);}});dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_setCheckedAttr:function(_2b6){this.inherited(arguments);if(!this._created){return;}if(_2b6){var _2b7=this;dojo.query("INPUT[type=radio]",this.focusNode.form||dojo.doc).forEach(function(_2b8){if(_2b8.name==_2b7.name&&_2b8!=_2b7.focusNode&&_2b8.form==_2b7.focusNode.form){var _2b9=dijit.getEnclosingWidget(_2b8);if(_2b9&&_2b9.checked){_2b9.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.regexp.escapeString=function(str,_2ba){return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_2ba&&_2ba.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_2bb){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("|"),_2bb);};dojo.regexp.group=function(_2bc,_2bd){return "("+(_2bd?"?:":"")+_2bc+")";};}if(!dojo._hasResource["dojo.data.util.sorter"]){dojo._hasResource["dojo.data.util.sorter"]=true;dojo.provide("dojo.data.util.sorter");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(_2be,_2bf){var _2c0=[];function _2c1(attr,dir,comp,s){return function(_2c2,_2c3){var a=s.getValue(_2c2,attr);var b=s.getValue(_2c3,attr);return dir*comp(a,b);};};var _2c4;var map=_2bf.comparatorMap;var bc=dojo.data.util.sorter.basicComparator;for(var i=0;i<_2be.length;i++){_2c4=_2be[i];var attr=_2c4.attribute;if(attr){var dir=(_2c4.descending)?-1:1;var comp=bc;if(map){if(typeof attr!=="string"&&("toString" in attr)){attr=attr.toString();}comp=map[attr]||bc;}_2c0.push(_2c1(attr,dir,comp,_2bf));}}return function(rowA,rowB){var i=0;while(i<_2c0.length){var ret=_2c0[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.data.util.simpleFetch.fetch=function(_2c5){_2c5=_2c5||{};if(!_2c5.store){_2c5.store=this;}var self=this;var _2c6=function(_2c7,_2c8){if(_2c8.onError){var _2c9=_2c8.scope||dojo.global;_2c8.onError.call(_2c9,_2c7,_2c8);}};var _2ca=function(_2cb,_2cc){var _2cd=_2cc.abort||null;var _2ce=false;var _2cf=_2cc.start?_2cc.start:0;var _2d0=(_2cc.count&&(_2cc.count!==Infinity))?(_2cf+_2cc.count):_2cb.length;_2cc.abort=function(){_2ce=true;if(_2cd){_2cd.call(_2cc);}};var _2d1=_2cc.scope||dojo.global;if(!_2cc.store){_2cc.store=self;}if(_2cc.onBegin){_2cc.onBegin.call(_2d1,_2cb.length,_2cc);}if(_2cc.sort){_2cb.sort(dojo.data.util.sorter.createSortFunction(_2cc.sort,self));}if(_2cc.onItem){for(var i=_2cf;(i<_2cb.length)&&(i<_2d0);++i){var item=_2cb[i];if(!_2ce){_2cc.onItem.call(_2d1,item,_2cc);}}}if(_2cc.onComplete&&!_2ce){var _2d2=null;if(!_2cc.onItem){_2d2=_2cb.slice(_2cf,_2d0);}_2cc.onComplete.call(_2d1,_2d2,_2cc);}};this._fetchItems(_2c5,_2ca,_2c6);return _2c5;};}if(!dojo._hasResource["dojo.data.util.filter"]){dojo._hasResource["dojo.data.util.filter"]=true;dojo.provide("dojo.data.util.filter");dojo.data.util.filter.patternToRegExp=function(_2d3,_2d4){var rxp="^";var c=null;for(var i=0;i<_2d3.length;i++){c=_2d3.charAt(i);switch(c){case "\\":rxp+=c;i++;rxp+=_2d3.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(_2d4){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}\" waiRole=\"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.toLowerCase()=="input"||((type=="hidden"||type=="file")&&this.templateString==dijit.form.TextBox.prototype.templateString)){this.templateString=this._singleNodeTemplate;}this.inherited(arguments);},_setPlaceHolderAttr:function(v){this.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(_2d5,_2d6,_2d7){var _2d8;if(_2d5!==undefined){_2d8=this.filter(_2d5);if(typeof _2d7!="string"){if(_2d8!==null&&((typeof _2d8!="number")||!isNaN(_2d8))){_2d7=this.filter(this.format(_2d8,this.constraints));}else{_2d7="";}}}if(_2d7!=null&&_2d7!=undefined&&((typeof _2d7)!="number"||!isNaN(_2d7))&&this.textbox.value!=_2d7){this.textbox.value=_2d7;}this._updatePlaceHolder();this.inherited(arguments,[_2d8,_2d6]);},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(_2d9){dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");this.set("displayedValue",_2d9);},_setDisplayedValueAttr:function(_2da){if(_2da===null||_2da===undefined){_2da="";}else{if(typeof _2da!="string"){_2da=String(_2da);}}this.textbox.value=_2da;this._setValueAttr(this.get("value"),undefined,_2da);},format:function(_2db,_2dc){return ((_2db==null||_2db==undefined)?"":(_2db.toString?_2db.toString():_2db));},parse:function(_2dd,_2de){return _2dd;},_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 _2df=this;setTimeout(function(){_2df._handleOnChange(_2df.get("value"),false);},0);}this._refreshState();},postCreate:function(){if(dojo.isIE){var s=dojo.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _2e0=this.domNode.getElementsByTagName("INPUT");if(_2e0){for(var i=0;i<_2e0.length;i++){_2e0[i].style.fontFamily=ff;}}}}}this.textbox.setAttribute("value",this.textbox.value);this.inherited(arguments);if(dojo.isMoz||dojo.isOpera){this.connect(this.textbox,"oninput",this._onInput);}else{this.connect(this.textbox,"onkeydown",this._onInput);this.connect(this.textbox,"onkeyup",this._onInput);this.connect(this.textbox,"onpaste",this._onInput);this.connect(this.textbox,"oncut",this._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 _2e1;if(dojo.isIE){var _2e2=dojo.doc.selection.createRange();var _2e3=_2e2.parentElement();_2e1=_2e3==this.textbox&&_2e2.text.length==0;}else{_2e1=this.textbox.selectionStart==this.textbox.selectionEnd;}if(_2e1){dijit.selectInputText(this.textbox);}});}this._updatePlaceHolder();this._refreshState();this.inherited(arguments);},reset:function(){this.textbox.value="";this.inherited(arguments);}});dijit.selectInputText=function(_2e4,_2e5,stop){var _2e6=dojo.global;var _2e7=dojo.doc;_2e4=dojo.byId(_2e4);if(isNaN(_2e5)){_2e5=0;}if(isNaN(stop)){stop=_2e4.value?_2e4.value.length:0;}dijit.focus(_2e4);if(_2e7["selection"]&&dojo.body()["createTextRange"]){if(_2e4.createTextRange){var _2e8=_2e4.createTextRange();with(_2e8){collapse(true);moveStart("character",-99999);moveStart("character",_2e5);moveEnd("character",stop-_2e5);select();}}}else{if(_2e6["getSelection"]){if(_2e4.setSelectionRange){_2e4.setSelectionRange(_2e5,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\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></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(_2e9,_2ea,_2eb,rtl){if(this.aroundNode&&this.aroundNode===_2ea){return;}if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_2e9;var pos=dijit.placeOnScreenAroundElement(this.domNode,_2ea,dijit.getPopupAroundAlignment((_2eb&&_2eb.length)?_2eb:dijit.Tooltip.defaultPosition,!rtl),dojo.hitch(this,"orient"));dojo.style(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_2ea;},orient:function(node,_2ec,_2ed){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"}[_2ec+"-"+_2ed];},_onShow:function(){if(dojo.isIE){this.domNode.style.filter="";}},hide:function(_2ee){if(this._onDeck&&this._onDeck[1]==_2ee){this._onDeck=null;}else{if(this.aroundNode===_2ee){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(_2ef,_2f0,_2f1,rtl){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.show(_2ef,_2f0,_2f1,rtl);};dijit.hideTooltip=function(_2f2){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.hide(_2f2);};dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],constructor:function(){this._nodeConnectionsById={};},_setConnectIdAttr:function(_2f3){for(var _2f4 in this._nodeConnectionsById){this.removeTarget(_2f4);}dojo.forEach(dojo.isArrayLike(_2f3)?_2f3:[_2f3],this.addTarget,this);},_getConnectIdAttr:function(){var ary=[];for(var id in this._nodeConnectionsById){ary.push(id);}return ary;},addTarget:function(id){var node=dojo.byId(id);if(!node){return;}if(node.id in this._nodeConnectionsById){return;}this._nodeConnectionsById[node.id]=[this.connect(node,"onmouseenter","_onTargetMouseEnter"),this.connect(node,"onmouseleave","_onTargetMouseLeave"),this.connect(node,"onfocus","_onTargetFocus"),this.connect(node,"onblur","_onTargetBlur")];},removeTarget:function(node){var id=node.id||node;if(id in this._nodeConnectionsById){dojo.forEach(this._nodeConnectionsById[id],this.disconnect,this);delete this._nodeConnectionsById[id];}},postCreate:function(){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 _2f5=e.target;this._showTimer=setTimeout(dojo.hitch(this,function(){this.open(_2f5);}),this.showDelay);}},_onUnHover:function(e){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_2f6){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}dijit.showTooltip(this.label||this.domNode.innerHTML,_2f6,this.position,!this.isLeftToRight());this._connectNode=_2f6;this.onShow(_2f6,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(_2f7,_2f8){},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}\" waiRole=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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_$",constraints:{},regExp:".*",regExpGen:function(_2f9){return this.regExp;},state:"",tooltipPosition:[],_setValueAttr:function(){this.inherited(arguments);this.validate(this._focused);},validator:function(_2fa,_2fb){return (new RegExp("^(?:"+this.regExpGen(_2fb)+")"+(this.required?"":"?")+"$")).test(_2fa)&&(!this.required||!this._isEmpty(_2fa))&&(this._isEmpty(_2fa)||this.parse(_2fa,_2fb)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(_2fc){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_2fd){return /^\s*$/.test(_2fd);},getErrorMessage:function(_2fe){return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;},getPromptMessage:function(_2ff){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_300){var _301="";var _302=this.disabled||this.isValid(_300);if(_302){this._maskValidSubsetError=true;}var _303=this._isEmpty(this.textbox.value);var _304=!_302&&!_303&&_300&&this._isValidSubset();this.state=((_302||((!this._hasBeenBlurred||_300)&&_303)||_304)&&this._maskValidSubsetError)?"":"Error";if(this.state=="Error"){this._maskValidSubsetError=_300;}this._setStateClass();dijit.setWaiState(this.focusNode,"invalid",_302?"false":"true");if(_300){if(this.state=="Error"){_301=this.getErrorMessage(true);}else{_301=this.getPromptMessage(true);}this._maskValidSubsetError=true;}this.displayMessage(_301);return _302;},_message:"",displayMessage:function(_305){if(this._message==_305){return;}this._message=_305;dijit.hideTooltip(this.domNode);if(_305){dijit.showTooltip(_305,this.domNode,this.tooltipPosition,!this.isLeftToRight());}},_refreshState:function(){this.validate(this._focused);this.inherited(arguments);},constructor:function(){this.constraints={};},_setConstraintsAttr:function(_306){if(!_306.locale&&this.lang){_306.locale=this.lang;}this.constraints=_306;this._computePartialRE();},_computePartialRE:function(){var p=this.regExpGen(this.constraints);this.regExp=p;var _307="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_307+=re;break;case ")":_307+="|$)";break;default:_307+="(?:"+re+"|$)";break;}});}try{"".search(_307);}catch(e){_307=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_307+")$";},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(_308){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_309){this.required=_309;dijit.setWaiState(this.focusNode,"required",_309);this._refreshState();},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,_30a){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+"'":"")+">",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",rangeCheck:function(_30b,_30c){return ("min" in _30c?(this.compare(_30b,_30c.min)>=0):true)&&("max" in _30c?(this.compare(_30b,_30c.max)<=0):true);},isInRange:function(_30d){return this.rangeCheck(this.get("value"),this.constraints);},_isDefinitelyOutOfRange:function(){var val=this.get("value");var _30e=false;var _30f=false;if("min" in this.constraints){var min=this.constraints.min;min=this.compare(val,((typeof min=="number")&&min>=0&&val!=0)?0:min);_30e=(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);_30f=(typeof max=="number")&&max>0;}return _30e||_30f;},_isValidSubset:function(){return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();},isValid:function(_310){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_310));},getErrorMessage:function(_311){var v=this.get("value");if(v!==null&&v!==""&&v!==undefined&&(typeof v!="number"||!isNaN(v))&&!this.isInRange(_311)){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(_312){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(_313,_314){dijit.setWaiState(this.focusNode,"valuenow",_313);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",null,{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/ComboBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachPoint=\"comboNode\" waiRole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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\tdojoAttachEvent=\"onkeypress:_onKeyPress,compositionend\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t/></div\n></div>\n"),baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"downArrowNode":"dijitDownArrowButton"},_getCaretPos:function(_315){var pos=0;if(typeof (_315.selectionStart)=="number"){pos=_315.selectionStart;}else{if(dojo.isIE){var tr=dojo.doc.selection.createRange().duplicate();var ntr=_315.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(_316,_317){_317=parseInt(_317);dijit.selectInputText(_316,_317,_317);},_setDisabledAttr:function(_318){this.inherited(arguments);dijit.setWaiState(this.comboNode,"disabled",_318);},_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._onKeyPress({charOrCode:229});}),100);}this.inherited(arguments);},_onKeyPress:function(evt){var key=evt.charOrCode;if(evt.altKey||((evt.ctrlKey||evt.metaKey)&&(key!="x"&&key!="v"))||key==dojo.keys.SHIFT){return;}var _319=false;var _31a="_startSearchFromInput";var pw=this._popupWidget;var dk=dojo.keys;var _31b=null;this._prev_key_backspace=false;this._abortQuery();if(this._isShowingNow){pw.handleKey(key);_31b=pw.getHighlightedOption();}switch(key){case dk.PAGE_DOWN:case dk.DOWN_ARROW:case dk.PAGE_UP:case dk.UP_ARROW:if(!this._isShowingNow){_319=true;_31a="_startSearchAll";}else{this._announceOption(_31b);}dojo.stopEvent(evt);break;case dk.ENTER:if(_31b){if(_31b==pw.nextButton){this._nextSearch(1);dojo.stopEvent(evt);break;}else{if(_31b==pw.previousButton){this._nextSearch(-1);dojo.stopEvent(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}evt.preventDefault();case dk.TAB:var _31c=this.get("displayedValue");if(pw&&(_31c==pw._messages["previousMessage"]||_31c==pw._messages["nextMessage"])){break;}if(_31b){this._selectOption();}if(this._isShowingNow){this._lastQuery=null;this._hideResultList();}break;case " ":if(_31b){dojo.stopEvent(evt);this._selectOption();this._hideResultList();}else{_319=true;}break;case dk.ESCAPE:if(this._isShowingNow){dojo.stopEvent(evt);this._hideResultList();}break;case dk.DELETE:case dk.BACKSPACE:this._prev_key_backspace=true;_319=true;break;default:_319=typeof key=="string"||key==229;}if(_319){this.item=undefined;this.searchTimer=setTimeout(dojo.hitch(this,_31a),1);}},_autoCompleteText:function(text){var fn=this.focusNode;dijit.selectInputText(fn,fn.value.length);var _31d=this.ignoreCase?"toLowerCase":"substr";if(text[_31d](0).indexOf(this.focusNode.value[_31d](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(_31e,_31f){this._fetchHandle=null;if(this.disabled||this.readOnly||(_31f.query[this.searchAttr]!=this._lastQuery)){return;}this._popupWidget.clearResultList();if(!_31e.length&&!this._maxOptions){this._hideResultList();return;}_31f._maxOptions=this._maxOptions;var _320=this._popupWidget.createOptions(_31e,_31f,dojo.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_31f.direction){if(1==_31f.direction){this._popupWidget.highlightFirstOption();}else{if(-1==_31f.direction){this._popupWidget.highlightLastOption();}}this._announceOption(this._popupWidget.getHighlightedOption());}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_31f.query[this.searchAttr])){this._announceOption(_320[1]);}}},_showResultList:function(){this._hideResultList();this.displayMessage("");dojo.style(this._popupWidget.domNode,{width:"",height:""});var best=this.open();var _321=dojo.marginBox(this._popupWidget.domNode);this._popupWidget.domNode.style.overflow=((best.h==_321.h)&&(best.w==_321.w))?"hidden":"auto";var _322=best.w;if(best.h<this._popupWidget.domNode.scrollHeight){_322+=16;}dojo.marginBox(this._popupWidget.domNode,{h:best.h,w:Math.max(_322,this.domNode.offsetWidth)});if(_322<this.domNode.offsetWidth){this._popupWidget.domNode.parentNode.style.left=dojo.position(this.domNode,true).x+"px";}dijit.setWaiState(this.comboNode,"expanded","true");},_hideResultList:function(){this._abortQuery();if(this._isShowingNow){dijit.popup.close(this._popupWidget);this._isShowingNow=false;dijit.setWaiState(this.comboNode,"expanded","false");dijit.removeWaiState(this.focusNode,"activedescendant");}},_setBlurValue:function(){var _323=this.get("displayedValue");var pw=this._popupWidget;if(pw&&(_323==pw._messages["previousMessage"]||_323==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_323);}else{if(this.value!=this._lastValueReported){dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);}this._refreshState();}}},_onBlur:function(){this._hideResultList();this.inherited(arguments);},_setItemAttr:function(item,_324,_325){if(!_325){_325=this.labelFunc(item,this.store);}this.value=this._getValueField()!=this.searchAttr?this.store.getIdentity(item):_325;this.item=item;dijit.form.ComboBox.superclass._setValueAttr.call(this,this.value,_324,_325);},_announceOption:function(node){if(!node){return;}var _326;if(node==this._popupWidget.nextButton||node==this._popupWidget.previousButton){_326=node.innerHTML;this.item=undefined;this.value="";}else{_326=this.labelFunc(node.item,this.store);this.set("item",node.item,false,_326);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(node,"id"));this._autoCompleteText(_326);},_selectOption:function(evt){if(evt){this._announceOption(evt.target);}this._hideResultList();this._setCaretPos(this.focusNode,this.focusNode.value.length);dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);},_onArrowMouseDown:function(evt){if(this.disabled||this.readOnly){return;}dojo.stopEvent(evt);this.focus();if(this._isShowingNow){this._hideResultList();}else{this._startSearchAll();}},_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._popupWidget){var _327=this.id+"_popup";this._popupWidget=new dijit.form._ComboBoxMenu({onChange:dojo.hitch(this,this._selectOption),id:_327,dir:this.dir});dijit.removeWaiState(this.focusNode,"activedescendant");dijit.setWaiState(this.textbox,"owns",_327);}var _328=dojo.clone(this.query);this._lastInput=key;this._lastQuery=_328[this.searchAttr]=this._getQueryString(key);this.searchTimer=setTimeout(dojo.hitch(this,function(_329,_32a){this.searchTimer=null;var _32b={queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_329,onBegin:dojo.hitch(this,"_setMaxOptions"),onComplete:dojo.hitch(this,"_openResultList"),onError:function(_32c){_32a._fetchHandle=null;console.error("dijit.form.ComboBox: "+_32c);dojo.hitch(_32a,"_hideResultList")();},start:0,count:this.pageSize};dojo.mixin(_32b,_32a.fetchProperties);this._fetchHandle=_32a.store.fetch(_32b);var _32d=function(_32e,_32f){_32e.start+=_32e.count*_32f;_32e.direction=_32f;this._fetchHandle=this.store.fetch(_32e);};this._nextSearch=this._popupWidget.onPage=dojo.hitch(this,_32d,this._fetchHandle);},_328,this),this.searchDelay);},_setMaxOptions:function(size,_330){this._maxOptions=size;},_getValueField:function(){return this.searchAttr;},compositionend:function(evt){this._onKeyPress({charOrCode:229});},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _331=this.srcNodeRef;this.store=new dijit.form._ComboBoxDataStore(_331);if(!("value" in this.params)){var item=this.store.fetchSelectedItem();if(item){var _332=this._getValueField();this.value=_332!=this.searchAttr?this.store.getValue(item,_332):this.labelFunc(item,this.store);}}}this.inherited(arguments);},postCreate:function(){if(!this.hasDownArrow){this.downArrowNode.style.display="none";}var _333=dojo.query("label[for=\""+this.id+"\"]");if(_333.length){_333[0].id=(this.id+"_label");var cn=this.comboNode;dijit.setWaiState(cn,"labelledby",_333[0].id);}this.inherited(arguments);},uninitialize:function(){if(this._popupWidget&&!this._popupWidget._destroyed){this._hideResultList();this._popupWidget.destroy();}this.inherited(arguments);},_getMenuLabelFromItem:function(item){var _334=this.labelAttr?this.store.getValue(item,this.labelAttr):this.labelFunc(item,this.store);var _335=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_334=this.doHighlight(_334,this._escapeHtml(this._lastInput));_335="html";}return {html:_335=="html",label:_334};},doHighlight:function(_336,find){var _337="i"+(this.highlightMatch=="all"?"g":"");var _338=this._escapeHtml(_336);find=dojo.regexp.escapeString(find);var ret=_338.replace(new RegExp("(^|\\s)("+find+")",_337),"$1<span class=\"dijitComboBoxHighlightMatch\">$2</span>");return ret;},_escapeHtml:function(str){str=String(str).replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");return str;},open:function(){this._isShowingNow=true;return dijit.popup.open({popup:this._popupWidget,around:this.domNode,parent:this});},reset:function(){this.item=null;this.inherited(arguments);},labelFunc:function(item,_339){return _339.getValue(item,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' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRole='option'></li>"+"</ul>",_messages:null,baseClass:"dijitComboBoxMenu",postMixInProperties:function(){this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang);this.inherited(arguments);},_setValueAttr:function(_33a){this.value=_33a;this.onChange(_33a);},onChange:function(_33b){},onPage:function(_33c){},postCreate:function(){this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];this.inherited(arguments);},onClose:function(){this._blurOptionNode();},_createOption:function(item,_33d){var _33e=_33d(item);var _33f=dojo.doc.createElement("li");dijit.setWaiRole(_33f,"option");if(_33e.html){_33f.innerHTML=_33e.label;}else{_33f.appendChild(dojo.doc.createTextNode(_33e.label));}if(_33f.innerHTML==""){_33f.innerHTML="&nbsp;";}_33f.item=item;return _33f;},createOptions:function(_340,_341,_342){this.previousButton.style.display=(_341.start==0)?"none":"";dojo.attr(this.previousButton,"id",this.id+"_prev");dojo.forEach(_340,function(item,i){var _343=this._createOption(item,_342);_343.className="dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl");dojo.attr(_343,"id",this.id+i);this.domNode.insertBefore(_343,this.nextButton);},this);var _344=false;if(_341._maxOptions&&_341._maxOptions!=-1){if((_341.start+_341.count)<_341._maxOptions){_344=true;}else{if((_341.start+_341.count)>_341._maxOptions&&_341.count==_340.length){_344=true;}}}else{if(_341.count==_340.length){_344=true;}}this.nextButton.style.display=_344?"":"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]);}},_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.onPage(-1);}else{if(evt.target==this.nextButton){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 _345=this.domNode.firstChild;var _346=_345.nextSibling;this._focusOptionNode(_346.style.display=="none"?_345:_346);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 _347=0;var _348=this.domNode.scrollTop;var _349=dojo.style(this.domNode,"height");if(!this.getHighlightedOption()){this._highlightNextOption();}while(_347<_349){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 _34a=this.domNode.scrollTop;_347+=(_34a-_348)*(up?-1:1);_348=_34a;}},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(key){switch(key){case dojo.keys.DOWN_ARROW:this._highlightNextOption();break;case dojo.keys.PAGE_DOWN:this.pageDown();break;case dojo.keys.UP_ARROW:this._highlightPrevOption();break;case dojo.keys.PAGE_UP:this.pageUp();break;}}});dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{_setValueAttr:function(_34b,_34c,_34d){this.item=null;if(!_34b){_34b="";}dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_34b,_34c,_34d);}});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,_34e,_34f){return (_34e=="value")?item.value:(item.innerText||item.textContent||"");},isItemLoaded:function(_350){return true;},getFeatures:function(){return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};},_fetchItems:function(args,_351,_352){if(!args.query){args.query={};}if(!args.query.name){args.query.name="";}if(!args.queryOptions){args.queryOptions={};}var _353=dojo.data.util.filter.patternToRegExp(args.query.name,args.queryOptions.ignoreCase),_354=dojo.query("> option",this.root).filter(function(_355){return (_355.innerText||_355.textContent||"").match(_353);});if(args.sort){_354.sort(dojo.data.util.sorter.createSortFunction(args.sort,this));}_351(_354,args);},close:function(_356){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],{_isvalid:true,required:true,_lastDisplayedValue:"",isValid:function(){return this._isvalid||(!this.required&&this.get("displayedValue")=="");},_refreshState:function(){if(!this.searchTimer){this.inherited(arguments);}},_callbackSetLabel:function(_357,_358,_359){if((_358&&_358.query[this.searchAttr]!=this._lastQuery)||(!_358&&_357.length&&this.store.getIdentity(_357[0])!=this._lastQuery)){return;}if(!_357.length){this.valueNode.value="";dijit.form.TextBox.superclass._setValueAttr.call(this,"",_359||(_359===undefined&&!this._focused));this._isvalid=false;this.validate(this._focused);this.item=null;}else{this.set("item",_357[0],_359);}},_openResultList:function(_35a,_35b){if(_35b.query[this.searchAttr]!=this._lastQuery){return;}if(this.item===undefined){this._isvalid=_35a.length!=0||this._maxOptions!=0;this.validate(true);}dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_35c,_35d){if(!this._onChangeActive){_35d=null;}this._lastQuery=_35c;if(_35c===null||_35c===""){this._setDisplayedValueAttr("",_35d);return;}var self=this;this.store.fetchItemByIdentity({identity:_35c,onItem:function(item){self._callbackSetLabel(item?[item]:[],undefined,_35d);}});},_setItemAttr:function(item,_35e,_35f){this._isvalid=true;this.inherited(arguments);this.valueNode.value=this.value;this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(text){return text.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_360,_361){if(!this._created){_361=false;}if(this.store){this._hideResultList();var _362=dojo.clone(this.query);this._lastQuery=_362[this.searchAttr]=this._getDisplayQueryString(_360);this.textbox.value=_360;this._lastDisplayedValue=_360;var _363=this;var _364={query:_362,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_365,_366){_363._fetchHandle=null;dojo.hitch(_363,"_callbackSetLabel")(_365,_366,_361);},onError:function(_367){_363._fetchHandle=null;console.error("dijit.form.FilteringSelect: "+_367);dojo.hitch(_363,"_callbackSetLabel")([],undefined,false);}};dojo.mixin(_364,this.fetchProperties);this._fetchHandle=this.store.fetch(_364);}},postMixInProperties:function(){this.inherited(arguments);this._isvalid=!this.required;},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],{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(_368){},onExecute:function(){},_setEncTypeAttr:function(_369){this.encType=_369;dojo.attr(this.domNode,"encType",_369);if(dojo.isIE){this.domNode.encoding=_369;}},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(_36a){var _36b=_36a,opts=this.options||[],l=opts.length;if(_36b===undefined){return opts;}if(dojo.isArray(_36b)){return dojo.map(_36b,"return this.getOptions(item);",this);}if(dojo.isObject(_36a)){if(!dojo.some(this.options,function(o,idx){if(o===_36b||(o.value&&o.value===_36b.value)){_36b=idx;return true;}return false;})){_36b=-1;}}if(typeof _36b=="string"){for(var i=0;i<l;i++){if(opts[i].value===_36b){_36b=i;break;}}}if(typeof _36b=="number"&&_36b>=0&&_36b<l){return this.options[_36b];}return null;},addOption:function(_36c){if(!dojo.isArray(_36c)){_36c=[_36c];}dojo.forEach(_36c,function(i){if(i&&dojo.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_36d){if(!dojo.isArray(_36d)){_36d=[_36d];}var _36e=this.getOptions(_36d);dojo.forEach(_36e,function(i){if(i){this.options=dojo.filter(this.options,function(node,idx){return (node.value!==i.value);});this._removeOptionItem(i);}},this);this._loadChildren();},updateOption:function(_36f){if(!dojo.isArray(_36f)){_36f=[_36f];}dojo.forEach(_36f,function(i){var _370=this.getOptions(i),k;if(_370){for(k in i){_370[k]=i[k];}}},this);this._loadChildren();},setStore:function(_371,_372,_373){var _374=this.store;_373=_373||{};if(_374!==_371){dojo.forEach(this._notifyConnections||[],dojo.disconnect);delete this._notifyConnections;if(_371&&_371.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[dojo.connect(_371,"onNew",this,"_onNewItem"),dojo.connect(_371,"onDelete",this,"_onDeleteItem"),dojo.connect(_371,"onSet",this,"_onSetItem")];}this.store=_371;}this._onChangeActive=false;if(this.options&&this.options.length){this.removeOption(this.options);}if(_371){var cb=function(_375){if(this.sortByLabel&&!_373.sort&&_375.length){_375.sort(dojo.data.util.sorter.createSortFunction([{attribute:_371.getLabelAttributes(_375[0])[0]}],_371));}if(_373.onFetch){_375=_373.onFetch(_375);}dojo.forEach(_375,function(i){this._addOptionForItem(i);},this);this._loadingStore=false;this.set("value",(("_pendingValue" in this)?this._pendingValue:_372));delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_375);}this._fetchedWith=opts;this._lastValueReported=this.multiple?[]:null;this._onChangeActive=true;this.onSetStore();this._handleOnChange(this.value);};var opts=dojo.mixin({onComplete:cb,scope:this},_373);this._loadingStore=true;_371.fetch(opts);}else{delete this._fetchedWith;}return _374;},_setValueAttr:function(_376,_377){if(this._loadingStore){this._pendingValue=_376;return;}var opts=this.getOptions()||[];if(!dojo.isArray(_376)){_376=[_376];}dojo.forEach(_376,function(i,idx){if(!dojo.isObject(i)){i=i+"";}if(typeof i==="string"){_376[idx]=dojo.filter(opts,function(node){return node.value===i;})[0]||{value:"",label:""};}},this);_376=dojo.filter(_376,function(i){return i&&i.value;});if(!this.multiple&&(!_376[0]||!_376[0].value)&&opts.length){_376[0]=opts[0];}dojo.forEach(opts,function(i){i.selected=dojo.some(_376,function(v){return v.value===i.value;});});var val=dojo.map(_376,function(i){return i.value;}),disp=dojo.map(_376,function(i){return i.label;});this.value=this.multiple?val:val[0];this._setDisplay(this.multiple?disp:disp[0]);this._updateSelection();this._handleOnChange(this.value,_377);},_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];},_getValueDeprecated:false,getValue:function(){return this._lastValue;},undo:function(){this._setValueAttr(this._lastValueReported,false);},_loadChildren:function(){if(this._loadingStore){return;}dojo.forEach(this._getChildren(),function(_378){_378.destroyRecursive();});dojo.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this.value=this._getValueFromOpts();var val=this.value;if(!dojo.isArray(val)){val=[val];}if(val&&val[0]){dojo.forEach(this._getChildren(),function(_379){var _37a=dojo.some(val,function(v){return _379.option&&(v===_379.option.value);});dojo.toggleClass(_379.domNode,this.baseClass+"SelectedOption",_37a);dijit.setWaiState(_379.domNode,"selected",_37a);},this);}this._handleOnChange(this.value);},_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,_37b){if(!_37b||!_37b.parent){this._addOptionForItem(item);}},_onDeleteItem:function(item){var _37c=this.store;this.removeOption(_37c.getIdentity(item));},_onSetItem:function(item){this.updateOption(this._getOptionObjForItem(item));},_getOptionObjForItem:function(item){var _37d=this.store,_37e=_37d.getLabel(item),_37f=(_37e?_37d.getIdentity(item):null);return {value:_37f,label:_37e,item:item};},_addOptionForItem:function(item){var _380=this.store;if(!_380.isItemLoaded(item)){_380.loadItem({item:item,onComplete:function(i){this._addOptionForItem(item);},scope:this});return;}var _381=this._getOptionObjForItem(item);this.addOption(_381);},constructor:function(_382){this._oValue=(_382||{}).value||null;},_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("value"),label:String(node.innerHTML),selected:node.getAttribute("selected")||false,disabled:node.getAttribute("disabled")||false};},this):[];}if(!this.value){this.value=this._getValueFromOpts();}else{if(this.multiple&&typeof this.value=="string"){this.value=this.value.split(",");}}},postCreate:function(){dojo.setSelectable(this.focusNode,false);this.inherited(arguments);this.connect(this,"onChange","_updateSelection");this.connect(this,"startup","_loadChildren");this._setValueAttr(this.value,null);},startup:function(){this.inherited(arguments);var _383=this.store,_384={};dojo.forEach(["query","queryOptions","onFetch"],function(i){if(this[i]){_384[i]=this[i];}delete this[i];},this);if(_383&&_383.getFeatures()["dojo.data.api.Identity"]){this.store=null;this.setStore(_383,this._oValue,_384);}},destroy:function(){dojo.forEach(this._notifyConnections||[],dojo.disconnect);this.inherited(arguments);},_addOptionItem:function(_385){},_removeOptionItem:function(_386){},_setDisplay:function(_387){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions(this.get("value"));},_pseudoLoadChildren:function(_388){},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(_389,_38a){var _38b=(this._keyNavCodes={});var prev=dojo.hitch(this,this.focusPrev);var next=dojo.hitch(this,this.focusNext);dojo.forEach(_389,function(code){_38b[code]=prev;});dojo.forEach(_38a,function(code){_38b[code]=next;});this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){dojo.forEach(this.getChildren(),dojo.hitch(this,"_startupChild"));},addChild:function(_38c,_38d){dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);this._startupChild(_38c);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){var _38e=this._getFirstFocusableChild();if(_38e){this.focusChild(_38e);}},focusNext:function(){var _38f=this._getNextFocusableChild(this.focusedChild,1);this.focusChild(_38f);},focusPrev:function(){var _390=this._getNextFocusableChild(this.focusedChild,-1);this.focusChild(_390,true);},focusChild:function(_391,last){if(this.focusedChild&&_391!==this.focusedChild){this._onChildBlur(this.focusedChild);}_391.focus(last?"end":"start");this.focusedChild=_391;},_startupChild:function(_392){_392.set("tabIndex","-1");this.connect(_392,"_onFocus",function(){_392.set("tabIndex",this.tabIndex);});this.connect(_392,"_onBlur",function(){_392.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(_393){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getNextFocusableChild:function(_394,dir){if(_394){_394=this._getSiblingOfChild(_394,dir);}var _395=this.getChildren();for(var i=0;i<_395.length;i++){if(!_394){_394=_395[(dir>0)?0:(_395.length-1)];}if(_394.isFocusable()){return _394;}_394=this._getSiblingOfChild(_394,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\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"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(_396){if(_396&&!("label" in this.params)){this.set("label",_396.innerHTML);}},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);var _397=this.id+"_text";dojo.attr(this.containerNode,"id",_397);if(this.accelKeyNode){dojo.attr(this.accelKeyNode,"id",this.id+"_accel");_397+=" "+this.id+"_accel";}dijit.setWaiState(this.domNode,"labelledby",_397);},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);this._hovering=false;this._setStateClass();},_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(_398){dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_398);},setLabel:function(_399){dojo.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_399);},setDisabled:function(_39a){dojo.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_39a);},_setDisabledAttr:function(_39b){this.disabled=_39b;dijit.setWaiState(this.focusNode,"disabled",_39b?"true":"false");},_setAccelKeyAttr:function(_39c){this.accelKey=_39c;this.accelKeyNode.style.display=_39c?"":"none";this.accelKeyNode.innerHTML=_39c;dojo.attr(this.containerNode,"colSpan",_39c?"1":"2");}});}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 _39d=dojo.query("*",this.srcNodeRef);dijit.PopupMenuItem.superclass._fillContent.call(this,_39d[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\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"presentation\">&nbsp;</td>\n</tr>\n"),checked:false,_setCheckedAttr:function(_39e){dojo.toggleClass(this.domNode,"dijitCheckedMenuItemChecked",_39e);dijit.setWaiState(this.domNode,"checked",_39e);this.checked=_39e;},onChange:function(_39f){},_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"),postCreate:function(){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(_3a0){_3a0.startup();});this.startupKeyNavChildren();this.inherited(arguments);},onExecute:function(){},onCancel:function(_3a1){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}else{var _3a2=this._getTopMenu();if(_3a2&&_3a2._isMenuBar){_3a2.focusNext();}}},_onPopupHover:function(evt){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _3a3=this.currentPopup.parentMenu;if(_3a3.focusedChild){_3a3.focusedChild._setSelected(false);}_3a3.focusedChild=this.currentPopup.from_item;_3a3.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 _3a4=item.popup;if(_3a4){this._stopPendingCloseTimer(_3a4);_3a4._pendingClose_timer=setTimeout(function(){_3a4._pendingClose_timer=null;if(_3a4.parentMenu){_3a4.parentMenu.currentPopup=null;}dijit.popup.close(_3a4);},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(_3a5){if(_3a5._pendingClose_timer){clearTimeout(_3a5._pendingClose_timer);_3a5._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 _3a6=this.focusedChild;if(!_3a6){return;}var _3a7=_3a6.popup;if(_3a7.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);dijit.popup.close(this.currentPopup);}_3a7.parentMenu=this;_3a7.from_item=_3a6;var self=this;dijit.popup.open({parent:this,popup:_3a7,around:_3a6.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(_3a6);self._cleanUp();_3a6._setSelected(true);self.focusedChild=_3a6;},onExecute:dojo.hitch(this,"_cleanUp")});this.currentPopup=_3a7;_3a7.connect(_3a7.domNode,"onmouseenter",dojo.hitch(self,"_onPopupHover"));if(_3a7.focus){_3a7._focus_timer=setTimeout(dojo.hitch(_3a7,function(){this._focus_timer=null;this.focus();}),0);}},_markActive:function(){this.isActive=true;dojo.addClass(this.domNode,"dijitMenuActive");dojo.removeClass(this.domNode,"dijitMenuPassive");},onOpen:function(e){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;dojo.removeClass(this.domNode,"dijitMenuActive");dojo.addClass(this.domNode,"dijitMenuPassive");},onClose:function(){this._stopFocusTimer();this._markInactive();this.isShowingNow=false;this.parentMenu=null;},_closeChild:function(){this._stopPopupTimer();if(this.focusedChild){this.focusedChild._setSelected(false);this.focusedChild._onUnhover();this.focusedChild=null;}if(this.currentPopup){dijit.popup.close(this.currentPopup);this.currentPopup=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\" waiRole=\"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(_3a8){var win=dojo.window.get(this._iframeContentDocument(_3a8))||this._iframeContentDocument(_3a8)["__parent__"]||(_3a8.name&&dojo.doc.frames[_3a8.name])||null;return win;},_iframeContentDocument:function(_3a9){var doc=_3a9.contentDocument||(_3a9.contentWindow&&_3a9.contentWindow.document)||(_3a9.name&&dojo.doc.frames[_3a9.name]&&dojo.doc.frames[_3a9.name].document)||null;return doc;},bindDomNode:function(node){node=dojo.byId(node);var cn;if(node.tagName.toLowerCase()=="iframe"){var _3aa=node,win=this._iframeContentWindow(_3aa);cn=dojo.withGlobal(win,dojo.body);}else{cn=(node==dojo.body()?dojo.doc.documentElement:node);}var _3ab={node:node,iframe:_3aa};dojo.attr(node,"_dijitMenu"+this.id,this._bindings.push(_3ab));var _3ac=dojo.hitch(this,function(cn){return [dojo.connect(cn,this.leftClickToOpen?"onclick":"oncontextmenu",this,function(evt){dojo.stopEvent(evt);this._scheduleOpen(evt.target,_3aa,{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,_3aa);}})];});_3ab.connects=cn?_3ac(cn):[];if(_3aa){_3ab.onloadHandler=dojo.hitch(this,function(){var win=this._iframeContentWindow(_3aa);cn=dojo.withGlobal(win,dojo.body);_3ab.connects=_3ac(cn);});if(_3aa.addEventListener){_3aa.addEventListener("load",_3ab.onloadHandler,false);}else{_3aa.attachEvent("onload",_3ab.onloadHandler);}}},unBindDomNode:function(_3ad){var node;try{node=dojo.byId(_3ad);}catch(e){return;}var _3ae="_dijitMenu"+this.id;if(node&&dojo.hasAttr(node,_3ae)){var bid=dojo.attr(node,_3ae)-1,b=this._bindings[bid];dojo.forEach(b.connects,dojo.disconnect);var _3af=b.iframe;if(_3af){if(_3af.removeEventListener){_3af.removeEventListener("load",b.onloadHandler,false);}else{_3af.detachEvent("onload",b.onloadHandler);}}dojo.removeAttr(node,_3ae);delete this._bindings[bid];}},_scheduleOpen:function(_3b0,_3b1,_3b2){if(!this._openTimer){this._openTimer=setTimeout(dojo.hitch(this,function(){delete this._openTimer;this._openMyself({target:_3b0,iframe:_3b1,coords:_3b2});}),1);}},_openMyself:function(args){var _3b3=args.target,_3b4=args.iframe,_3b5=args.coords;if(_3b5){if(_3b4){var od=_3b3.ownerDocument,ifc=dojo.position(_3b4,true),win=this._iframeContentWindow(_3b4),_3b6=dojo.withGlobal(win,"_docScroll",dojo);var cs=dojo.getComputedStyle(_3b4),tp=dojo._toPixelValue,left=(dojo.isIE&&dojo.isQuirks?0:tp(_3b4,cs.paddingLeft))+(dojo.isIE&&dojo.isQuirks?tp(_3b4,cs.borderLeftWidth):0),top=(dojo.isIE&&dojo.isQuirks?0:tp(_3b4,cs.paddingTop))+(dojo.isIE&&dojo.isQuirks?tp(_3b4,cs.borderTopWidth):0);_3b5.x+=ifc.x+left-_3b6.x;_3b5.y+=ifc.y+top-_3b6.y;}}else{_3b5=dojo.position(_3b3,true);_3b5.x+=10;_3b5.y+=10;}var self=this;var _3b7=dijit.getFocus(this);function _3b8(){if(self.refocus){dijit.focus(_3b7);}dijit.popup.close(self);};dijit.popup.open({popup:this,x:_3b5.x,y:_3b5.y,onExecute:_3b8,onCancel:_3b8,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);},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\twaiRole=\"combobox\" waiState=\"haspopup-true\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" waiRole=\"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}\" waiState=\"hidden-true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"titleNode\" waiRole=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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:"",tooltipPosition:[],emptyLabel:"",_isLoaded:false,_childrenLoaded:false,_fillContent:function(){this.inherited(arguments);if(this.options.length&&!this.value&&this.srcNodeRef){var si=this.srcNodeRef.selectedIndex;this.value=this.options[si!=-1?si:0].value;}this.dropDown=new dijit.form._SelectMenu({id:this.id+"_menu"});dojo.addClass(this.dropDown.domNode,this.baseClass+"Menu");},_getMenuItemForOption:function(_3b9){if(!_3b9.value){return new dijit.MenuSeparator();}else{var _3ba=dojo.hitch(this,"_setValueAttr",_3b9);var item=new dijit.MenuItem({option:_3b9,label:_3b9.label,onClick:_3ba,disabled:_3b9.disabled||false});dijit.setWaiRole(item.focusNode,"listitem");return item;}},_addOptionItem:function(_3bb){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_3bb));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_3bc){if(_3bc===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{dojo.forEach(this._getChildren(),function(_3bd){_3bd.destroyRecursive();});var item=new dijit.MenuItem({label:"&nbsp;"});this.dropDown.addChild(item);}}else{this._updateSelection();}var len=this.options.length;this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value);}},_setValueAttr:function(_3be){this.inherited(arguments);dojo.attr(this.valueNode,"value",this.get("value"));},_setDisplay:function(_3bf){this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+(_3bf||this.emptyLabel||"&nbsp;")+"</span>";dijit.setWaiState(this.focusNode,"valuetext",(_3bf||this.emptyLabel||"&nbsp;"));},validate:function(_3c0){var _3c1=this.isValid(_3c0);this.state=_3c1?"":"Error";this._setStateClass();dijit.setWaiState(this.focusNode,"invalid",_3c1?"false":"true");var _3c2=_3c1?"":this._missingMsg;if(this._message!==_3c2){this._message=_3c2;dijit.hideTooltip(this.domNode);if(_3c2){dijit.showTooltip(_3c2,this.domNode,this.tooltipPosition,!this.isLeftToRight());}}return _3c1;},isValid:function(_3c3){return (!this.required||!(/^\s*$/.test(this.value)));},reset:function(){this.inherited(arguments);dijit.hideTooltip(this.domNode);this.state="";this._setStateClass();delete this._message;},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=dojo.i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);if(this.tableNode.style.width){dojo.addClass(this.domNode,this.baseClass+"FixedWidth");}},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_3c4){this._loadChildren(true);this._isLoaded=true;_3c4();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},uninitialize:function(_3c5){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_3c5);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);},filter:function(_3c6){if(_3c6){_3c6=_3c6.replace(/\r/g,"");}return this.inherited(arguments);},postCreate:function(){this.inherited(arguments);if(dojo.isIE&&this.cols){dojo.addClass(this.textbox,"dijitTextAreaCols");}},_previousValue:"",_onInput:function(e){if(this.maxLength){var _3c7=parseInt(this.maxLength);var _3c8=this.textbox.value.replace(/\r/g,"");var _3c9=_3c8.length-_3c7;if(_3c9>0){if(e){dojo.stopEvent(e);}var _3ca=this.textbox;if(_3ca.selectionStart){var pos=_3ca.selectionStart;var cr=0;if(dojo.isOpera){cr=(this.textbox.value.substring(0,pos).match(/\r/g)||[]).length;}this.textbox.value=_3c8.substring(0,pos-_3c9-cr)+_3c8.substring(pos-cr);_3ca.setSelectionRange(pos-_3c9,pos-_3c9);}else{if(dojo.doc.selection){_3ca.focus();var _3cb=dojo.doc.selection.createRange();_3cb.moveStart("character",-_3c9);_3cb.text="";_3cb.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:{},onChange:function(_3cc){},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 _3cd={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _3cd){this.connect(this.displayNode,name,_3cd[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(_3ce){dojo.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_3ce);},_setDisabledAttr:function(_3cf){this.disabled=_3cf;dijit.setWaiState(this.domNode,"disabled",_3cf);if(_3cf){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}dojo.toggleClass(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_3cf);},_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 _3d0=dojo.create("span",null,this.domNode,"before");var ewc=dojo.getObject(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")},_3d0);}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.destroy();delete this.wrapperWidget;}this.inherited(arguments);},_showText:function(_3d1){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(_3d1){dijit.focus(this.displayNode);}},save:function(_3d2){if(this.disabled||!this.editing){return;}this.editing=false;var ww=this.wrapperWidget;var _3d3=ww.getValue();this.set("value",_3d3);setTimeout(dojo.hitch(this,"onChange",_3d3),0);this._showText(_3d2);},setValue:function(val){dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(val){this.value=val=dojo.trim(val);if(!this.renderAsHtml){val=val.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");}this.displayNode.innerHTML=val||this.noValueIndicator;},getValue:function(){dojo.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},cancel:function(_3d4){if(this.disabled||!this.editing){return;}this.editing=false;setTimeout(dojo.hitch(this,"onCancel"),0);this._showText(_3d4);}});dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit","templates/InlineEditBox.html","<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\"\n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" label=\"${buttonSave}\"></button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\" label=\"${buttonCancel}\"></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);},postCreate:function(){var cls=dojo.getObject(this.editor);var _3d5=this.sourceStyle,_3d6="line-height:"+_3d5.lineHeight+";",_3d7=dojo.getComputedStyle(this.domNode);dojo.forEach(["Weight","Family","Size","Style"],function(prop){var _3d8=_3d5["font"+prop],_3d9=_3d7["font"+prop];if(_3d9!=_3d8){_3d6+="font-"+prop+":"+_3d5["font"+prop]+";";}},this);dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_3d5[prop];},this);var _3da=this.inlineEditBox.width;if(_3da=="100%"){_3d6+="width:100%;";this.domNode.style.display="block";}else{_3d6+="width:"+(_3da+(Number(_3da)==_3da?"px":""))+";";}var _3db=dojo.delegate(this.inlineEditBox.editorParams,{style:_3d6,dir:this.dir,lang:this.lang});_3db["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;var ew=(this.editWidget=new cls(_3db,this.editorPlaceholder));if(this.inlineEditBox.autoSave){dojo.destroy(this.buttonContainer);this.connect(ew,"onChange","_onChange");this.connect(ew,"onKeyPress","_onKeyPress");}else{if("intermediateChanges" in cls.prototype){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,_3dc,_3dd){var c=document.cookie;if(arguments.length==1){var _3de=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(name)+"=([^;]*)"));return _3de?decodeURIComponent(_3de[1]):undefined;}else{_3dd=_3dd||{};var exp=_3dd.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_3dd.expires=d;}if(exp&&exp.toUTCString){_3dd.expires=exp.toUTCString();}_3dc=encodeURIComponent(_3dc);var _3df=name+"="+_3dc,_3e0;for(_3e0 in _3dd){_3df+="; "+_3e0;var _3e1=_3dd[_3e0];if(_3e1!==true){_3df+="="+_3e1;}}document.cookie=_3df;}};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 wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",containerId:"",buttonWidget:"dijit.layout._StackButton",postCreate:function(){dijit.setWaiRole(this.domNode,"tablist");this.pane2button={};this.pane2handles={};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,_3e2){var cls=dojo.getObject(this.buttonWidget);var _3e3=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(_3e3.focusNode,"selected","false");this.pane2handles[page.id]=[this.connect(page,"set",function(name,_3e4){var _3e5={title:"label",showTitle:"showLabel",iconClass:"iconClass",closable:"closeButton",tooltip:"title"}[name];if(_3e5){_3e3.set(_3e5,_3e4);}}),this.connect(_3e3,"onClick",dojo.hitch(this,"onButtonClick",page)),this.connect(_3e3,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",page))];this.addChild(_3e3,_3e2);this.pane2button[page.id]=_3e3;page.controlButton=_3e3;if(!this._currentChild){_3e3.focusNode.setAttribute("tabIndex","0");dijit.setWaiState(_3e3.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.pane2handles[page.id],this.disconnect,this);delete this.pane2handles[page.id];var _3e6=this.pane2button[page.id];if(_3e6){this.removeChild(_3e6);delete this.pane2button[page.id];_3e6.destroy();}delete page.controlButton;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _3e7=this.pane2button[this._currentChild.id];_3e7.set("checked",false);dijit.setWaiState(_3e7.focusNode,"selected","false");_3e7.focusNode.setAttribute("tabIndex","-1");}var _3e8=this.pane2button[page.id];_3e8.set("checked",true);dijit.setWaiState(_3e8.focusNode,"selected","true");this._currentChild=page;_3e8.focusNode.setAttribute("tabIndex","0");var _3e9=dijit.byId(this.containerId);dijit.setWaiState(_3e9.containerNode,"labelledby",_3e8.id);},onButtonClick:function(page){var _3ea=dijit.byId(this.containerId);_3ea.selectChild(page);},onCloseButtonClick:function(page){var _3eb=dijit.byId(this.containerId);_3eb.closeChild(page);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){dijit.focus(b.focusNode||b.domNode);}}},adjacent:function(_3ec){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_3ec=!_3ec;}var _3ed=this.getChildren();var _3ee=dojo.indexOf(_3ed,this.pane2button[this._currentChild.id]);var _3ef=_3ec?1:_3ed.length-1;return _3ed[(_3ee+_3ef)%_3ed.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _3f0=null;if(e.ctrlKey||!e._djpage){var k=dojo.keys;switch(e.charOrCode){case k.LEFT_ARROW:case k.UP_ARROW:if(!e._djpage){_3f0=false;}break;case k.PAGE_UP:if(e.ctrlKey){_3f0=false;}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(!e._djpage){_3f0=true;}break;case k.PAGE_DOWN:if(e.ctrlKey){_3f0=true;}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(_3f0!==null){this.adjacent(_3f0).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",postCreate:function(evt){dijit.setWaiRole((this.focusNode||this.domNode),"tab");this.inherited(arguments);},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",postCreate:function(){this.inherited(arguments);dojo.addClass(this.domNode,"dijitLayoutContainer");dijit.setWaiRole(this.containerNode,"tabpanel");this.connect(this.domNode,"onkeypress",this._onKeyPress);},startup:function(){if(this._started){return;}var _3f1=this.getChildren();dojo.forEach(_3f1,this._setupChild,this);if(this.persist){this.selectedChildWidget=dijit.byId(dojo.cookie(this.id+"_selectedChild"));}else{dojo.some(_3f1,function(_3f2){if(_3f2.selected){this.selectedChildWidget=_3f2;}return _3f2.selected;},this);}var _3f3=this.selectedChildWidget;if(!_3f3&&_3f1[0]){_3f3=this.selectedChildWidget=_3f1[0];_3f3.selected=true;}dojo.publish(this.id+"-startup",[{children:_3f1,selected:_3f3}]);this.inherited(arguments);},resize:function(){var _3f4=this.selectedChildWidget;if(_3f4&&!this._hasBeenShown){this._hasBeenShown=true;this._showChild(_3f4);}this.inherited(arguments);},_setupChild:function(_3f5){this.inherited(arguments);dojo.removeClass(_3f5.domNode,"dijitVisible");dojo.addClass(_3f5.domNode,"dijitHidden");_3f5.domNode.title="";},addChild:function(_3f6,_3f7){this.inherited(arguments);if(this._started){dojo.publish(this.id+"-addChild",[_3f6,_3f7]);this.layout();if(!this.selectedChildWidget){this.selectChild(_3f6);}}},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 _3f8=this.getChildren();if(_3f8.length){this.selectChild(_3f8[0]);}}}if(this._started){this.layout();}},selectChild:function(page,_3f9){page=dijit.byId(page);if(this.selectedChildWidget!=page){this._transition(page,this.selectedChildWidget,_3f9);this.selectedChildWidget=page;dojo.publish(this.id+"-selectChild",[page]);if(this.persist){dojo.cookie(this.id+"_selectedChild",this.selectedChildWidget.id);}}},_transition:function(_3fa,_3fb){if(_3fb){this._hideChild(_3fb);}this._showChild(_3fa);if(_3fa.resize){if(this.doLayout){_3fa.resize(this._containerContentBox||this._contentBox);}else{_3fa.resize();}}},_adjacent:function(_3fc){var _3fd=this.getChildren();var _3fe=dojo.indexOf(_3fd,this.selectedChildWidget);_3fe+=_3fc?1:_3fd.length-1;return _3fd[_3fe%_3fd.length];},forward:function(){this.selectChild(this._adjacent(true),true);},back:function(){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 _3ff=this.getChildren();page.isFirstChild=(page==_3ff[0]);page.isLastChild=(page==_3ff[_3ff.length-1]);page.selected=true;dojo.removeClass(page.domNode,"dijitHidden");dojo.addClass(page.domNode,"dijitVisible");page._onShow();},_hideChild:function(page){page.selected=false;dojo.removeClass(page.domNode,"dijitVisible");dojo.addClass(page.domNode,"dijitHidden");page.onHide();},closeChild:function(page){var _400=page.onClose(this,page);if(_400){this.removeChild(page);page.destroyRecursive();}},destroyDescendants:function(_401){dojo.forEach(this.getChildren(),function(_402){this.removeChild(_402);_402.destroyRecursive(_401);},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",_verticalSpace:0,baseClass:"dijitAccordionContainer",postCreate:function(){this.domNode.style.overflow="hidden";this.inherited(arguments);dijit.setWaiRole(this.domNode,"tablist");},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.selectedChildWidget){var _403=this.selectedChildWidget.containerNode.style;_403.display="";_403.overflow="auto";this.selectedChildWidget._wrapperWidget.set("selected",true);}},_getTargetHeight:function(node){var cs=dojo.getComputedStyle(node);return Math.max(this._verticalSpace-dojo._getPadBorderExtents(node,cs).h-dojo._getMarginExtents(node,cs).h,0);},layout:function(){var _404=this.selectedChildWidget;if(!_404){return;}var _405=_404._wrapperWidget.domNode,_406=dojo._getMarginExtents(_405),_407=dojo._getPadBorderExtents(_405),_408=this._contentBox;var _409=0;dojo.forEach(this.getChildren(),function(_40a){if(_40a!=_404){_409+=dojo.marginBox(_40a._wrapperWidget.domNode).h;}});this._verticalSpace=_408.h-_409-_406.h-_407.h-_404._buttonWidget.getTitleHeight();this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_406.w-_407.w};if(_404){_404.resize(this._containerContentBox);}},_setupChild:function(_40b){_40b._wrapperWidget=new dijit.layout._AccordionInnerContainer({contentWidget:_40b,buttonWidget:this.buttonWidget,id:_40b.id+"_wrapper",dir:_40b.dir,lang:_40b.lang,parent:this});this.inherited(arguments);},addChild:function(_40c,_40d){if(this._started){dojo.place(_40c.domNode,this.containerNode,_40d);if(!_40c._started){_40c.startup();}this._setupChild(_40c);dojo.publish(this.id+"-addChild",[_40c,_40d]);this.layout();if(!this.selectedChildWidget){this.selectChild(_40c);}}else{this.inherited(arguments);}},removeChild:function(_40e){_40e._wrapperWidget.destroy();delete _40e._wrapperWidget;dojo.removeClass(_40e.domNode,"dijitHidden");this.inherited(arguments);},getChildren:function(){return dojo.map(this.inherited(arguments),function(_40f){return _40f.declaredClass=="dijit.layout._AccordionInnerContainer"?_40f.contentWidget:_40f;},this);},destroy:function(){dojo.forEach(this.getChildren(),function(_410){_410._wrapperWidget.destroy();});this.inherited(arguments);},_transition:function(_411,_412,_413){if(this._inTransition){return;}var _414=[];var _415=this._verticalSpace;if(_411){_411._wrapperWidget.set("selected",true);this._showChild(_411);if(this.doLayout&&_411.resize){_411.resize(this._containerContentBox);}var _416=_411.domNode;dojo.addClass(_416,"dijitVisible");dojo.removeClass(_416,"dijitHidden");if(_413){var _417=_416.style.overflow;_416.style.overflow="hidden";_414.push(dojo.animateProperty({node:_416,duration:this.duration,properties:{height:{start:1,end:this._getTargetHeight(_416)}},onEnd:function(){_416.style.overflow=_417;if(dojo.isIE){setTimeout(function(){dojo.removeClass(_416.parentNode,"dijitAccordionInnerContainerFocused");setTimeout(function(){dojo.addClass(_416.parentNode,"dijitAccordionInnerContainerFocused");},0);},0);}}}));}}if(_412){_412._wrapperWidget.set("selected",false);var _418=_412.domNode;if(_413){var _419=_418.style.overflow;_418.style.overflow="hidden";_414.push(dojo.animateProperty({node:_418,duration:this.duration,properties:{height:{start:this._getTargetHeight(_418),end:1}},onEnd:function(){dojo.addClass(_418,"dijitHidden");dojo.removeClass(_418,"dijitVisible");_418.style.overflow=_419;if(_412.onHide){_412.onHide();}}}));}else{dojo.addClass(_418,"dijitHidden");dojo.removeClass(_418,"dijitVisible");if(_412.onHide){_412.onHide();}}}if(_413){this._inTransition=true;var _41a=dojo.fx.combine(_414);_41a.onEnd=dojo.hitch(this,function(){delete this._inTransition;});_41a.play();}},_onKeyPress:function(e,_41b){if(this._inTransition||this.disabled||e.altKey||!(_41b||e.ctrlKey)){if(this._inTransition){dojo.stopEvent(e);}return;}var k=dojo.keys,c=e.charOrCode;if((_41b&&(c==k.LEFT_ARROW||c==k.UP_ARROW))||(e.ctrlKey&&c==k.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();dojo.stopEvent(e);}else{if((_41b&&(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 _41c=this.contentWidget,cls=dojo.getObject(this.buttonWidget);this.button=_41c._buttonWidget=(new cls({contentWidget:_41c,label:_41c.title,title:_41c.tooltip,dir:_41c.dir,lang:_41c.lang,iconClass:_41c.iconClass,id:_41c.id+"_button",parent:this.parent})).placeAt(this.domNode);dojo.place(this.contentWidget.domNode,this.domNode);},postCreate:function(){this.inherited(arguments);this.connect(this.contentWidget,"set",function(name,_41d){var _41e={title:"label",tooltip:"title",iconClass:"iconClass"}[name];if(_41e){this.button.set(_41e,_41d);}},this);},_setSelectedAttr:function(_41f){this.selected=_41f;this.button.set("selected",_41f);if(_41f){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}},startup:function(){this.contentWidget.startup();},destroy:function(){this.button.destroyRecursive();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' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowTextUp' waiRole=\"presentation\">+</span\n\t\t><span class='arrowTextDown' waiRole=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" waiRole=\"presentation\"/>\n\t\t<span waiRole=\"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;},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);var _420=dojo.attr(this.domNode,"id").replace(" ","_");dojo.attr(this.titleTextNode,"id",_420+"_title");dijit.setWaiState(this.focusNode,"labelledby",dojo.attr(this.titleTextNode,"id"));},getTitleHeight:function(){return dojo.marginBox(this.domNode).h;},_onTitleClick:function(){var _421=this.getParent();if(!_421._inTransition){_421.selectChild(this.contentWidget,true);dijit.focus(this.focusNode);}},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedAttr:function(_422){this.selected=_422;dijit.setWaiState(this.focusNode,"expanded",_422);dijit.setWaiState(this.focusNode,"selected",_422);this.focusNode.setAttribute("tabIndex",_422?"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);},postCreate:function(){this.inherited(arguments);this._splitters={};this._splitterThickness={};},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_423){var _424=_423.region;if(_424){this.inherited(arguments);dojo.addClass(_423.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_424=="leading"){_424=ltr?"left":"right";}if(_424=="trailing"){_424=ltr?"right":"left";}this["_"+_424]=_423.domNode;this["_"+_424+"Widget"]=_423;if((_423.splitter||this.gutters)&&!this._splitters[_424]){var _425=dojo.getObject(_423.splitter?this._splitterClass:"dijit.layout._Gutter");var _426=new _425({id:_423.id+"_splitter",container:this,child:_423,region:_424,live:this.liveSplitters});_426.isSplitter=true;this._splitters[_424]=_426.domNode;dojo.place(this._splitters[_424],_423.domNode,"after");_426.startup();}_423.region=_424;}},_computeSplitterThickness:function(_427){this._splitterThickness[_427]=this._splitterThickness[_427]||dojo.marginBox(this._splitters[_427])[(/top|bottom/.test(_427)?"h":"w")];},layout:function(){for(var _428 in this._splitters){this._computeSplitterThickness(_428);}this._layoutChildren();},addChild:function(_429,_42a){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_42b){var _42c=_42b.region;var _42d=this._splitters[_42c];if(_42d){dijit.byNode(_42d).destroy();delete this._splitters[_42c];delete this._splitterThickness[_42c];}this.inherited(arguments);delete this["_"+_42c];delete this["_"+_42c+"Widget"];if(this._started){this._layoutChildren();}dojo.removeClass(_42b.domNode,this.baseClass+"Pane");},getChildren:function(){return dojo.filter(this.inherited(arguments),function(_42e){return !_42e.isSplitter;});},getSplitter:function(_42f){var _430=this._splitters[_42f];return _430?dijit.byNode(_430):null;},resize:function(_431,_432){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(_433,_434){if(!this._borderBox||!this._borderBox.h){return;}var _435=(this.design=="sidebar");var _436=0,_437=0,_438=0,_439=0;var _43a={},_43b={},_43c={},_43d={},_43e=(this._center&&this._center.style)||{};var _43f=/left|right/.test(_433);var _440=!_433||(!_43f&&!_435);var _441=!_433||(_43f&&_435);if(this._top){_43a=(_433=="top"||_441)&&this._top.style;_436=_433=="top"?_434:dojo.marginBox(this._top).h;}if(this._left){_43b=(_433=="left"||_440)&&this._left.style;_438=_433=="left"?_434:dojo.marginBox(this._left).w;}if(this._right){_43c=(_433=="right"||_440)&&this._right.style;_439=_433=="right"?_434:dojo.marginBox(this._right).w;}if(this._bottom){_43d=(_433=="bottom"||_441)&&this._bottom.style;_437=_433=="bottom"?_434:dojo.marginBox(this._bottom).h;}var _442=this._splitters;var _443=_442.top,_444=_442.bottom,_445=_442.left,_446=_442.right;var _447=this._splitterThickness;var _448=_447.top||0,_449=_447.left||0,_44a=_447.right||0,_44b=_447.bottom||0;if(_449>50||_44a>50){setTimeout(dojo.hitch(this,function(){this._splitterThickness={};for(var _44c in this._splitters){this._computeSplitterThickness(_44c);}this._layoutChildren();}),50);return false;}var pe=this.pe;var _44d={left:(_435?_438+_449:0)+pe.l+"px",right:(_435?_439+_44a:0)+pe.r+"px"};if(_443){dojo.mixin(_443.style,_44d);_443.style.top=_436+pe.t+"px";}if(_444){dojo.mixin(_444.style,_44d);_444.style.bottom=_437+pe.b+"px";}_44d={top:(_435?0:_436+_448)+pe.t+"px",bottom:(_435?0:_437+_44b)+pe.b+"px"};if(_445){dojo.mixin(_445.style,_44d);_445.style.left=_438+pe.l+"px";}if(_446){dojo.mixin(_446.style,_44d);_446.style.right=_439+pe.r+"px";}dojo.mixin(_43e,{top:pe.t+_436+_448+"px",left:pe.l+_438+_449+"px",right:pe.r+_439+_44a+"px",bottom:pe.b+_437+_44b+"px"});var _44e={top:_435?pe.t+"px":_43e.top,bottom:_435?pe.b+"px":_43e.bottom};dojo.mixin(_43b,_44e);dojo.mixin(_43c,_44e);_43b.left=pe.l+"px";_43c.right=pe.r+"px";_43a.top=pe.t+"px";_43d.bottom=pe.b+"px";if(_435){_43a.left=_43d.left=_438+_449+pe.l+"px";_43a.right=_43d.right=_439+_44a+pe.r+"px";}else{_43a.left=_43d.left=pe.l+"px";_43a.right=_43d.right=pe.r+"px";}var _44f=this._borderBox.h-pe.t-pe.b,_450=_44f-(_436+_448+_437+_44b),_451=_435?_44f:_450;var _452=this._borderBox.w-pe.l-pe.r,_453=_452-(_438+_449+_439+_44a),_454=_435?_453:_452;var dim={top:{w:_454,h:_436},bottom:{w:_454,h:_437},left:{w:_438,h:_451},right:{w:_439,h:_451},center:{h:_450,w:_453}};if(_433){var _455=this["_"+_433+"Widget"],mb={};mb[/top|bottom/.test(_433)?"h":"w"]=_434;_455.resize?_455.resize(mb,dim[_455.region]):dojo.marginBox(_455.domNode,mb);}var _456=dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.some(this.getChildren(),function(_457){return _457.domNode.tagName=="TEXTAREA"||_457.domNode.tagName=="INPUT";});if(_456){var _458=function(_459,_45a,_45b){if(_459){(_459.resize?_459.resize(_45a,_45b):dojo.marginBox(_459.domNode,_45a));}};if(_445){_445.style.height=_451;}if(_446){_446.style.height=_451;}_458(this._leftWidget,{h:_451},dim.left);_458(this._rightWidget,{h:_451},dim.right);if(_443){_443.style.width=_454;}if(_444){_444.style.width=_454;}_458(this._topWidget,{w:_454},dim.top);_458(this._bottomWidget,{w:_454},dim.bottom);_458(this._centerWidget,dim.center);}else{var _45c=!_433||(/top|bottom/.test(_433)&&this.design!="sidebar"),_45d=!_433||(/left|right/.test(_433)&&this.design=="sidebar"),_45e={center:true,left:_45c,right:_45c,top:_45d,bottom:_45d};dojo.forEach(this.getChildren(),function(_45f){if(_45f.resize&&_45e[_45f.region]){_45f.resize(null,dim[_45f.region]);}},this);}},destroy:function(){for(var _460 in this._splitters){var _461=this._splitters[_460];dijit.byNode(_461).destroy();dojo.destroy(_461);}delete this._splitters;delete this._splitterThickness;this.inherited(arguments);}});dojo.extend(dijit._Widget,{region:"",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\" waiRole=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",postCreate:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));this._factor=/top|left/.test(this.region)?1:-1;this._cookieName=this.container.id+"_"+this.region;if(this.container.persist){var _462=dojo.cookie(this._cookieName);if(_462){this.child.domNode.style[this.horizontal?"height":"width"]=_462;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_463=this.container._splitterThickness[this.region];var flip={left:"right",right:"left",top:"bottom",bottom:"top",leading:"trailing",trailing:"leading"},_464=this.container["_"+flip[this.region]];var _465=dojo.contentBox(this.container.domNode)[dim]-(_464?dojo.marginBox(_464)[dim]:0)-20-_463*2;return Math.min(this.child.maxSize,_465);},_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");dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");if(this.fake){dojo.removeClass(this.fake,"dijitSplitterHover");dojo.removeClass(this.fake,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover");}var _466=this._factor,max=this._computeMaxSize(),min=this.child.minSize||20,_467=this.horizontal,axis=_467?"pageY":"pageX",_468=e[axis],_469=this.domNode.style,dim=_467?"h":"w",_46a=dojo.marginBox(this.child.domNode)[dim],_46b=this.region,_46c=parseInt(this.domNode.style[_46b],10),_46d=this._resize,_46e=this.child.domNode,_46f=dojo.hitch(this.container,this.container._layoutChildren),de=dojo.doc;this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_470){var _471=e[axis]-_468,_472=_466*_471+_46a,_473=Math.max(Math.min(_472,max),min);if(_46d||_470){_46f(_46b,_473);}_469[_46b]=_466*_471+_46c+(_473-_472)+"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");dojo.removeClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");dojo.removeClass(this.domNode,"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 _474=this.horizontal;var tick=1;var dk=dojo.keys;switch(e.charOrCode){case _474?dk.UP_ARROW:dk.LEFT_ARROW:tick*=-1;case _474?dk.DOWN_ARROW:dk.RIGHT_ARROW:break;default:return;}var _475=dojo.marginBox(this.child.domNode)[_474?"h":"w"]+this._factor*tick;this.container._layoutChildren(this.region,Math.max(Math.min(_475,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\" waiRole=\"presentation\"></div>",postCreate:function(){this.horizontal=/top|bottom/.test(this.region);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);},postCreate: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 _476=this.tabPosition.replace(/-h/,"");this.tablist.layoutAlign=_476;var _477=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_476},{domNode:this.containerNode,layoutAlign:"client"}];dijit.layout.layoutChildren(this.domNode,this._contentBox,_477);this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_477[2]);if(sc&&sc.resize){sc.resize(this._containerContentBox);}}else{if(this.tablist.resize){this.tablist.resize({w:dojo.contentBox(this.domNode).w});}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 wairole='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 _478=0;for(var pane in this.pane2button){var ow=this.pane2button[pane].innerDiv.scrollWidth;_478=Math.max(_478,ow);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_478+"px";}}});dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",cssStateNodes:{closeNode:"dijitTabCloseButton"},templateString:dojo.cache("dijit.layout","templates/_TabButton.html","<div waiRole=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick'>\n <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n \t<div waiRole=\"presentation\" dojoAttachPoint='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" 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' waiRole=\"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,postMixInProperties:function(){if(!this.iconClass){this.iconClass="dijitTabButtonIcon";}},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.containerNode,false);if(this.iconNode.className=="dijitTabButtonIcon"){dojo.style(this.iconNode,"width","1px");}},startup:function(){this.inherited(arguments);var n=this.domNode;setTimeout(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(disp){this.closeButton=disp;dojo.toggleClass(this.innerDiv,"dijitClosable",disp);this.closeNode.style.display=disp?"":"none";if(disp){var _479=dojo.i18n.getLocalization("dijit","common");if(this.closeNode){dojo.attr(this.closeNode,"title",_479.itemClose);}var _479=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:_479.itemClose,dir:this.dir,lang:this.lang,onClick:dojo.hitch(this,"onClickCloseButton")}));}else{if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}}},_setLabelAttr:function(_47a){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._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\" iconClass=\"dijitTabStripMenuIcon\"\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 wairole='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"}),postCreate: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,_47b){this.inherited(arguments);var _47c;if(this.useMenu){var _47d=this.containerId;_47c=new dijit.MenuItem({id:page.id+"_stcMi",label:page.title,dir:page.dir,lang:page.lang,onClick:dojo.hitch(this,function(){var _47e=dijit.byId(_47d);_47e.selectChild(page);})});this._menuChildren[page.id]=_47c;this._menu.addChild(_47c,_47b);}this.pane2handles[page.id].push(this.connect(this.pane2button[page.id],"set",function(name,_47f){if(this._postStartup){if(name=="label"){if(_47c){_47c.set(name,_47f);}if(this._dim){this.resize(this._dim);}}}}));dojo.style(this.containerNode,"width",(dojo.style(this.containerNode,"width")+200)+"px");},onRemoveChild:function(page,_480){var _481=this.pane2button[page.id];if(this._selectedTab===_481.domNode){this._selectedTab=null;}if(this.useMenu&&page&&page.id&&this._menuChildren[page.id]){this._menu.removeChild(this._menuChildren[page.id]);this._menuChildren[page.id].destroy();delete this._menuChildren[page.id];}this.inherited(arguments);},_initButtons:function(){this._menuChildren={};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.marginBox(btn).w;return true;}else{dojo.style(btn,"display","none");return false;}},this);if(this.useMenu){this._menu=new dijit.Menu({id:this.id+"_menu",dir:this.dir,lang:this.lang,targetNodeIds:[this._menuBtn.domNode],leftClickToOpen:true,refocus:false});this._supportingWidgets.push(this._menu);}},_getTabsWidth:function(){var _482=this.getChildren();if(_482.length){var _483=_482[this.isLeftToRight()?0:_482.length-1].domNode,_484=_482[this.isLeftToRight()?_482.length-1:0].domNode;return _484.offsetLeft+dojo.style(_484,"width")-_483.offsetLeft;}else{return 0;}},_enableBtn:function(_485){var _486=this._getTabsWidth();_485=_485||dojo.style(this.scrollNode,"width");return _486>0&&_485<_486;},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 _487=this._enableBtn(this._contentBox.w);this._buttons.style("display",_487?"":"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;},_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 _488=dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width");return (dojo.isIE==8?-1:1)*(val-_488);}},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 _489=this.getChildren(),_48a=dojo.style(this.scrollNode,"width"),_48b=dojo.style(this.containerNode,"width"),_48c=_48b-_48a,_48d=this._getTabsWidth();if(_489.length&&_48d>_48a){return {min:this.isLeftToRight()?0:_489[_489.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_489[_489.length-1].domNode.offsetLeft+dojo.style(_489[_489.length-1].domNode,"width"))-_48a:_48c};}else{var _48e=this.isLeftToRight()?0:_48c;return {min:_48e,max:_48e};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_48f=dojo.style(this.scrollNode,"width"),_490=this._getScrollBounds();var pos=(n.offsetLeft+dojo.style(n,"width")/2)-_48f/2;pos=Math.min(Math.max(pos,_490.min),_490.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _491=this._getScrollBounds();x=Math.min(Math.max(x,_491.min),_491.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(_492,node){if(node&&dojo.hasClass(node,"dijitTabDisabled")){return;}var _493=dojo.style(this.scrollNode,"width");var d=(_493*0.75)*_492;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_494){var _495=this._getScrollBounds();this._leftBtn.set("disabled",_494<=_495.min);this._rightBtn.set("disabled",_494>=_495.max);}});dojo.declare("dijit.layout._ScrollingTabControllerButton",dijit.form.Button,{baseClass:"dijitTab tabStripButton",templateString:dojo.cache("dijit.layout","templates/_ScrollingTabControllerButton.html","<div dojoAttachEvent=\"onclick:_onButtonClick\">\n\t<div waiRole=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div waiRole=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img waiRole=\"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:"-1"});}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(_496){var cls=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_497=dojo.getObject(this.controllerWidget);return new _497({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},_496);},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.number.format=function(_498,_499){_499=dojo.mixin({},_499||{});var _49a=dojo.i18n.normalizeLocale(_499.locale),_49b=dojo.i18n.getLocalization("dojo.cldr","number",_49a);_499.customs=_49b;var _49c=_499.pattern||_49b[(_499.type||"decimal")+"Format"];if(isNaN(_498)||Math.abs(_498)==Infinity){return null;}return dojo.number._applyPattern(_498,_49c,_499);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_49d,_49e,_49f){_49f=_49f||{};var _4a0=_49f.customs.group,_4a1=_49f.customs.decimal,_4a2=_49e.split(";"),_4a3=_4a2[0];_49e=_4a2[(_49d<0)?1:0]||("-"+_4a3);if(_49e.indexOf("%")!=-1){_49d*=100;}else{if(_49e.indexOf("‰")!=-1){_49d*=1000;}else{if(_49e.indexOf("¤")!=-1){_4a0=_49f.customs.currencyGroup||_4a0;_4a1=_49f.customs.currencyDecimal||_4a1;_49e=_49e.replace(/\u00a4{1,3}/,function(_4a4){var prop=["symbol","currency","displayName"][_4a4.length-1];return _49f[prop]||_49f.currency||"";});}else{if(_49e.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _4a5=dojo.number._numberPatternRE;var _4a6=_4a3.match(_4a5);if(!_4a6){throw new Error("unable to find a number expression in pattern: "+_49e);}if(_49f.fractional===false){_49f.places=0;}return _49e.replace(_4a5,dojo.number._formatAbsolute(_49d,_4a6[0],{decimal:_4a1,group:_4a0,places:_49f.places,round:_49f.round}));};dojo.number.round=function(_4a7,_4a8,_4a9){var _4aa=10/(_4a9||10);return (_4aa*+_4a7).toFixed(_4a8)/_4aa;};if((0.9).toFixed()==0){(function(){var _4ab=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 _4ab(v,p,m)+(v>0?d:-d);};})();}dojo.number._formatAbsolute=function(_4ac,_4ad,_4ae){_4ae=_4ae||{};if(_4ae.places===true){_4ae.places=0;}if(_4ae.places===Infinity){_4ae.places=6;}var _4af=_4ad.split("."),_4b0=typeof _4ae.places=="string"&&_4ae.places.indexOf(","),_4b1=_4ae.places;if(_4b0){_4b1=_4ae.places.substring(_4b0+1);}else{if(!(_4b1>=0)){_4b1=(_4af[1]||[]).length;}}if(!(_4ae.round<0)){_4ac=dojo.number.round(_4ac,_4b1,_4ae.round);}var _4b2=String(Math.abs(_4ac)).split("."),_4b3=_4b2[1]||"";if(_4af[1]||_4ae.places){if(_4b0){_4ae.places=_4ae.places.substring(0,_4b0);}var pad=_4ae.places!==undefined?_4ae.places:(_4af[1]&&_4af[1].lastIndexOf("0")+1);if(pad>_4b3.length){_4b2[1]=dojo.string.pad(_4b3,pad,"0",true);}if(_4b1<_4b3.length){_4b2[1]=_4b3.substr(0,_4b1);}}else{if(_4b2[1]){_4b2.pop();}}var _4b4=_4af[0].replace(",","");pad=_4b4.indexOf("0");if(pad!=-1){pad=_4b4.length-pad;if(pad>_4b2[0].length){_4b2[0]=dojo.string.pad(_4b2[0],pad);}if(_4b4.indexOf("#")==-1){_4b2[0]=_4b2[0].substr(_4b2[0].length-pad);}}var _4b5=_4af[0].lastIndexOf(","),_4b6,_4b7;if(_4b5!=-1){_4b6=_4af[0].length-_4b5-1;var _4b8=_4af[0].substr(0,_4b5);_4b5=_4b8.lastIndexOf(",");if(_4b5!=-1){_4b7=_4b8.length-_4b5-1;}}var _4b9=[];for(var _4ba=_4b2[0];_4ba;){var off=_4ba.length-_4b6;_4b9.push((off>0)?_4ba.substr(off):_4ba);_4ba=(off>0)?_4ba.slice(0,off):"";if(_4b7){_4b6=_4b7;delete _4b7;}}_4b2[0]=_4b9.reverse().join(_4ae.group||",");return _4b2.join(_4ae.decimal||".");};dojo.number.regexp=function(_4bb){return dojo.number._parseInfo(_4bb).regexp;};dojo.number._parseInfo=function(_4bc){_4bc=_4bc||{};var _4bd=dojo.i18n.normalizeLocale(_4bc.locale),_4be=dojo.i18n.getLocalization("dojo.cldr","number",_4bd),_4bf=_4bc.pattern||_4be[(_4bc.type||"decimal")+"Format"],_4c0=_4be.group,_4c1=_4be.decimal,_4c2=1;if(_4bf.indexOf("%")!=-1){_4c2/=100;}else{if(_4bf.indexOf("‰")!=-1){_4c2/=1000;}else{var _4c3=_4bf.indexOf("¤")!=-1;if(_4c3){_4c0=_4be.currencyGroup||_4c0;_4c1=_4be.currencyDecimal||_4c1;}}}var _4c4=_4bf.split(";");if(_4c4.length==1){_4c4.push("-"+_4c4[0]);}var re=dojo.regexp.buildGroupRE(_4c4,function(_4c5){_4c5="(?:"+dojo.regexp.escapeString(_4c5,".")+")";return _4c5.replace(dojo.number._numberPatternRE,function(_4c6){var _4c7={signed:false,separator:_4bc.strict?_4c0:[_4c0,""],fractional:_4bc.fractional,decimal:_4c1,exponent:false},_4c8=_4c6.split("."),_4c9=_4bc.places;if(_4c8.length==1&&_4c2!=1){_4c8[1]="###";}if(_4c8.length==1||_4c9===0){_4c7.fractional=false;}else{if(_4c9===undefined){_4c9=_4bc.pattern?_4c8[1].lastIndexOf("0")+1:Infinity;}if(_4c9&&_4bc.fractional==undefined){_4c7.fractional=true;}if(!_4bc.places&&(_4c9<_4c8[1].length)){_4c9+=","+_4c8[1].length;}_4c7.places=_4c9;}var _4ca=_4c8[0].split(",");if(_4ca.length>1){_4c7.groupSize=_4ca.pop().length;if(_4ca.length>1){_4c7.groupSize2=_4ca.pop().length;}}return "("+dojo.number._realNumberRegexp(_4c7)+")";});},true);if(_4c3){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_4cb,_4cc,_4cd,_4ce){var prop=["symbol","currency","displayName"][_4cd.length-1],_4cf=dojo.regexp.escapeString(_4bc[prop]||_4bc.currency||"");_4cc=_4cc?"[\\s\\xa0]":"";_4ce=_4ce?"[\\s\\xa0]":"";if(!_4bc.strict){if(_4cc){_4cc+="*";}if(_4ce){_4ce+="*";}return "(?:"+_4cc+_4cf+_4ce+")?";}return _4cc+_4cf+_4ce;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_4c0,decimal:_4c1,factor:_4c2};};dojo.number.parse=function(_4d0,_4d1){var info=dojo.number._parseInfo(_4d1),_4d2=(new RegExp("^"+info.regexp+"$")).exec(_4d0);if(!_4d2){return NaN;}var _4d3=_4d2[1];if(!_4d2[1]){if(!_4d2[2]){return NaN;}_4d3=_4d2[2];info.factor*=-1;}_4d3=_4d3.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return _4d3*info.factor;};dojo.number._realNumberRegexp=function(_4d4){_4d4=_4d4||{};if(!("places" in _4d4)){_4d4.places=Infinity;}if(typeof _4d4.decimal!="string"){_4d4.decimal=".";}if(!("fractional" in _4d4)||/^0/.test(_4d4.places)){_4d4.fractional=[true,false];}if(!("exponent" in _4d4)){_4d4.exponent=[true,false];}if(!("eSigned" in _4d4)){_4d4.eSigned=[true,false];}var _4d5=dojo.number._integerRegexp(_4d4),_4d6=dojo.regexp.buildGroupRE(_4d4.fractional,function(q){var re="";if(q&&(_4d4.places!==0)){re="\\"+_4d4.decimal;if(_4d4.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_4d4.places+"}";}}return re;},true);var _4d7=dojo.regexp.buildGroupRE(_4d4.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_4d4.eSigned})+")";}return "";});var _4d8=_4d5+_4d6;if(_4d6){_4d8="(?:(?:"+_4d8+")|(?:"+_4d6+"))";}return _4d8+_4d7;};dojo.number._integerRegexp=function(_4d9){_4d9=_4d9||{};if(!("signed" in _4d9)){_4d9.signed=[true,false];}if(!("separator" in _4d9)){_4d9.separator="";}else{if(!("groupSize" in _4d9)){_4d9.groupSize=3;}}var _4da=dojo.regexp.buildGroupRE(_4d9.signed,function(q){return q?"[-+]":"";},true);var _4db=dojo.regexp.buildGroupRE(_4d9.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=dojo.regexp.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_4d9.groupSize,grp2=_4d9.groupSize2;if(grp2){var _4dc="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_4dc+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_4dc;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _4da+_4db;};}if(!dojo._hasResource["dijit.ProgressBar"]){dojo._hasResource["dijit.ProgressBar"]=true;dojo.provide("dijit.ProgressBar");dojo.declare("dijit.ProgressBar",[dijit._Widget,dijit._Templated],{progress:"0",maximum:100,places:0,indeterminate:false,name:"",templateString:dojo.cache("dijit","templates/ProgressBar.html","<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"),_indeterminateHighContrastImagePath:dojo.moduleUrl("dijit","themes/a11y/indeterminate_progress.gif"),postCreate:function(){this.inherited(arguments);this.indeterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath.toString());this.update();},update:function(_4dd){dojo.mixin(this,_4dd||{});var tip=this.internalProgress;var _4de=1,_4df;if(this.indeterminate){_4df="addClass";dijit.removeWaiState(tip,"valuenow");dijit.removeWaiState(tip,"valuemin");dijit.removeWaiState(tip,"valuemax");}else{_4df="removeClass";if(String(this.progress).indexOf("%")!=-1){_4de=Math.min(parseFloat(this.progress)/100,1);this.progress=_4de*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_4de=this.progress/this.maximum;}var text=this.report(_4de);this.label.firstChild.nodeValue=text;dijit.setWaiState(tip,"describedby",this.label.id);dijit.setWaiState(tip,"valuenow",this.progress);dijit.setWaiState(tip,"valuemin",0);dijit.setWaiState(tip,"valuemax",this.maximum);}dojo[_4df](this.domNode,"dijitProgressBarIndeterminate");tip.style.width=(_4de*100)+"%";this.onChange();},_setValueAttr:function(v){if(v==Infinity){this.update({indeterminate:true});}else{this.update({indeterminate:false,progress:v});}},_getValueAttr:function(){return this.progress;},report:function(_4e0){return dojo.number.format(_4e0,{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\" waiRole=\"presentation\"></div>",postCreate:function(){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\" waiRole=\"toolbar\" tabIndex=\"${tabIndex}\" dojoAttachPoint=\"containerNode\">"+"</div>",baseClass:"dijitToolbar",postCreate:function(){this.connectKeyNavHandlers(this.isLeftToRight()?[dojo.keys.LEFT_ARROW]:[dojo.keys.RIGHT_ARROW],this.isLeftToRight()?[dojo.keys.RIGHT_ARROW]:[dojo.keys.LEFT_ARROW]);this.inherited(arguments);},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,_4e1,_4e2,_4e3,_4e4){var _4e5=[];dojo.Deferred.call(this);var self=this;if(list.length===0&&!_4e1){this.resolve([0,[]]);}var _4e6=0;dojo.forEach(list,function(item,i){item.then(function(_4e7){if(_4e1){self.resolve([i,_4e7]);}else{_4e8(true,_4e7);}},function(_4e9){if(_4e2){self.reject(_4e9);}else{_4e8(false,_4e9);}if(_4e3){return null;}throw _4e9;});function _4e8(_4ea,_4eb){_4e5[i]=[_4ea,_4eb];_4e6++;if(_4e6===list.length){self.resolve(_4e5);}};});};dojo.DeferredList.prototype=new dojo.Deferred();dojo.DeferredList.prototype.gatherResults=function(_4ec){var d=new dojo.DeferredList(_4ec,false,true,false);d.addCallback(function(_4ed){var ret=[];dojo.forEach(_4ed,function(_4ee){ret.push(_4ee[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 _4ef=this.store;if(!_4ef.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_4ef.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([dojo.connect(_4ef,"onNew",this,"onNewItem"),dojo.connect(_4ef,"onDelete",this,"onDeleteItem"),dojo.connect(_4ef,"onSet",this,"onSetItem")]);}},destroy:function(){dojo.forEach(this.connects,dojo.disconnect);},getRoot:function(_4f0,_4f1){if(this.root){_4f0(this.root);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_4f2){if(_4f2.length!=1){throw new Error(this.declaredClass+": query "+dojo.toJson(this.query)+" returned "+_4f2.length+" items, but must return exactly one item");}this.root=_4f2[0];_4f0(this.root);}),onError:_4f1});}},mayHaveChildren:function(item){return dojo.some(this.childrenAttrs,function(attr){return this.store.hasAttribute(item,attr);},this);},getChildren:function(_4f3,_4f4,_4f5){var _4f6=this.store;if(!_4f6.isItemLoaded(_4f3)){var _4f7=dojo.hitch(this,arguments.callee);_4f6.loadItem({item:_4f3,onItem:function(_4f8){_4f7(_4f8,_4f4,_4f5);},onError:_4f5});return;}var _4f9=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_4f6.getValues(_4f3,this.childrenAttrs[i]);_4f9=_4f9.concat(vals);}var _4fa=0;if(!this.deferItemLoadingUntilExpand){dojo.forEach(_4f9,function(item){if(!_4f6.isItemLoaded(item)){_4fa++;}});}if(_4fa==0){_4f4(_4f9);}else{dojo.forEach(_4f9,function(item,idx){if(!_4f6.isItemLoaded(item)){_4f6.loadItem({item:item,onItem:function(item){_4f9[idx]=item;if(--_4fa==0){_4f4(_4f9);}},onError:_4f5});}});}},isItem:function(_4fb){return this.store.isItem(_4fb);},fetchItemByIdentity:function(_4fc){this.store.fetchItemByIdentity(_4fc);},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,_4fd,_4fe){var _4ff={parent:_4fd,attribute:this.childrenAttrs[0],insertIndex:_4fe};if(this.newItemIdAttr&&args[this.newItemIdAttr]){this.fetchItemByIdentity({identity:args[this.newItemIdAttr],scope:this,onItem:function(item){if(item){this.pasteItem(item,null,_4fd,true,_4fe);}else{this.store.newItem(args,_4ff);}}});}else{this.store.newItem(args,_4ff);}},pasteItem:function(_500,_501,_502,_503,_504){var _505=this.store,_506=this.childrenAttrs[0];if(_501){dojo.forEach(this.childrenAttrs,function(attr){if(_505.containsValue(_501,attr,_500)){if(!_503){var _507=dojo.filter(_505.getValues(_501,attr),function(x){return x!=_500;});_505.setValues(_501,attr,_507);}_506=attr;}});}if(_502){if(typeof _504=="number"){var _508=_505.getValues(_502,_506).slice();_508.splice(_504,0,_500);_505.setValues(_502,_506,_508);}else{_505.setValues(_502,_506,_505.getValues(_502,_506).concat(_500));}}},onChange:function(item){},onChildrenChange:function(_509,_50a){},onDelete:function(_50b,_50c){},onNewItem:function(item,_50d){if(!_50d){return;}this.getChildren(_50d.item,dojo.hitch(this,function(_50e){this.onChildrenChange(_50d.item,_50e);}));},onDeleteItem:function(item){this.onDelete(item);},onSetItem:function(item,_50f,_510,_511){if(dojo.indexOf(this.childrenAttrs,_50f)!=-1){this.getChildren(item,dojo.hitch(this,function(_512){this.onChildrenChange(item,_512);}));}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(_513){this.root={store:this,root:true,id:_513.rootId,label:_513.rootLabel,children:_513.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_514,_515,_516){if(_514===this.root){if(this.root.children){_515(this.root.children);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_517){this.root.children=_517;_515(_517);}),onError:_516});}}else{this.inherited(arguments);}},isItem:function(_518){return (_518===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_519){if(_519.identity==this.root.id){var _51a=_519.scope?_519.scope:dojo.global;if(_519.onItem){_519.onItem.call(_51a,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,_51b,_51c){if(_51b===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(args){},pasteItem:function(_51d,_51e,_51f,_520,_521){if(_51e===this.root){if(!_520){this.onLeaveRoot(_51d);}}dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_51d,_51e===this.root?null:_51e,_51f===this.root?null:_51f,_520,_521);if(_51f===this.root){this.onAddToRoot(_51d);}},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 _522=this.root.children||[];this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_523){this.root.children=_523;if(_522.length!=_523.length||dojo.some(_522,function(item,idx){return _523[idx]!=item;})){this.onChildrenChange(this.root,_523);}})});},onNewItem:function(item,_524){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(item){if(dojo.indexOf(this.root.children,item)!=-1){this._requeryTop();}this.inherited(arguments);}});}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\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t/><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" waiRole=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" waiRole=\"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"}}),postCreate:function(){this.inherited(arguments);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);}},_setIndentAttr:function(_525){this.indent=_525;var _526=(Math.max(_525,0)*this.tree._nodePixelIndent)+"px";dojo.style(this.domNode,"backgroundPosition",_526+" 0px");dojo.style(this.rowNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_526);dojo.forEach(this.getChildren(),function(_527){_527.set("indent",_525+1);});},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_528=tree.model;if(tree._v10Compat&&item===_528.root){item=null;}this._applyClassAndStyle(item,"icon","Icon");this._applyClassAndStyle(item,"label","Label");this._applyClassAndStyle(item,"row","Row");},_applyClassAndStyle:function(item,_529,_52a){var _52b="_"+_529+"Class";var _52c=_529+"Node";if(this[_52b]){dojo.removeClass(this[_52c],this[_52b]);}this[_52b]=this.tree["get"+_52a+"Class"](item,this.isExpanded);if(this[_52b]){dojo.addClass(this[_52c],this[_52b]);}dojo.style(this[_52c],this.tree["get"+_52a+"Style"](item,this.isExpanded)||{});},_updateLayout:function(){var _52d=this.getParent();if(!_52d||_52d.rowNode.style.display=="none"){dojo.addClass(this.domNode,"dijitTreeIsRoot");}else{dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_52e){var _52f=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_530=["*","-","+","*"],idx=_52e?0:(this.isExpandable?(this.isExpanded?1:2):3);dojo.removeClass(this.expandoNode,_52f);dojo.addClass(this.expandoNode,_52f[idx]);this.expandoNodeText.innerHTML=_530[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}this._wipeOut&&this._wipeOut.stop();this.isExpanded=true;dijit.setWaiState(this.labelNode,"expanded","true");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,_531=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new dojo.Deferred(function(){_531.stop();}));_531.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(_532){var tree=this.tree,_533=tree.model,defs=[];dojo.forEach(this.getChildren(),function(_534){dijit._Container.prototype.removeChild.call(this,_534);},this);this.state="LOADED";if(_532&&_532.length>0){this.isExpandable=true;dojo.forEach(_532,function(item){var id=_533.getIdentity(item),_535=tree._itemNodesMap[id],node;if(_535){for(var i=0;i<_535.length;i++){if(_535[i]&&!_535[i].getParent()){node=_535[i];node.set("indent",this.indent+1);break;}}}if(!node){node=this.tree._createTreeNode({item:item,tree:tree,isExpandable:_533.mayHaveChildren(item),label:tree.getLabel(item),tooltip:tree.getTooltip(item),dir:tree.dir,lang:tree.lang,indent:this.indent+1});if(_535){_535.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(_536,idx){_536._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);},removeChild:function(node){this.inherited(arguments);var _537=this.getChildren();if(_537.length==0){this.isExpandable=false;this.collapse();}dojo.forEach(_537,function(_538){_538._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(evt){this.tree._onNodeFocus(this);},setSelected:function(_539){dijit.setWaiState(this.labelNode,"selected",_539);dojo.toggleClass(this.rowNode,"dijitTreeRowSelected",_539);},setFocusable:function(_53a){this.labelNode.setAttribute("tabIndex",_53a?"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"],path:[],selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:dojo.cache("dijit","templates/Tree.html","<div class=\"dijitTree dijitTreeContainer\" waiRole=\"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:null,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(_53b,_53c){dojo.publish(this.id,[dojo.mixin({tree:this,event:_53b},_53c||{})]);},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 _53d={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_53d[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_53d);}},_store2model:function(){this._v10Compat=true;dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _53e={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_53e.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_53e.getChildren=dojo.hitch(this,function(item,_53f,_540){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_53f,_540);});}this.model=new dijit.tree.ForestStoreModel(_53e);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";}this.domNode.appendChild(rn.domNode);var _541=this.model.getIdentity(item);if(this._itemNodesMap[_541]){this._itemNodesMap[_541].push(rn);}else{this._itemNodesMap[_541]=[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 _542=dojo.isString(item)?item:this.model.getIdentity(item);return [].concat(this._itemNodesMap[_542]);},_setSelectedItemAttr:function(item){var _543=this.get("selectedItem");var _544=(!item||dojo.isString(item))?item:this.model.getIdentity(item);if(_544==_543?this.model.getIdentity(_543):null){return;}var _545=this._itemNodesMap[_544];this._selectNode((_545&&_545[0])||null);},_getSelectedItemAttr:function(){return this.selectedNode&&this.selectedNode.item;},_setPathAttr:function(path){var d=new dojo.Deferred();this._selectNode(null);if(!path||!path.length){d.resolve(true);return d;}this._loadDeferred.addCallback(dojo.hitch(this,function(){if(!this.rootNode){d.reject(new Error("!this.rootNode"));return;}if(path[0]!==this.rootNode.item&&(dojo.isString(path[0])&&path[0]!=this.model.getIdentity(this.rootNode.item))){d.reject(new Error(this.id+":path[0] doesn't match this.rootNode.item. Maybe you are using the wrong tree."));return;}path.shift();var node=this.rootNode;function _546(){var item=path.shift(),_547=dojo.isString(item)?item:this.model.getIdentity(item);dojo.some(this._itemNodesMap[_547],function(n){if(n.getParent()==node){node=n;return true;}return false;});if(path.length){this._expandNode(node).addCallback(dojo.hitch(this,_546));}else{this._selectNode(node);d.resolve(true);}};this._expandNode(node).addCallback(dojo.hitch(this,_546));}));return d;},_getPathAttr:function(){if(!this.selectedNode){return;}var res=[];var _548=this.selectedNode;while(_548&&_548!==this.rootNode){res.unshift(_548.item);_548=_548.getParent();}res.unshift(this.rootNode.item);return res;},mayHaveChildren:function(item){},getItemChildren:function(_549,_54a){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_54b){return (!item||this.model.mayHaveChildren(item))?(_54b?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(item,_54c){},getRowClass:function(item,_54d){},getIconStyle:function(item,_54e){},getLabelStyle:function(item,_54f){},getRowStyle:function(item,_550){},getTooltip:function(item){return "";},_onKeyPress:function(e){if(e.altKey){return;}var dk=dojo.keys;var _551=dijit.getEnclosingWidget(e.target);if(!_551){return;}var key=e.charOrCode;if(typeof key=="string"){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_551,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[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:_551,item:_551.item,evt:e});dojo.stopEvent(e);}}},_onEnterKey:function(_552,evt){this._publish("execute",{item:_552.item,node:_552.node});this._selectNode(_552.node);this.onClick(_552.item,_552.node,evt);},_onDownArrow:function(_553){var node=this._getNextNode(_553.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_554){var node=_554.node;var _555=node.getPreviousSibling();if(_555){node=_555;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _556=node.getChildren();node=_556[_556.length-1];}}else{var _557=node.getParent();if(!(!this.showRoot&&_557===this.rootNode)){node=_557;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_558){var node=_558.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(_559){var node=_559.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{var _55a=node.getParent();if(_55a&&_55a.isTreeNode&&!(!this.showRoot&&_55a===this.rootNode)){this.focusNode(_55a);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(_55b){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(_55c){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_55c.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_55c.key,startNode:_55c.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);}}},_onClick:function(_55d,e){var _55e=e.target,_55f=(_55e==_55d.expandoNode||_55e==_55d.expandoNodeText);if((this.openOnClick&&_55d.isExpandable)||_55f){if(_55d.isExpandable){this._onExpandoClick({node:_55d});}}else{this._publish("execute",{item:_55d.item,node:_55d,evt:e});this.onClick(_55d.item,_55d,e);this.focusNode(_55d);}if(!_55f){this._selectNode(_55d);}dojo.stopEvent(e);},_onDblClick:function(_560,e){var _561=e.target,_562=(_561==_560.expandoNode||_561==_560.expandoNodeText);if((this.openOnDblClick&&_560.isExpandable)||_562){if(_560.isExpandable){this._onExpandoClick({node:_560});}}else{this._publish("execute",{item:_560.item,node:_560,evt:e});this.onDblClick(_560.item,_560,e);this.focusNode(_560);}if(!_562){this._selectNode(_560);}dojo.stopEvent(e);},_onExpandoClick:function(_563){var node=_563.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 _564=node.getNextSibling();if(_564){return _564;}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,_565){if(node._expandNodeDeferred&&!_565){return node._expandNodeDeferred;}var _566=this.model,item=node.item,_567=this;switch(node.state){case "UNCHECKED":node.markProcessing();var def=(node._expandNodeDeferred=new dojo.Deferred());_566.getChildren(item,function(_568){node.unmarkProcessing();var scid=node.setChildItems(_568);var ed=_567._expandNode(node,true);scid.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_567,": 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);},_selectNode:function(node){if(this.selectedNode&&!this.selectedNode._destroyed){this.selectedNode.setSelected(false);}if(node){node.setSelected(true);}this.selectedNode=node;},_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 _569=this.model,_56a=_569.getIdentity(item),_56b=this._itemNodesMap[_56a];if(_56b){var _56c=this.getLabel(item),_56d=this.getTooltip(item);dojo.forEach(_56b,function(node){node.set({item:item,label:_56c,tooltip:_56d});node._updateItemClasses(item);});}},_onItemChildrenChange:function(_56e,_56f){var _570=this.model,_571=_570.getIdentity(_56e),_572=this._itemNodesMap[_571];if(_572){dojo.forEach(_572,function(_573){_573.setChildItems(_56f);});}},_onItemDelete:function(item){var _574=this.model,_575=_574.getIdentity(item),_576=this._itemNodesMap[_575];if(_576){dojo.forEach(_576,function(node){var _577=node.getParent();if(_577){_577.removeChild(node);}node.destroyRecursive();});delete this._itemNodesMap[_575];}},_initState:function(){if(this.persist){var _578=dojo.cookie(this.cookieName);this._openedItemIds={};if(_578){dojo.forEach(_578.split(","),function(item){this._openedItemIds[item]=true;},this);}}},_state:function(item,_579){if(!this.persist){return false;}var id=this.model.getIdentity(item);if(arguments.length===1){return this._openedItemIds[id];}if(_579){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(_57a){if(_57a){dojo.marginBox(this.domNode,_57a);dojo.style(this.domNode,"overflow","auto");}this._nodePixelIndent=dojo.marginBox(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.Container"]){dojo._hasResource["dojo.dnd.Container"]=true;dojo.provide("dojo.dnd.Container");dojo.declare("dojo.dnd.Container",null,{skipForm:false,constructor:function(node,_57b){this.node=dojo.byId(node);if(!_57b){_57b={};}this.creator=_57b.creator||null;this.skipForm=_57b.skipForm;this.parent=_57b.dropParent&&dojo.byId(_57b.dropParent);this.map={};this.current=null;this.containerState="";dojo.addClass(this.node,"dojoDndContainer");if(!(_57b&&_57b._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,_57c,_57d){if(!this.parent.firstChild){_57d=null;}else{if(_57c){if(!_57d){_57d=this.parent.firstChild;}}else{if(_57d){_57d=_57d.nextSibling;}}}if(_57d){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,_57d);}}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(_57e,node){_57e._skipStartup=true;return new dojo.dnd.Container(node,_57e);},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,_57f){var _580="dojoDnd"+type;var _581=type.toLowerCase()+"State";dojo.removeClass(this.node,_580+this[_581]);dojo.addClass(this.node,_580+_57f);this[_581]=_57f;},_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 _582=node.parentNode;_582;node=_582,_582=node.parentNode){if(_582==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 _583=item&&dojo.isObject(item),data,type,n;if(_583&&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=(_583&&item.data)?item.data:item;type=(_583&&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.declare("dijit.tree._dndContainer",null,{constructor:function(tree,_584){this.tree=tree;this.node=tree.domNode;dojo.mixin(this,_584);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 node=this.selection[key],ret={data:dijit.getEnclosingWidget(node),type:["treeNode"]};return ret;},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.node=this.parent=null;},onMouseOver:function(_585,evt){this.current=_585.rowNode;this.currentWidget=_585;},onMouseOut:function(_586,evt){this.current=null;this.currentWidget=null;},_changeState:function(type,_587){var _588="dojoDnd"+type;var _589=type.toLowerCase()+"State";dojo.removeClass(this.node,_588+this[_589]);dojo.addClass(this.node,_588+_587);this[_589]=_587;},_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,_58a){this.selection={};this.anchor=null;this.simpleSelection=false;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,getSelectedNodes:function(){return this.selection;},selectNone:function(){return this._removeSelection()._removeAnchor();},destroy:function(){this.inherited(arguments);this.selection=this.anchor=null;},onMouseDown:function(e){if(!this.current){return;}if(e.button==dojo.mouseButtons.RIGHT){return;}var _58b=dijit.getEnclosingWidget(this.current),id=_58b.id+"-dnd";if(!dojo.hasAttr(this.current,"id")){dojo.attr(this.current,"id",id);}if(!this.singular&&!dojo.isCopyKey(e)&&!e.shiftKey&&(this.current.id in this.selection)){this.simpleSelection=true;dojo.stopEvent(e);return;}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]=this.current;}}else{if(!this.singular&&e.shiftKey){if(dojo.isCopyKey(e)){}else{}}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]=this.current;}}}else{if(!(id in this.selection)){this.selectNone();this.anchor=this.current;this._addItemClass(this.current,"Anchor");this.selection[id]=this.current;}}}}dojo.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]=this.current;}},onMouseMove:function(e){this.simpleSelection=false;},_removeSelection:function(){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;},_removeAnchor:function(){if(this.anchor){this._removeItemClass(this.anchor,"Anchor");this.anchor=null;}return this;},forInSelectedItems:function(f,o){o=o||dojo.global;for(var id in this.selection){console.log("selected item id: "+id);f.call(o,this.getItem(id),id,this);}}});}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(_58c){this.manager=_58c;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"}}),_58d=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:_58d.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(_58d.creator){node=_58d._normalizedCreator(_58d.getItem(this.manager.nodes[i].id).data,"avatar").node;}else{node=this.manager.nodes[i].cloneNode(true);if(node.tagName.toLowerCase()=="tr"){var _58e=dojo.create("table"),_58f=dojo.create("tbody",null,_58e);_58f.appendChild(node);node=_58e;}}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(_590){if(this.avatar){this.target=(_590&&_590.targetState!="Disabled")?_590:null;this.canDropFlag=Boolean(this.target);this.avatar.update();}dojo.publish("/dnd/source/over",[_590]);},outSource:function(_591){if(this.avatar){if(this.target==_591){this.target=null;this.canDropFlag=false;this.avatar.update();dojo.publish("/dnd/source/over",[null]);}}else{dojo.publish("/dnd/source/over",[null]);}},startDrag:function(_592,_593,copy){this.source=_592;this.nodes=_593;this.copy=Boolean(copy);this.avatar=this.makeAvatar();dojo.body().appendChild(this.avatar.node);dojo.publish("/dnd/start",[_592,_593,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 _594=Boolean(this.target&&flag);if(this.canDropFlag!=_594){this.canDropFlag=_594;this.avatar.update();}},stopDrag:function(){dojo.removeClass(dojo.body(),"dojoDndCopy");dojo.removeClass(dojo.body(),"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))),_595=[this.source,this.nodes,copy,this.target,e];dojo.publish("/dnd/drop/before",_595);dojo.publish("/dnd/drop",_595);}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.removeClass(dojo.body(),"dojoDnd"+(this.copy?"Move":"Copy"));dojo.addClass(dojo.body(),"dojoDnd"+(this.copy?"Copy":"Move"));}});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,_596){if(!_596){_596={};}dojo.mixin(this,_596);this.isSource=typeof _596.isSource=="undefined"?true:_596.isSource;var type=_596.accept instanceof Array?_596.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(_597,_598){return true;},copyState:function(_599){return this.copyOnly||_599;},destroy:function(){this.inherited("destroy",arguments);dojo.forEach(this.topics,dojo.unsubscribe);this.targetAnchor=null;},_onDragMouse:function(e){var m=dojo.dnd.manager(),_59a=this.targetAnchor,_59b=this.current,_59c=this.currentWidget,_59d=this.dropPosition;var _59e="Over";if(_59b&&this.betweenThreshold>0){if(!this.targetBox||_59a!=_59b){this.targetBox=dojo.position(_59b,true);}if((e.pageY-this.targetBox.y)<=this.betweenThreshold){_59e="Before";}else{if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){_59e="After";}}}if(_59b!=_59a||_59e!=_59d){if(_59a){this._removeItemClass(_59a,_59d);}if(_59b){this._addItemClass(_59b,_59e);}if(!_59b){m.canDrop(false);}else{if(_59c==this.tree.rootNode&&_59e!="Over"){m.canDrop(false);}else{if(m.source==this&&(_59b.id in this.selection)){m.canDrop(false);}else{if(this.checkItemAcceptance(_59b,m.source,_59e.toLowerCase())&&!this._isParentChildDrop(m.source,_59b)){m.canDrop(true);}else{m.canDrop(false);}}}}this.targetAnchor=_59b;this.dropPosition=_59e;}},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 n=this.getSelectedNodes();var _59f=[];for(var i in n){_59f.push(n[i]);}if(_59f.length){m.startDrag(this,_59f,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("onMouseDown",arguments);},onMouseUp:function(e){if(this.mouseDown){this.mouseDown=false;this.inherited("onMouseUp",arguments);}},onMouseOut:function(){this.inherited(arguments);this._unmarkTargetAnchor();},checkItemAcceptance:function(_5a0,_5a1,_5a2){return true;},onDndSourceOver:function(_5a3){if(this!=_5a3){this.mouseDown=false;this._unmarkTargetAnchor();}else{if(this.isDragging){var m=dojo.dnd.manager();m.canDrop(false);}}},onDndStart:function(_5a4,_5a5,copy){if(this.isSource){this._changeState("Source",this==_5a4?(copy?"Copied":"Moved"):"");}var _5a6=this.checkAcceptance(_5a4,_5a5);this._changeState("Target",_5a6?"":"Disabled");if(this==_5a4){dojo.dnd.manager().overSource(this);}this.isDragging=true;},itemCreator:function(_5a7,_5a8,_5a9){return dojo.map(_5a7,function(node){return {"id":node.id,"name":node.textContent||node.innerText||""};});},onDndDrop:function(_5aa,_5ab,copy){if(this.containerState=="Over"){var tree=this.tree,_5ac=tree.model,_5ad=this.targetAnchor,_5ae=false;this.isDragging=false;var _5af=dijit.getEnclosingWidget(_5ad);var _5b0;var _5b1;_5b0=(_5af&&_5af.item)||tree.item;if(this.dropPosition=="Before"||this.dropPosition=="After"){_5b0=(_5af.getParent()&&_5af.getParent().item)||tree.item;_5b1=_5af.getIndexInParent();if(this.dropPosition=="After"){_5b1=_5af.getIndexInParent()+1;}}else{_5b0=(_5af&&_5af.item)||tree.item;}var _5b2;dojo.forEach(_5ab,function(node,idx){var _5b3=_5aa.getItem(node.id);if(dojo.indexOf(_5b3.type,"treeNode")!=-1){var _5b4=_5b3.data,_5b5=_5b4.item,_5b6=_5b4.getParent().item;}if(_5aa==this){if(typeof _5b1=="number"){if(_5b0==_5b6&&_5b4.getIndexInParent()<_5b1){_5b1-=1;}}_5ac.pasteItem(_5b5,_5b6,_5b0,copy,_5b1);}else{if(_5ac.isItem(_5b5)){_5ac.pasteItem(_5b5,_5b6,_5b0,copy,_5b1);}else{if(!_5b2){_5b2=this.itemCreator(_5ab,_5ad,_5aa);}_5ac.newItem(_5b2[idx],_5b0,_5b1);}}},this);this.tree._expandNode(_5af);}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(_5b7,_5b8){if(!_5b7.tree||_5b7.tree!=this.tree){return false;}var root=_5b7.tree.domNode;var ids={};for(var x in _5b7.selection){ids[_5b7.selection[x].parentNode.id]=true;}var node=_5b8.parentNode;while(node!=root&&(!node.id||!ids[node.id])){node=node.parentNode;}return node.id&&ids[node.id];},_unmarkTargetAnchor:function(){if(!this.targetAnchor){return;}this._removeItemClass(this.targetAnchor,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(_5b9){this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._jsonFileUrl=_5b9.url;this._ccUrl=_5b9.url;this.url=_5b9.url;this._jsonData=_5b9.data;this.data=null;this._datatypeMap=_5b9.typeMap||{};if(!this._datatypeMap["Date"]){this._datatypeMap["Date"]={type:Date,deserialize:function(_5ba){return dojo.date.stamp.fromISOString(_5ba);}};}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(_5b9.urlPreventCache!==undefined){this.urlPreventCache=_5b9.urlPreventCache?true:false;}if(_5b9.hierarchical!==undefined){this.hierarchical=_5b9.hierarchical?true:false;}if(_5b9.clearOnClose){this.clearOnClose=true;}if("failOk" in _5b9){this.failOk=_5b9.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(_5bb){if(typeof _5bb!=="string"){throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");}},getValue:function(item,_5bc,_5bd){var _5be=this.getValues(item,_5bc);return (_5be.length>0)?_5be[0]:_5bd;},getValues:function(item,_5bf){this._assertIsItem(item);this._assertIsAttribute(_5bf);return (item[_5bf]||[]).slice(0);},getAttributes:function(item){this._assertIsItem(item);var _5c0=[];for(var key in item){if((key!==this._storeRefPropName)&&(key!==this._itemNumPropName)&&(key!==this._rootItemPropName)&&(key!==this._reverseRefMap)){_5c0.push(key);}}return _5c0;},hasAttribute:function(item,_5c1){this._assertIsItem(item);this._assertIsAttribute(_5c1);return (_5c1 in item);},containsValue:function(item,_5c2,_5c3){var _5c4=undefined;if(typeof _5c3==="string"){_5c4=dojo.data.util.filter.patternToRegExp(_5c3,false);}return this._containsValue(item,_5c2,_5c3,_5c4);},_containsValue:function(item,_5c5,_5c6,_5c7){return dojo.some(this.getValues(item,_5c5),function(_5c8){if(_5c8!==null&&!dojo.isObject(_5c8)&&_5c7){if(_5c8.toString().match(_5c7)){return true;}}else{if(_5c6===_5c8){return true;}}});},isItem:function(_5c9){if(_5c9&&_5c9[this._storeRefPropName]===this){if(this._arrayOfAllItems[_5c9[this._itemNumPropName]]===_5c9){return true;}}return false;},isItemLoaded:function(_5ca){return this.isItem(_5ca);},loadItem:function(_5cb){this._assertIsItem(_5cb.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(_5cc,_5cd,_5ce){var self=this,_5cf=function(_5d0,_5d1){var _5d2=[],i,key;if(_5d0.query){var _5d3,_5d4=_5d0.queryOptions?_5d0.queryOptions.ignoreCase:false;var _5d5={};for(key in _5d0.query){_5d3=_5d0.query[key];if(typeof _5d3==="string"){_5d5[key]=dojo.data.util.filter.patternToRegExp(_5d3,_5d4);}else{if(_5d3 instanceof RegExp){_5d5[key]=_5d3;}}}for(i=0;i<_5d1.length;++i){var _5d6=true;var _5d7=_5d1[i];if(_5d7===null){_5d6=false;}else{for(key in _5d0.query){_5d3=_5d0.query[key];if(!self._containsValue(_5d7,key,_5d3,_5d5[key])){_5d6=false;}}}if(_5d6){_5d2.push(_5d7);}}_5cd(_5d2,_5d0);}else{for(i=0;i<_5d1.length;++i){var item=_5d1[i];if(item!==null){_5d2.push(item);}}_5cd(_5d2,_5d0);}};if(this._loadFinished){_5cf(_5cc,this._getItemsArray(_5cc.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==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_5cc,filter:_5cf});}else{this._loadInProgress=true;var _5d8={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _5d9=dojo.xhrGet(_5d8);_5d9.addCallback(function(data){try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;_5cf(_5cc,self._getItemsArray(_5cc.queryOptions));self._handleQueuedFetches();}catch(e){self._loadFinished=true;self._loadInProgress=false;_5ce(e,_5cc);}});_5d9.addErrback(function(_5da){self._loadInProgress=false;_5ce(_5da,_5cc);});var _5db=null;if(_5cc.abort){_5db=_5cc.abort;}_5cc.abort=function(){var df=_5d9;if(df&&df.fired===-1){df.cancel();df=null;}if(_5db){_5db.call(_5cc);}};}}else{if(this._jsonData){try{this._loadFinished=true;this._getItemsFromLoadedData(this._jsonData);this._jsonData=null;_5cf(_5cc,this._getItemsArray(_5cc.queryOptions));}catch(e){_5ce(e,_5cc);}}else{_5ce(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_5cc);}}}},_handleQueuedFetches:function(){if(this._queuedFetches.length>0){for(var i=0;i<this._queuedFetches.length;i++){var _5dc=this._queuedFetches[i],_5dd=_5dc.args,_5de=_5dc.filter;if(_5de){_5de(_5dd,this._getItemsArray(_5dd.queryOptions));}else{this.fetchItemByIdentity(_5dd);}}this._queuedFetches=[];}},_getItemsArray:function(_5df){if(_5df&&_5df.deep){return this._arrayOfAllItems;}return this._arrayOfTopLevelItems;},close:function(_5e0){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(_5e1){var _5e2=false,self=this;function _5e3(_5e4){var _5e5=((_5e4!==null)&&(typeof _5e4==="object")&&(!dojo.isArray(_5e4)||_5e2)&&(!dojo.isFunction(_5e4))&&(_5e4.constructor==Object||dojo.isArray(_5e4))&&(typeof _5e4._reference==="undefined")&&(typeof _5e4._type==="undefined")&&(typeof _5e4._value==="undefined")&&self.hierarchical);return _5e5;};function _5e6(_5e7){self._arrayOfAllItems.push(_5e7);for(var _5e8 in _5e7){var _5e9=_5e7[_5e8];if(_5e9){if(dojo.isArray(_5e9)){var _5ea=_5e9;for(var k=0;k<_5ea.length;++k){var _5eb=_5ea[k];if(_5e3(_5eb)){_5e6(_5eb);}}}else{if(_5e3(_5e9)){_5e6(_5e9);}}}}};this._labelAttr=_5e1.label;var i,item;this._arrayOfAllItems=[];this._arrayOfTopLevelItems=_5e1.items;for(i=0;i<this._arrayOfTopLevelItems.length;++i){item=this._arrayOfTopLevelItems[i];if(dojo.isArray(item)){_5e2=true;}_5e6(item);item[this._rootItemPropName]=true;}var _5ec={},key;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){if(key!==this._rootItemPropName){var _5ed=item[key];if(_5ed!==null){if(!dojo.isArray(_5ed)){item[key]=[_5ed];}}else{item[key]=[null];}}_5ec[key]=key;}}while(_5ec[this._storeRefPropName]){this._storeRefPropName+="_";}while(_5ec[this._itemNumPropName]){this._itemNumPropName+="_";}while(_5ec[this._reverseRefMap]){this._reverseRefMap+="_";}var _5ee;var _5ef=_5e1.identifier;if(_5ef){this._itemsByIdentity={};this._features["dojo.data.api.Identity"]=_5ef;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];_5ee=item[_5ef];var _5f0=_5ee[0];if(!this._itemsByIdentity[_5f0]){this._itemsByIdentity[_5f0]=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: ["+_5ef+"]. Value collided: ["+_5f0+"]");}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: ["+_5ef+"]. Value collided: ["+_5f0+"]");}}}}}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){_5ee=item[key];for(var j=0;j<_5ee.length;++j){_5ed=_5ee[j];if(_5ed!==null&&typeof _5ed=="object"){if(("_type" in _5ed)&&("_value" in _5ed)){var type=_5ed._type;var _5f1=this._datatypeMap[type];if(!_5f1){throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+type+"'");}else{if(dojo.isFunction(_5f1)){_5ee[j]=new _5f1(_5ed._value);}else{if(dojo.isFunction(_5f1.deserialize)){_5ee[j]=_5f1.deserialize(_5ed._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(_5ed._reference){var _5f2=_5ed._reference;if(!dojo.isObject(_5f2)){_5ee[j]=this._getItemByIdentity(_5f2);}else{for(var k=0;k<this._arrayOfAllItems.length;++k){var _5f3=this._arrayOfAllItems[k],_5f4=true;for(var _5f5 in _5f2){if(_5f3[_5f5]!=_5f2[_5f5]){_5f4=false;}}if(_5f4){_5ee[j]=_5f3;}}}if(this.referenceIntegrity){var _5f6=_5ee[j];if(this.isItem(_5f6)){this._addReferenceToMap(_5f6,item,key);}}}else{if(this.isItem(_5ed)){if(this.referenceIntegrity){this._addReferenceToMap(_5ed,item,key);}}}}}}}},_addReferenceToMap:function(_5f7,_5f8,_5f9){},getIdentity:function(item){var _5fa=this._features["dojo.data.api.Identity"];if(_5fa===Number){return item[this._itemNumPropName];}else{var _5fb=item[_5fa];if(_5fb){return _5fb[0];}}return null;},fetchItemByIdentity:function(_5fc){var item,_5fd;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:_5fc});}else{this._loadInProgress=true;var _5fe={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _5ff=dojo.xhrGet(_5fe);_5ff.addCallback(function(data){var _600=_5fc.scope?_5fc.scope:dojo.global;try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;item=self._getItemByIdentity(_5fc.identity);if(_5fc.onItem){_5fc.onItem.call(_600,item);}self._handleQueuedFetches();}catch(error){self._loadInProgress=false;if(_5fc.onError){_5fc.onError.call(_600,error);}}});_5ff.addErrback(function(_601){self._loadInProgress=false;if(_5fc.onError){var _602=_5fc.scope?_5fc.scope:dojo.global;_5fc.onError.call(_602,_601);}});}}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;item=self._getItemByIdentity(_5fc.identity);if(_5fc.onItem){_5fd=_5fc.scope?_5fc.scope:dojo.global;_5fc.onItem.call(_5fd,item);}}}}else{item=this._getItemByIdentity(_5fc.identity);if(_5fc.onItem){_5fd=_5fc.scope?_5fc.scope:dojo.global;_5fc.onItem.call(_5fd,item);}}},_getItemByIdentity:function(_603){var item=null;if(this._itemsByIdentity){item=this._itemsByIdentity[_603];}else{item=this._arrayOfAllItems[_603];}if(item===undefined){item=null;}return item;},getIdentityAttributes:function(item){var _604=this._features["dojo.data.api.Identity"];if(_604===Number){return null;}else{return [_604];}},_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==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){var _605={url:this._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk,sync:true};var _606=dojo.xhrGet(_605);_606.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;}});_606.addErrback(function(_607){throw _607;});}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(_608){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(_608&&(_608.referenceIntegrity===false)){this.referenceIntegrity=false;}this._saveInProgress=false;},referenceIntegrity:true,_assert:function(_609){if(!_609){throw new Error("assertion failed in ItemFileWriteStore");}},_getIdentifierAttribute:function(){var _60a=this.getFeatures()["dojo.data.api.Identity"];return _60a;},newItem:function(_60b,_60c){this._assert(!this._saveInProgress);if(!this._loadFinished){this._forceLoad();}if(typeof _60b!="object"&&typeof _60b!="undefined"){throw new Error("newItem() was passed something other than an object");}var _60d=null;var _60e=this._getIdentifierAttribute();if(_60e===Number){_60d=this._arrayOfAllItems.length;}else{_60d=_60b[_60e];if(typeof _60d==="undefined"){throw new Error("newItem() was not passed an identity for the new item");}if(dojo.isArray(_60d)){throw new Error("newItem() was not passed an single-valued identity");}}if(this._itemsByIdentity){this._assert(typeof this._itemsByIdentity[_60d]==="undefined");}this._assert(typeof this._pending._newItems[_60d]==="undefined");this._assert(typeof this._pending._deletedItems[_60d]==="undefined");var _60f={};_60f[this._storeRefPropName]=this;_60f[this._itemNumPropName]=this._arrayOfAllItems.length;if(this._itemsByIdentity){this._itemsByIdentity[_60d]=_60f;_60f[_60e]=[_60d];}this._arrayOfAllItems.push(_60f);var _610=null;if(_60c&&_60c.parent&&_60c.attribute){_610={item:_60c.parent,attribute:_60c.attribute,oldValue:undefined};var _611=this.getValues(_60c.parent,_60c.attribute);if(_611&&_611.length>0){var _612=_611.slice(0,_611.length);if(_611.length===1){_610.oldValue=_611[0];}else{_610.oldValue=_611.slice(0,_611.length);}_612.push(_60f);this._setValueOrValues(_60c.parent,_60c.attribute,_612,false);_610.newValue=this.getValues(_60c.parent,_60c.attribute);}else{this._setValueOrValues(_60c.parent,_60c.attribute,_60f,false);_610.newValue=_60f;}}else{_60f[this._rootItemPropName]=true;this._arrayOfTopLevelItems.push(_60f);}this._pending._newItems[_60d]=_60f;for(var key in _60b){if(key===this._storeRefPropName||key===this._itemNumPropName){throw new Error("encountered bug in ItemFileWriteStore.newItem");}var _613=_60b[key];if(!dojo.isArray(_613)){_613=[_613];}_60f[key]=_613;if(this.referenceIntegrity){for(var i=0;i<_613.length;i++){var val=_613[i];if(this.isItem(val)){this._addReferenceToMap(val,_60f,key);}}}}this.onNew(_60f,_610);return _60f;},_removeArrayElement:function(_614,_615){var _616=dojo.indexOf(_614,_615);if(_616!=-1){_614.splice(_616,1);return true;}return false;},deleteItem:function(item){this._assert(!this._saveInProgress);this._assertIsItem(item);var _617=item[this._itemNumPropName];var _618=this.getIdentity(item);if(this.referenceIntegrity){var _619=this.getAttributes(item);if(item[this._reverseRefMap]){item["backup_"+this._reverseRefMap]=dojo.clone(item[this._reverseRefMap]);}dojo.forEach(_619,function(_61a){dojo.forEach(this.getValues(item,_61a),function(_61b){if(this.isItem(_61b)){if(!item["backupRefs_"+this._reverseRefMap]){item["backupRefs_"+this._reverseRefMap]=[];}item["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_61b),attr:_61a});this._removeReferenceFromMap(_61b,item,_61a);}},this);},this);var _61c=item[this._reverseRefMap];if(_61c){for(var _61d in _61c){var _61e=null;if(this._itemsByIdentity){_61e=this._itemsByIdentity[_61d];}else{_61e=this._arrayOfAllItems[_61d];}if(_61e){for(var _61f in _61c[_61d]){var _620=this.getValues(_61e,_61f)||[];var _621=dojo.filter(_620,function(_622){return !(this.isItem(_622)&&this.getIdentity(_622)==_618);},this);this._removeReferenceFromMap(item,_61e,_61f);if(_621.length<_620.length){this._setValueOrValues(_61e,_61f,_621,true);}}}}}}this._arrayOfAllItems[_617]=null;item[this._storeRefPropName]=null;if(this._itemsByIdentity){delete this._itemsByIdentity[_618];}this._pending._deletedItems[_618]=item;if(item[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,item);}this.onDelete(item);return true;},setValue:function(item,_623,_624){return this._setValueOrValues(item,_623,_624,true);},setValues:function(item,_625,_626){return this._setValueOrValues(item,_625,_626,true);},unsetAttribute:function(item,_627){return this._setValueOrValues(item,_627,[],true);},_setValueOrValues:function(item,_628,_629,_62a){this._assert(!this._saveInProgress);this._assertIsItem(item);this._assert(dojo.isString(_628));this._assert(typeof _629!=="undefined");var _62b=this._getIdentifierAttribute();if(_628==_62b){throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");}var _62c=this._getValueOrValues(item,_628);var _62d=this.getIdentity(item);if(!this._pending._modifiedItems[_62d]){var _62e={};for(var key in item){if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){_62e[key]=item[key];}else{if(key===this._reverseRefMap){_62e[key]=dojo.clone(item[key]);}else{_62e[key]=item[key].slice(0,item[key].length);}}}this._pending._modifiedItems[_62d]=_62e;}var _62f=false;if(dojo.isArray(_629)&&_629.length===0){_62f=delete item[_628];_629=undefined;if(this.referenceIntegrity&&_62c){var _630=_62c;if(!dojo.isArray(_630)){_630=[_630];}for(var i=0;i<_630.length;i++){var _631=_630[i];if(this.isItem(_631)){this._removeReferenceFromMap(_631,item,_628);}}}}else{var _632;if(dojo.isArray(_629)){var _633=_629;_632=_629.slice(0,_629.length);}else{_632=[_629];}if(this.referenceIntegrity){if(_62c){var _630=_62c;if(!dojo.isArray(_630)){_630=[_630];}var map={};dojo.forEach(_630,function(_634){if(this.isItem(_634)){var id=this.getIdentity(_634);map[id.toString()]=true;}},this);dojo.forEach(_632,function(_635){if(this.isItem(_635)){var id=this.getIdentity(_635);if(map[id.toString()]){delete map[id.toString()];}else{this._addReferenceToMap(_635,item,_628);}}},this);for(var rId in map){var _636;if(this._itemsByIdentity){_636=this._itemsByIdentity[rId];}else{_636=this._arrayOfAllItems[rId];}this._removeReferenceFromMap(_636,item,_628);}}else{for(var i=0;i<_632.length;i++){var _631=_632[i];if(this.isItem(_631)){this._addReferenceToMap(_631,item,_628);}}}}item[_628]=_632;_62f=true;}if(_62a){this.onSet(item,_628,_62c,_629);}return _62f;},_addReferenceToMap:function(_637,_638,_639){var _63a=this.getIdentity(_638);var _63b=_637[this._reverseRefMap];if(!_63b){_63b=_637[this._reverseRefMap]={};}var _63c=_63b[_63a];if(!_63c){_63c=_63b[_63a]={};}_63c[_639]=true;},_removeReferenceFromMap:function(_63d,_63e,_63f){var _640=this.getIdentity(_63e);var _641=_63d[this._reverseRefMap];var _642;if(_641){for(_642 in _641){if(_642==_640){delete _641[_642][_63f];if(this._isEmpty(_641[_642])){delete _641[_642];}}}if(this._isEmpty(_641)){delete _63d[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,_643){var _644=undefined;if(this.hasAttribute(item,_643)){var _645=this.getValues(item,_643);if(_645.length==1){_644=_645[0];}else{_644=_645;}}return _644;},_flatten:function(_646){if(this.isItem(_646)){var item=_646;var _647=this.getIdentity(item);var _648={_reference:_647};return _648;}else{if(typeof _646==="object"){for(var type in this._datatypeMap){var _649=this._datatypeMap[type];if(dojo.isObject(_649)&&!dojo.isFunction(_649)){if(_646 instanceof _649.type){if(!_649.serialize){throw new Error("ItemFileWriteStore: No serializer defined for type mapping: ["+type+"]");}return {_type:type,_value:_649.serialize(_646)};}}else{if(_646 instanceof _649){return {_type:type,_value:_646.toString()};}}}}return _646;}},_getNewFileContentString:function(){var _64a={};var _64b=this._getIdentifierAttribute();if(_64b!==Number){_64a.identifier=_64b;}if(this._labelAttr){_64a.label=this._labelAttr;}_64a.items=[];for(var i=0;i<this._arrayOfAllItems.length;++i){var item=this._arrayOfAllItems[i];if(item!==null){var _64c={};for(var key in item){if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){var _64d=key;var _64e=this.getValues(item,_64d);if(_64e.length==1){_64c[_64d]=this._flatten(_64e[0]);}else{var _64f=[];for(var j=0;j<_64e.length;++j){_64f.push(this._flatten(_64e[j]));_64c[_64d]=_64f;}}}}_64a.items.push(_64c);}}var _650=true;return dojo.toJson(_64a,_650);},_isEmpty:function(_651){var _652=true;if(dojo.isObject(_651)){var i;for(i in _651){_652=false;break;}}else{if(dojo.isArray(_651)){if(_651.length>0){_652=false;}}}return _652;},save:function(_653){this._assert(!this._saveInProgress);this._saveInProgress=true;var self=this;var _654=function(){self._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};self._saveInProgress=false;if(_653&&_653.onComplete){var _655=_653.scope||dojo.global;_653.onComplete.call(_655);}};var _656=function(err){self._saveInProgress=false;if(_653&&_653.onError){var _657=_653.scope||dojo.global;_653.onError.call(_657,err);}};if(this._saveEverything){var _658=this._getNewFileContentString();this._saveEverything(_654,_656,_658);}if(this._saveCustom){this._saveCustom(_654,_656);}if(!this._saveEverything&&!this._saveCustom){_654();}},revert:function(){this._assert(!this._saveInProgress);var _659;for(_659 in this._pending._modifiedItems){var _65a=this._pending._modifiedItems[_659];var _65b=null;if(this._itemsByIdentity){_65b=this._itemsByIdentity[_659];}else{_65b=this._arrayOfAllItems[_659];}_65a[this._storeRefPropName]=this;for(key in _65b){delete _65b[key];}dojo.mixin(_65b,_65a);}var _65c;for(_659 in this._pending._deletedItems){_65c=this._pending._deletedItems[_659];_65c[this._storeRefPropName]=this;var _65d=_65c[this._itemNumPropName];if(_65c["backup_"+this._reverseRefMap]){_65c[this._reverseRefMap]=_65c["backup_"+this._reverseRefMap];delete _65c["backup_"+this._reverseRefMap];}this._arrayOfAllItems[_65d]=_65c;if(this._itemsByIdentity){this._itemsByIdentity[_659]=_65c;}if(_65c[this._rootItemPropName]){this._arrayOfTopLevelItems.push(_65c);}}for(_659 in this._pending._deletedItems){_65c=this._pending._deletedItems[_659];if(_65c["backupRefs_"+this._reverseRefMap]){dojo.forEach(_65c["backupRefs_"+this._reverseRefMap],function(_65e){var _65f;if(this._itemsByIdentity){_65f=this._itemsByIdentity[_65e.id];}else{_65f=this._arrayOfAllItems[_65e.id];}this._addReferenceToMap(_65f,_65c,_65e.attr);},this);delete _65c["backupRefs_"+this._reverseRefMap];}}for(_659 in this._pending._newItems){var _660=this._pending._newItems[_659];_660[this._storeRefPropName]=null;this._arrayOfAllItems[_660[this._itemNumPropName]]=null;if(_660[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,_660);}if(this._itemsByIdentity){delete this._itemsByIdentity[_659];}}this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};return true;},isDirty:function(item){if(item){var _661=this.getIdentity(item);return new Boolean(this._pending._newItems[_661]||this._pending._modifiedItems[_661]||this._pending._deletedItems[_661]).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,_662,_663,_664){},onNew:function(_665,_666){},onDelete:function(_667){},close:function(_668){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"]);
+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"]);
diff --git a/lib/dojo/tt-rss-layer.js.uncompressed.js b/lib/dojo/tt-rss-layer.js.uncompressed.js
index fa2e12157..81d4302df 100644
--- a/lib/dojo/tt-rss-layer.js.uncompressed.js
+++ b/lib/dojo/tt-rss-layer.js.uncompressed.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -16,6 +16,8 @@ if(!dojo._hasResource["dojo.date.stamp"]){ //_hasResource checks added by build.
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){
@@ -94,7 +96,7 @@ dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/d
}
return result; // Date or null
-}
+};
/*=====
dojo.date.stamp.__Options = function(){
@@ -144,13 +146,13 @@ dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__O
}else if(options.selector != "time"){
var timezoneOffset = dateObject.getTimezoneOffset();
var absOffset = Math.abs(timezoneOffset);
- time += (timezoneOffset > 0 ? "-" : "+") +
+ time += (timezoneOffset > 0 ? "-" : "+") +
_(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
}
formattedDate.push(time);
}
return formattedDate.join('T'); // String
-}
+};
}
@@ -159,14 +161,14 @@ dojo._hasResource["dojo.parser"] = true;
dojo.provide("dojo.parser");
+
new Date("X"); // workaround for #11279, new Date("") == NaN
dojo.parser = new function(){
- // summary: The Dom/Widget parsing package
+ // summary:
+ // The Dom/Widget parsing package
var d = dojo;
- this._attrName = d._scopeName + "Type";
- this._query = "[" + this._attrName + "]";
function val2type(/*Object*/ value){
// summary:
@@ -191,13 +193,13 @@ dojo.parser = new function(){
case "number":
return value.length ? Number(value) : NaN;
case "boolean":
- // for checked/disabled value might be "" or "checked". interpret as true.
+ // 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
+ // (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));
}
@@ -226,7 +228,7 @@ dojo.parser = new function(){
}
}
- var instanceClasses = {
+ var dummyClass = {}, instanceClasses = {
// map from fully qualified name (like "dijit.Button") to structure like
// { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
};
@@ -234,45 +236,70 @@ dojo.parser = new function(){
// 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).
- dojo.connect(dojo, "extend", function(){
+ // TODO: remove this in 2.0, when we stop caching parameters.
+ d.connect(d, "extend", function(){
instanceClasses = {};
});
- function getClassInfo(/*String*/ className){
+ 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,
+ // {
+ // cls: dijit.Button,
// params: { label: "string", disabled: "boolean"}
// }
- if(!instanceClasses[className]){
+ var c = instanceClasses[className];
+ if(!c){
// get pointer to widget class
- var cls = d.getObject(className);
+ var cls = d.getObject(className), params = null;
if(!cls){ return null; } // class not defined [yet]
-
- var proto = cls.prototype;
-
- // get table of parameter names & types
- var params = {}, dummyClass = {};
- for(var name in proto){
- if(name.charAt(0)=="_"){ continue; } // skip internal properties
- if(name in dummyClass){ continue; } // skip "constructor" and "toString"
- var defVal = proto[name];
- params[name]=val2type(defVal);
+ if(!skipParamsLookup){ // from fastpath, we don't need to lookup the attrs on the proto because they are explicit
+ params = getProtoInfo(cls.prototype, {})
}
-
- instanceClasses[className] = { cls: cls, params: params };
+ 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 instanceClasses[className];
+
+ return c;
}
- this._functionFromScript = function(script){
+ 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("args");
+ 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+"]; ";
@@ -286,7 +313,7 @@ dojo.parser = new function(){
});
}
return new Function(preamble+script.innerHTML+suffix);
- }
+ };
this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){
// summary:
@@ -307,69 +334,106 @@ dojo.parser = new function(){
// exist.
// args: Object?
// An object used to hold kwArgs for instantiation.
- // Supports 'noStart' and inherited.
- var thelist = [], dp = dojo.parser;
+ // 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.s
- var node, type, clsInfo, clazz, scripts;
+ // 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;
- clsInfo = obj.clsInfo || (type && getClassInfo(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
+ // old (backwards compatible) format of nodes[] array, simple array of DOMNodes. no fastpath/data-dojo-type support here.
node = obj;
- type = dp._attrName in mixin ? mixin[dp._attrName] : node.getAttribute(dp._attrName);
+ type = attrName in mixin ? mixin[attrName] : node.getAttribute(attrName);
clsInfo = type && getClassInfo(type);
clazz = clsInfo && clsInfo.cls;
- scripts = (clazz && (clazz._noScript || clazz.prototype._noScript) ? [] :
+ 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
+ // 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 = {},
- attributes = node.attributes;
+ var params = {};
+
if(args.defaults){
// settings for the document itself (or whatever subtree is being parsed)
- dojo.mixin(params, args.defaults);
+ d._mixin(params, args.defaults);
}
if(obj.inherited){
// settings from dir=rtl or lang=... on a node above this node
- dojo.mixin(params, obj.inherited);
+ 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 + "'");
+ }
+ }
- // read parameters (ie, attributes) specified on DOMNode
- // 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?
+ // 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 _type = clsInfo.params[name];
- if(typeof value == "string"){
- params[name] = str2obj(value, _type);
- }else{
- params[name] = value;
+ 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;
+ }
}
}
@@ -384,9 +448,10 @@ dojo.parser = new function(){
d.forEach(scripts, function(script){
node.removeChild(script);
- var event = script.getAttribute("event"),
+ // 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);
+ nf = d.parser._functionFromScript(script, attrData);
if(event){
if(type == "dojo/connect"){
connects.push({event: event, func: nf});
@@ -404,7 +469,8 @@ dojo.parser = new function(){
thelist.push(instance);
// map it to the JS namespace if that makes sense
- var jsname = node.getAttribute("jsId");
+ // 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);
}
@@ -428,9 +494,9 @@ dojo.parser = new function(){
// 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 &&
- instance.startup &&
- !instance._started &&
+ if( !args.noStart && instance &&
+ dojo.isFunction(instance.startup) &&
+ !instance._started &&
(!instance.getParent || !instance.getParent())
){
instance.startup();
@@ -440,34 +506,57 @@ dojo.parser = new function(){
return thelist;
};
- this.parse = function(/*DomNode?*/ rootNode, /* Object? */ args){
+ 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
- // dojoType="qualified.class.name"
+ // 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
+ // object can be passed in this place. If the `args` object has a
// `rootNode` member, that is used.
//
- // args:
+ // args: Object
// a kwArgs object passed along to instantiate()
- //
+ //
// * noStart: Boolean?
// when set will prevent the parser from calling .startup()
- // when locating the nodes.
+ // when locating the nodes.
// * rootNode: DomNode?
// identical to the function's `rootNode` argument, though
- // allowed to be passed in via this `args object.
+ // 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:
@@ -475,10 +564,10 @@ dojo.parser = new function(){
//
// example:
// Parse all classes within the node with id="foo"
- // | dojo.parser.parse(dojo.byId(foo));
+ // | dojo.parser.parse(dojo.byId('foo'));
//
// example:
- // Parse all classes in a page, but do not call .startup() on any
+ // Parse all classes in a page, but do not call .startup() on any
// child
// | dojo.parser.parse({ noStart: true })
//
@@ -486,7 +575,7 @@ dojo.parser = new function(){
// 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 });
+ // | dojo.parser.parse({ noStart:true, rootNode: someNode });
// determine the root node based on the passed arguments.
var root;
@@ -496,8 +585,12 @@ dojo.parser = new function(){
}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-"
- var attrName = this._attrName;
function scan(parent, list){
// summary:
// Parent is an Object representing a DOMNode, with or without a dojoType specified.
@@ -506,7 +599,7 @@ dojo.parser = new function(){
// parent: Object
// Object representing the parent node, like
// | {
- // | node: DomNode, // scan children of this node
+ // | 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
@@ -519,6 +612,7 @@ dojo.parser = new function(){
// 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;
@@ -526,20 +620,31 @@ dojo.parser = new function(){
});
// if parent is a widget, then search for <script type=dojo/*> tags and put them in scripts[].
- var scripts = parent.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;
+ 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){
- var type = recurse && child.getAttribute(attrName);
+ // 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 specified, add to output array of nodes to instantiate
+ // if dojoType/data-dojo-type specified, add to output array of nodes to instantiate
var params = {
"type": type,
- clsInfo: getClassInfo(type), // note: won't find classes declared via dojo.Declaration
+ 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
@@ -552,7 +657,7 @@ dojo.parser = new function(){
}else if(scripts && child.nodeName.toLowerCase() == "script"){
// if <script type="dojo/...">, save in scripts[]
type = child.getAttribute("type");
- if (type && /^dojo\//i.test(type)) {
+ if (type && /^dojo\/\w/i.test(type)) {
scripts.push(child);
}
}else if(recurse){
@@ -566,17 +671,24 @@ dojo.parser = new function(){
}
}
+ // 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 ? dojo.byId(root) : dojo.body(),
- inherited: (args && args.inherited) || {
- dir: dojo._isBodyLtr() ? "ltr" : "rtl"
- }
+ node: root,
+ inherited: inherited
}, list);
// go build the object instances
- return this.instantiate(list, null, args); // Array
+ var mixin = args && args.template ? {template: true} : null;
+ return this.instantiate(list, mixin, args); // Array
};
}();
@@ -584,14 +696,14 @@ dojo.parser = new function(){
//after the a11y test.
(function(){
- var parseRunner = function(){
+ var parseRunner = function(){
if(dojo.config.parseOnLoad){
- dojo.parser.parse();
+ dojo.parser.parse();
}
};
// FIXME: need to clobber cross-dependency!!
- if(dojo.exists("dijit.wai.onload") && (dijit.wai.onload === dojo._loaders[0])){
+ if(dojo.getObject("dijit.wai.onload") === dojo._loaders[0]){
dojo._loaders.splice(1, 0, parseRunner);
}else{
dojo._loaders.unshift(parseRunner);
@@ -604,6 +716,8 @@ if(!dojo._hasResource["dojo.window"]){ //_hasResource checks added by build. Do
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
@@ -657,7 +771,9 @@ dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
return;
}
var backCompat = doc.compatMode == 'BackCompat',
- clientAreaRoot = backCompat? body : html,
+ 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,
@@ -682,14 +798,11 @@ dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
}else{
var pb = dojo._getPadBorderExtents(el);
elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t;
- }
-
- if(el != scrollRoot){ // body, html sizes already have the scrollbar removed
var clientSize = el.clientWidth,
scrollBarSize = elPos.w - clientSize;
if(clientSize > 0 && scrollBarSize > 0){
elPos.w = clientSize;
- if(isIE && rtl){ elPos.x += scrollBarSize; }
+ elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0;
}
clientSize = el.clientHeight;
scrollBarSize = elPos.h - clientSize;
@@ -718,8 +831,9 @@ dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
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 += (isIE >= 8 && !backCompat && rtl)? -s : s;
+ el.scrollLeft += s;
nodePos.x -= el.scrollLeft;
}
if(bot * t > 0){
@@ -728,7 +842,7 @@ dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
nodePos.y -= el.scrollTop;
}
el = (el != scrollRoot) && !fixedPos && el.parentNode;
- }
+ }
}catch(error){
console.error('scrollIntoView: ' + error);
node.scrollIntoView(false);
@@ -741,6 +855,7 @@ if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by bu
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
@@ -996,7 +1111,10 @@ dojo.declare("dijit.WidgetSet", null, {
if(node.nodeType == 1){
var widgetId = node.getAttribute("widgetId");
if(widgetId){
- outAry.push(hash[widgetId]);
+ var widget = hash[widgetId];
+ if(widget){ // may be null on page w/multiple dojo's loaded
+ outAry.push(widget);
+ }
}else{
getChildrenHelper(node);
}
@@ -1086,29 +1204,25 @@ dojo.declare("dijit.WidgetSet", null, {
return true;
case "iframe":
// If it's an editor <iframe> then it's tab navigable.
- //TODO: feature detect "designMode" in elem.contentDocument?
- if(dojo.isMoz){
- try{
- return elem.contentDocument.designMode == "on";
- }catch(err){
- return false;
+ var body;
+ try{
+ // non-IE
+ var contentDocument = elem.contentDocument;
+ if("designMode" in contentDocument && contentDocument.designMode == "on"){
+ return true;
}
- }else if(dojo.isWebKit){
- var doc = elem.contentDocument,
- body = doc && doc.body;
- return body && body.contentEditable == 'true';
- }else{
+ 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{
- doc = elem.contentWindow.document;
- body = doc && doc.body;
- return body && body.firstChild && body.firstChild.contentEditable == 'true';
- }catch(e){
+ body = elem.contentWindow.document.body;
+ }catch(e2){
return false;
}
}
+ return body.contentEditable == 'true' || (body.firstChild && body.firstChild.contentEditable == 'true');
default:
return elem.contentEditable == 'true';
}
@@ -1144,7 +1258,13 @@ dojo.declare("dijit.WidgetSet", null, {
// positive tabIndex value
// * the last element in document order with the highest
// positive tabIndex value
- var first, last, lowest, lowestTabindex, highest, highestTabindex;
+ 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,
@@ -1168,6 +1288,10 @@ dojo.declare("dijit.WidgetSet", null, {
highest = child;
}
}
+ var rn = radioName(child);
+ if(dojo.attr(child, "checked") && rn) {
+ radioSelected[rn] = child;
+ }
}
if(child.nodeName.toUpperCase() != 'SELECT'){
walkTree(child);
@@ -1175,7 +1299,11 @@ dojo.declare("dijit.WidgetSet", null, {
});
};
if(shown(root)){ walkTree(root) }
- return { first: first, last: last, lowest: lowest, highest: highest };
+ 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:
@@ -1215,7 +1343,7 @@ dojo._hasResource["dijit._base.focus"] = true;
dojo.provide("dijit._base.focus");
- // for dijit.isTabNavigable()
+
// summary:
// These functions are used to query or set the focus and selection.
@@ -1271,6 +1399,9 @@ dojo.mixin(dijit, {
}
}
bm = {isCollapsed:true};
+ if(sel.rangeCount){
+ bm.mark = sel.getRangeAt(0).cloneRange();
+ }
}else{
rg = sel.getRangeAt(0);
bm = {isCollapsed: false, mark: rg.cloneRange()};
@@ -1518,7 +1649,7 @@ dojo.mixin(dijit, {
var doc = dojo.isIE ? targetWindow.document.documentElement : targetWindow.document;
if(doc){
if(dojo.isIE){
- doc.attachEvent('onmousedown', mousedownListener);
+ 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....
@@ -1536,13 +1667,13 @@ dojo.mixin(dijit, {
doc.attachEvent('ondeactivate', deactivateListener);
return function(){
- doc.detachEvent('onmousedown', mousedownListener);
+ 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.addEventListener('mousedown', mousedownListener, true);
+ doc.body.addEventListener('mousedown', mousedownListener, true);
var focusListener = function(evt){
dijit._onFocusNode(effectiveNode || evt.target);
};
@@ -1553,7 +1684,7 @@ dojo.mixin(dijit, {
doc.addEventListener('blur', blurListener, true);
return function(){
- doc.removeEventListener('mousedown', mousedownListener, true);
+ 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)
@@ -1694,6 +1825,7 @@ dojo.mixin(dijit, {
widget = dijit.byId(oldStack[i]);
if(widget){
widget._focused = false;
+ widget.set("focused", false);
widget._hasBeenBlurred = true;
if(widget._onBlur){
widget._onBlur(by);
@@ -1707,6 +1839,7 @@ dojo.mixin(dijit, {
widget = dijit.byId(newStack[i]);
if(widget){
widget._focused = true;
+ widget.set("focused", true);
if(widget._onFocus){
widget._onFocus(by);
}
@@ -1733,6 +1866,7 @@ if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by b
dojo._hasResource["dojo.AdapterRegistry"] = true;
dojo.provide("dojo.AdapterRegistry");
+
dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
// summary:
// A registry to make contextual calling/searching easier.
@@ -1764,11 +1898,11 @@ dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
this.pairs = [];
this.returnWrappers = returnWrappers || false; // Boolean
-}
+};
dojo.extend(dojo.AdapterRegistry, {
register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
- // summary:
+ // summary:
// register a check function to determine if the wrap function or
// object gets selected
// name:
@@ -1836,7 +1970,6 @@ dojo.provide("dijit._base.place");
-
dijit.getViewport = function(){
// summary:
// Returns the dimensions and scroll position of the viewable area of a browser window
@@ -1896,16 +2029,22 @@ dijit.placeOnScreen = function(
return dijit._place(node, choices);
}
-dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ layoutNode){
+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)
+ // 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
@@ -1922,12 +2061,20 @@ dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ la
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 tooltips size changes based on position, due to triangle)
+ // a tooltip's size changes based on position, due to triangle)
if(layoutNode){
- layoutNode(node, choice.aroundCorner, corner);
+ var res = layoutNode(node, choice.aroundCorner, corner, spaceAvailable, aroundNodeCoords);
+ overflow = typeof res == "undefined" ? 0 : res;
}
// get node's size
@@ -1947,8 +2094,9 @@ dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ la
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);
+ height = endY - startY;
+
+ overflow += (mb.w - width) + (mb.h - height);
if(best == null || overflow < best.overflow){
best = {
@@ -1958,17 +2106,32 @@ dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ la
y: startY,
w: width,
h: height,
- overflow: overflow
+ overflow: overflow,
+ spaceAvailable: spaceAvailable
};
}
+
return !overflow;
});
- node.style.left = best.x + "px";
- node.style.top = best.y + "px";
+ // 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);
+ 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;
}
@@ -2015,11 +2178,7 @@ dijit.placeOnScreenAroundNode = function(
// get coordinates of aroundNode
aroundNode = dojo.byId(aroundNode);
- var oldDisplay = aroundNode.style.display;
- aroundNode.style.display="";
- // #3172: use the slightly tighter border box instead of marginBox
var aroundNodePos = dojo.position(aroundNode, true);
- aroundNode.style.display=oldDisplay;
// place the node around the calculated rectangle
return dijit._placeOnScreenAroundRect(node,
@@ -2090,7 +2249,7 @@ dijit._placeOnScreenAroundRect = function(
});
}
- return dijit._place(node, choices, layoutNode);
+ return dijit._place(node, choices, layoutNode, {w: width, h: height});
};
dijit.placementRegistry= new dojo.AdapterRegistry();
@@ -2150,11 +2309,17 @@ dijit.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToR
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)
@@ -2259,48 +2424,77 @@ dijit.popup = {
_idGen: 1,
- moveOffScreen: function(/*DomNode*/ node){
+ _createWrapper: function(/*Widget || DomNode*/ widget){
// summary:
- // Initialization for nodes that will be used as popups
- //
- // description:
- // Puts node inside a wrapper <div>, and
- // positions wrapper div off screen, but not display:none, so that
- // the widget doesn't appear in the page flow and/or cause a blank
- // area at the bottom of the viewport (making scrollbar longer), but
- // initialization of contained widgets works correctly
-
- var wrapper = node.parentNode;
-
- // Create a wrapper widget for when this node (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
- if(!wrapper || !dojo.hasClass(wrapper, "dijitPopup")){
+ // 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:{
- visibility:"hidden",
- top: "-9999px"
- }
+ style:{ display: "none"},
+ role: "presentation"
}, dojo.body());
- dijit.setWaiRole(wrapper, "presentation");
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.
- var s = node.style;
- s.display = "";
- s.visibility = "";
- s.position = "";
- s.top = "0px";
+ // Create wrapper if not already there
+ var wrapper = this._createWrapper(widget);
dojo.style(wrapper, {
visibility: "hidden",
- // prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111)
- top: "-9999px"
+ 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.
@@ -2337,14 +2531,17 @@ dijit.popup = {
around = args.around,
id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+this._idGen++);
-
- // The wrapper may have already been created, but in case it wasn't, create here
- var wrapper = widget.domNode.parentNode;
- if(!wrapper || !dojo.hasClass(wrapper, "dijitPopup")){
- this.moveOffScreen(widget.domNode);
- wrapper = widget.domNode.parentNode;
+ // 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: {
@@ -2355,9 +2552,9 @@ dijit.popup = {
});
if(dojo.isIE || dojo.isMoz){
- var iframe = wrapper.childNodes[1];
- if(!iframe){
- iframe = new dijit.BackgroundIframe(wrapper);
+ if(!widget.bgIframe){
+ // setting widget.bgIframe triggers cleanup in _Widget.destroy()
+ widget.bgIframe = new dijit.BackgroundIframe(wrapper);
}
}
@@ -2366,6 +2563,7 @@ dijit.popup = {
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
@@ -2400,8 +2598,6 @@ dijit.popup = {
}));
stack.push({
- wrapper: wrapper,
- iframe: iframe,
widget: widget,
parent: args.parent,
onExecute: args.onExecute,
@@ -2418,9 +2614,10 @@ dijit.popup = {
return best;
},
- close: function(/*dijit._Widget*/ popup){
+ close: function(/*dijit._Widget?*/ popup){
// summary:
- // Close specified popup and any popups that it parented
+ // Close specified popup and any popups that it parented.
+ // If no popup is specified, closes all popups.
var stack = this._stack;
@@ -2429,10 +2626,9 @@ dijit.popup = {
// 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(dojo.some(stack, function(elem){return elem.widget == popup;})){
+ while((popup && dojo.some(stack, function(elem){return elem.widget == popup;})) ||
+ (!popup && stack.length)){
var top = stack.pop(),
- wrapper = top.wrapper,
- iframe = top.iframe,
widget = top.widget,
onClose = top.onClose;
@@ -2442,11 +2638,9 @@ dijit.popup = {
}
dojo.forEach(top.handlers, dojo.disconnect);
- // Move the widget plus it's wrapper off screen, unless it has already been destroyed in above onClose() etc.
+ // Hide the widget and it's wrapper unless it has already been destroyed in above onClose() etc.
if(widget && widget.domNode){
- this.moveOffScreen(widget.domNode);
- }else{
- dojo.destroy(wrapper);
+ this.hide(widget);
}
if(onClose){
@@ -2456,9 +2650,12 @@ dijit.popup = {
}
};
+// 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(){
@@ -2467,7 +2664,7 @@ dijit._frames = new function(){
iframe = queue.pop();
iframe.style.display="";
}else{
- if(dojo.isIE){
+ 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;"
@@ -2479,7 +2676,7 @@ dijit._frames = new function(){
iframe.className = "dijitBackgroundIframe";
dojo.style(iframe, "opacity", 0.1);
}
- iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didnt work.
+ iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work.
dijit.setWaiRole(iframe,"presentation");
}
return iframe;
@@ -2492,7 +2689,7 @@ dijit._frames = new function(){
}();
-dijit.BackgroundIframe = function(/* DomNode */node){
+dijit.BackgroundIframe = function(/*DomNode*/ node){
// summary:
// For IE/FF z-index schenanigans. id attribute is required.
//
@@ -2503,9 +2700,9 @@ dijit.BackgroundIframe = function(/* DomNode */node){
if(!node.id){ throw new Error("no id"); }
if(dojo.isIE || dojo.isMoz){
- var iframe = dijit._frames.pop();
+ var iframe = (this.iframe = dijit._frames.pop());
node.appendChild(iframe);
- if(dojo.isIE<7){
+ if(dojo.isIE<7 || dojo.isQuirks){
this.resize(node);
this._conn = dojo.connect(node, 'onresize', this, function(){
this.resize(node);
@@ -2516,19 +2713,15 @@ dijit.BackgroundIframe = function(/* DomNode */node){
height: '100%'
});
}
- this.iframe = iframe;
}
};
dojo.extend(dijit.BackgroundIframe, {
resize: function(node){
// summary:
- // resize the iframe so its the same size as node
- // description:
- // this function is a no-op in all browsers except
- // IE6, which does not support 100% width/height
- // of absolute positioned iframes
- if(this.iframe && dojo.isIE<7){
+ // 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'
@@ -2571,6 +2764,7 @@ if(!dojo._hasResource["dojo.uacss"]){ //_hasResource checks added by build. Do n
dojo._hasResource["dojo.uacss"] = true;
dojo.provide("dojo.uacss");
+
(function(){
// summary:
// Applies pre-set CSS classes to the top-level HTML node, based on:
@@ -2595,6 +2789,7 @@ dojo.provide("dojo.uacss");
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,
@@ -2623,7 +2818,7 @@ dojo.provide("dojo.uacss");
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).
+ // 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()){
@@ -2637,6 +2832,10 @@ dojo.provide("dojo.uacss");
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");
+
+
+
// summary:
// Applies pre-set CSS classes to the top-level HTML node, see
// `dojo.uacss` for details.
@@ -2644,16 +2843,13 @@ dojo._hasResource["dijit._base.sniff"] = true;
// Simply doing a require on this module will
// establish this CSS. Modified version of Morris' CSS hack.
-dojo.provide("dijit._base.sniff");
-
-
-
}
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
@@ -2838,6 +3034,7 @@ if(!dojo._hasResource["dijit._base.wai"]){ //_hasResource checks added by build.
dojo._hasResource["dijit._base.wai"] = true;
dojo.provide("dijit._base.wai");
+
dijit.wai = {
onload: function(){
// summary:
@@ -2883,26 +3080,24 @@ if(dojo.isIE || dojo.isMoz){ // NOTE: checking in Safari messes things up
}
dojo.mixin(dijit, {
- _XhtmlRoles: /banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,
-
- hasWaiRole: function(/*Element*/ elem, /*String*/ role){
+ hasWaiRole: function(/*Element*/ elem, /*String?*/ role){
// summary:
- // Determines if an element has a particular non-XHTML role.
+ // Determines if an element has a particular role.
// returns:
- // True if elem has the specific non-XHTML role attribute and false if not.
+ // True if elem has the specific role attribute and false if not.
// For backwards compatibility if role parameter not provided,
- // returns true if has non XHTML role
+ // 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 non-XHTML role for an element (which should be a wai role).
+ // Gets the role for an element (which should be a wai role).
// returns:
- // The non-XHTML role of elem or an empty string if elem
+ // The role of elem or an empty string if elem
// does not have a role.
- return dojo.trim((dojo.attr(elem, "role") || "").replace(this._XhtmlRoles,"").replace("wairole:",""));
+ return dojo.trim((dojo.attr(elem, "role") || "").replace("wairole:",""));
},
setWaiRole: function(/*Element*/ elem, /*String*/ role){
@@ -2910,24 +3105,13 @@ dojo.mixin(dijit, {
// Sets the role on an element.
// description:
// Replace existing role attribute with new role.
- // If elem already has an XHTML role, append this role to XHTML role
- // and remove other ARIA roles.
- var curRole = dojo.attr(elem, "role") || "";
- if(!this._XhtmlRoles.test(curRole)){
dojo.attr(elem, "role", role);
- }else{
- if((" "+ curRole +" ").indexOf(" " + role + " ") < 0){
- var clearXhtml = dojo.trim(curRole.replace(this._XhtmlRoles, ""));
- var cleanRole = dojo.trim(curRole.replace(clearXhtml, ""));
- dojo.attr(elem, "role", cleanRole + (cleanRole ? ' ' : '') + role);
- }
- }
},
removeWaiRole: function(/*Element*/ elem, /*String*/ role){
// summary:
- // Removes the specified non-XHTML role from an element.
+ // Removes the specified role from an element.
// Removes role attribute if no specific role provided (for backwards compat.)
var roleValue = dojo.attr(elem, "role");
@@ -2999,73 +3183,157 @@ dojo.provide("dijit._base");
-}
-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._base" );
+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");
-// 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);
+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);
}
- });
-
-dijit._connectOnUseEventHandler = function(/*Event*/ event){};
-
-// 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;
+ },
+
+ 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);
+ }
};
- 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(){
+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");
+
-var _attrReg = {}, // cached results from getSetterAttributes
- getSetterAttributes = function(widget){
- // summary:
- // Returns list of attributes with custom setters for specified widget
- var dc = widget.declaredClass;
- if(!_attrReg[dc]){
- var r = [],
- attrs,
- proto = widget.constructor.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));
- }
- }
- _attrReg[dc] = r;
- }
- return _attrReg[dc] || []; // String[]
- };
-dojo.declare("dijit._Widget", null, {
+
+(function(){
+
+dojo.declare("dijit._WidgetBase", dojo.Stateful, {
// summary:
- // Base class for all Dijit widgets.
+ // 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
@@ -3163,7 +3431,7 @@ dojo.declare("dijit._Widget", null, {
// Changes to widget attributes listed in attributeMap will be
// reflected into the DOM.
//
- // For example, calling attr('title', 'hello')
+ // For example, calling set('title', 'hello')
// on a TitlePane will automatically cause the TitlePane's DOM to update
// with the new title.
//
@@ -3195,158 +3463,6 @@ dojo.declare("dijit._Widget", null, {
// - "" --> { node: "domNode", type: "attribute" }
attributeMap: {id:"", dir:"", lang:"", "class":"", style:"", title:""},
- // _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
- },
- =====*/
-
- // Constants used in templates
-
// _blankGif: [protected] String
// Path to a blank 1x1 image.
// Used by <img> nodes in templates that really get their image via CSS background-image.
@@ -3397,25 +3513,11 @@ dojo.declare("dijit._Widget", null, {
// The handle returned from Widget.subscribe() is the handle returned from dojo.subscribe()
this._subscribes = [];
- // 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
- }
- }
-
- //mixin our passed parameters
+ // 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);
+ dojo._mixin(this, params);
}
this.postMixInProperties();
@@ -3431,22 +3533,22 @@ dojo.declare("dijit._Widget", null, {
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){
+ if(source && source.parentNode && this.domNode !== source){
source.parentNode.replaceChild(this.domNode, source);
}
-
- // 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);
- }
}
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();
@@ -3485,13 +3587,30 @@ dojo.declare("dijit._Widget", null, {
}
// And also any attributes with custom setters
- dojo.forEach(getSetterAttributes(this), function(a){
+ 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,
@@ -3510,7 +3629,22 @@ dojo.declare("dijit._Widget", null, {
// method.
// tags:
// protected
- this.domNode = this.srcNodeRef || dojo.create('div');
+
+ 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(){
@@ -3522,16 +3656,6 @@ dojo.declare("dijit._Widget", null, {
// node dimensions or placement.
// tags:
// protected
-
- // baseClass is a single class name or occasionally a space-separated list of names.
- // Add those classes to the DOMNod. If RTL mode then also add with Rtl suffix.
- 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);
- }
},
startup: function(){
@@ -3647,7 +3771,6 @@ dojo.declare("dijit._Widget", null, {
});
},
-
uninitialize: function(){
// summary:
// Stub function. Override to implement custom widget tear-down
@@ -3657,60 +3780,7 @@ dojo.declare("dijit._Widget", null, {
return false;
},
- ////////////////// MISCELLANEOUS METHODS ///////////////////
-
- 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();
- },
-
- _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];
- }
- },
+ ////////////////// GET/SET, CUSTOM SETTERS, ETC. ///////////////////
_setClassAttr: function(/*String*/ value){
// summary:
@@ -3718,14 +3788,13 @@ dojo.declare("dijit._Widget", null, {
// tags:
// protected
var mapNode = this[this.attributeMap["class"] || 'domNode'];
- dojo.removeClass(mapNode, this["class"])
- this["class"] = value;
- dojo.addClass(mapNode, value);
+ dojo.replaceClass(mapNode, value, this["class"]);
+ this._set("class", value);
},
_setStyleAttr: function(/*String||Object*/ value){
// summary:
- // Sets the style attribut of the widget according to value,
+ // 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:
@@ -3749,25 +3818,13 @@ dojo.declare("dijit._Widget", null, {
}
}
- this.style = value;
- },
-
- 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);
+ 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.
- //
- // description:
- // Also sets this["attr"] to the new value.
// Note some attributes like "type"
// cannot be processed this way as they are not mutable.
//
@@ -3803,46 +3860,12 @@ dojo.declare("dijit._Widget", null, {
mapNode.innerHTML = value;
break;
case "class":
- dojo.removeClass(mapNode, this[attr]);
- dojo.addClass(mapNode, value);
+ dojo.replaceClass(mapNode, value, this[attr]);
break;
}
}, this);
- this[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);
- }
- },
-
get: function(name){
// summary:
// Get a property from a widget.
@@ -3851,7 +3874,7 @@ dojo.declare("dijit._Widget", null, {
// 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.
+ // 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");
@@ -3869,11 +3892,11 @@ dojo.declare("dijit._Widget", null, {
// summary:
// Set a property on a widget
// name:
- // The property to set.
+ // 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
+ // 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:
@@ -3894,7 +3917,7 @@ dojo.declare("dijit._Widget", null, {
if(typeof name === "object"){
for(var x in name){
- this.set(x, name[x]);
+ this.set(x, name[x]);
}
return this;
}
@@ -3907,9 +3930,7 @@ dojo.declare("dijit._Widget", null, {
if(name in this.attributeMap){
this._attrToDom(name, value);
}
- var oldValue = this[name];
- // FIXME: what about function assignments? Any way to connect() here?
- this[name] = value;
+ this._set(name, value);
}
return result || this;
},
@@ -3932,6 +3953,17 @@ dojo.declare("dijit._Widget", null, {
});
},
+ _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
@@ -3958,11 +3990,6 @@ dojo.declare("dijit._Widget", null, {
return this.containerNode ? dijit.findWidgets(this.containerNode) : []; // dijit._Widget[]
},
- // 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,
@@ -3973,8 +4000,8 @@ dojo.declare("dijit._Widget", null, {
// 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.
@@ -3988,41 +4015,7 @@ dojo.declare("dijit._Widget", null, {
// tags:
// protected
- var d = dojo,
- dc = d._connect,
- handles = [];
- 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(dojo.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;
- e.preventDefault(); // stop event to prevent scrolling on space key in IE
- }
- }),
- 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 &&
- !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);
- }
- })
- );
- }
- event = "onclick";
- }
- handles.push(dc(obj, event, this, method));
-
+ var handles = [dojo._connect(obj, event, this, method)];
this._connects.push(handles);
return handles; // _Widget.Handle
},
@@ -4058,8 +4051,7 @@ dojo.declare("dijit._Widget", null, {
// | btn.subscribe("/my/topic", function(v){
// | this.set("label", v);
// | });
- var d = dojo,
- handle = d.subscribe(topic, this, method);
+ var handle = dojo.subscribe(topic, this, method);
// return handles for Any widget that may need them
this._subscribes.push(handle);
@@ -4087,13 +4079,6 @@ dojo.declare("dijit._Widget", null, {
return this.dir ? (this.dir == "ltr") : dojo._isBodyLtr(); //Boolean
},
- 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");
- },
-
placeAt: function(/* String|DomNode|_Widget */reference, /* String?|Int? */position){
// summary:
// Place this widget's domNode reference somewhere in the DOM based
@@ -4149,8 +4134,451 @@ dojo.declare("dijit._Widget", null, {
dojo.place(this.domNode, reference, position);
}
return this;
+ }
+});
+
+})();
+
+}
+
+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");
+
+
+
+
+
+////////////////// 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.
@@ -4203,8 +4631,10 @@ if(!dojo._hasResource["dojo.string"]){ //_hasResource checks added by build. Do
dojo._hasResource["dojo.string"] = true;
dojo.provide("dojo.string");
+dojo.getObject("string", true, dojo);
+
/*=====
-dojo.string = {
+dojo.string = {
// summary: String utilities for Dojo
};
=====*/
@@ -4255,22 +4685,22 @@ dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boo
return end ? out + pad : pad + out; // String
};
-dojo.string.substitute = function( /*String*/ template,
- /*Object|Array*/map,
- /*Function?*/ transform,
+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:
+ // template:
// a string with expressions in the form `${key}` to be replaced or
- // `${key:format}` which specifies a format function. keys are case-sensitive.
+ // `${key:format}` which specifies a format function. keys are case-sensitive.
// map:
// hash to search for substitutions
- // transform:
+ // transform:
// a function to process all parameters before substitution takes
// place, e.g. mylib.encodeXML
- // thisObject:
+ // thisObject:
// where to look for optional format function; default to the global
// namespace
// example:
@@ -4313,7 +4743,7 @@ dojo.string.substitute = function( /*String*/ template,
// | );
thisObject = thisObject || dojo.global;
- transform = transform ?
+ transform = transform ?
dojo.hitch(thisObject, transform) : function(v){ return v; };
return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
@@ -4361,14 +4791,14 @@ if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do n
dojo._hasResource["dojo.cache"] = true;
dojo.provide("dojo.cache");
+
/*=====
-dojo.cache = {
+dojo.cache = {
// summary:
// A way to cache string content that is fetchable via `dojo.moduleUrl`.
};
=====*/
-(function(){
var cache = {};
dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
// summary:
@@ -4407,7 +4837,7 @@ dojo.cache = {
// | 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
+ // (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
@@ -4457,7 +4887,7 @@ dojo.cache = {
};
dojo.cache._sanitize = function(/*String*/val){
- // summary:
+ // 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.
@@ -4474,7 +4904,6 @@ dojo.cache = {
}
return val; //String
};
-})();
}
@@ -4527,15 +4956,23 @@ dojo.declare("dijit._Templated",
// '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){
@@ -4560,7 +4997,6 @@ dojo.declare("dijit._Templated",
}, this);
},
- // method over-ride
buildRendering: function(){
// summary:
// Construct the UI for this widget from a template, setting this.domNode.
@@ -4586,33 +5022,24 @@ dojo.declare("dijit._Templated",
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){
- // Make sure dojoType is used for parsing widgets in template.
- // The dojo.parser.query could be changed from multiversion support.
- var parser = dojo.parser, qry, attr;
- if(parser._query != "[dojoType]"){
- qry = parser._query;
- attr = parser._attrName;
- parser._query = "[dojoType]";
- parser._attrName = "dojoType";
- }
-
// Store widgets that we need to start at a later point in time
var cw = (this._startupWidgets = dojo.parser.parse(node, {
noStart: !this._earlyTemplatedStartup,
- inherited: {dir: this.dir, lang: this.lang}
+ 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
}));
- // Restore the query.
- if(qry){
- parser._query = qry;
- parser._attrName = attr;
- }
-
this._supportingWidgets = dijit.findWidgets(node);
this._attachTemplateNodes(cw, function(n,p){
@@ -4640,6 +5067,8 @@ dojo.declare("dijit._Templated",
_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
@@ -4662,11 +5091,11 @@ dojo.declare("dijit._Templated",
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")){
+ if(this.widgetsInTemplate && (getAttrFunc(baseNode, "dojoType") || getAttrFunc(baseNode, "data-dojo-type"))){
continue;
}
// Process dojoAttachPoint
- var attachPoint = getAttrFunc(baseNode, "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())){
@@ -4680,7 +5109,7 @@ dojo.declare("dijit._Templated",
}
// Process dojoAttachEvent
- var attachEvent = getAttrFunc(baseNode, "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; ..."
@@ -4700,12 +5129,13 @@ dojo.declare("dijit._Templated",
if(!thisFunc){
thisFunc = event;
}
- this.connect(baseNode, event, thisFunc);
+ 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);
@@ -4738,6 +5168,10 @@ dojo.declare("dijit._Templated",
}, this);
this._attachPoints = [];
+ // And same for event handlers
+ dojo.forEach(this._attachEvents, this.disconnect, this);
+ this._attachEvents = [];
+
this.inherited(arguments);
}
}
@@ -4822,6 +5256,7 @@ if(!dojo._hasResource["dijit._Container"]){ //_hasResource checks added by build
dojo._hasResource["dijit._Container"] = true;
dojo.provide("dijit._Container");
+
dojo.declare("dijit._Container",
null,
{
@@ -4884,7 +5319,7 @@ dojo.declare("dijit._Container",
// not destroy it. You can also pass in an integer indicating
// the index within the container to remove
- if(typeof widget == "number" && widget > 0){
+ if(typeof widget == "number"){
widget = this.getChildren()[widget];
}
@@ -4959,6 +5394,7 @@ if(!dojo._hasResource["dijit._Contained"]){ //_hasResource checks added by build
dojo._hasResource["dijit._Contained"] = true;
dojo.provide("dijit._Contained");
+
dojo.declare("dijit._Contained",
null,
{
@@ -5022,7 +5458,6 @@ dojo.declare("dijit._Contained",
}
);
-
}
if(!dojo._hasResource["dijit.layout._LayoutWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -5051,10 +5486,9 @@ dojo.declare("dijit.layout._LayoutWidget",
// children widgets, setting their size, when they become visible.
isLayoutContainer: true,
- postCreate: function(){
- dojo.addClass(this.domNode, "dijitContainer");
-
+ buildRendering: function(){
this.inherited(arguments);
+ dojo.addClass(this.domNode, "dijitContainer");
},
startup: function(){
@@ -5188,10 +5622,9 @@ dojo.declare("dijit.layout._LayoutWidget",
// tags:
// protected extension
- dojo.addClass(child.domNode, this.baseClass+"-child");
- if(child.baseClass){
- dojo.addClass(child.domNode, this.baseClass+"-"+child.baseClass);
- }
+ var cls = this.baseClass + "-child "
+ + (child.baseClass ? this.baseClass + "-" + child.baseClass : "");
+ dojo.addClass(child.domNode, cls);
},
addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
@@ -5204,10 +5637,11 @@ dojo.declare("dijit.layout._LayoutWidget",
removeChild: function(/*dijit._Widget*/ child){
// Overrides _Container.removeChild() to remove class added by _setupChild()
- dojo.removeClass(child.domNode, this.baseClass+"-child");
- if(child.baseClass){
- dojo.removeClass(child.domNode, this.baseClass+"-"+child.baseClass);
- }
+ var cls = this.baseClass + "-child"
+ + (child.baseClass ?
+ " " + this.baseClass + "-" + child.baseClass : "");
+ dojo.removeClass(child.domNode, cls);
+
this.inherited(arguments);
}
}
@@ -5236,15 +5670,22 @@ dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
var size = function(widget, dim){
// size the child
- widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
+ var newSize = widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
- // record child's size, but favor our own numbers when we have them.
- // the browser lies sometimes
- dojo.mixin(widget, dojo.marginBox(widget.domNode));
- dojo.mixin(widget, 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, /*Object[]*/ children){
+ 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:
@@ -5252,7 +5693,16 @@ dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
// dim:
// {l, t, w, h} object specifying dimensions of container into which to place children
// children:
- // an array like [ {domNode: foo, layoutAlign: "bottom" }, {domNode: bar, layoutAlign: "client"} ]
+ // 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);
@@ -5261,27 +5711,37 @@ dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
// 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.
- children = dojo.filter(children, function(item){ return item.layoutAlign != "client"; })
- .concat(dojo.filter(children, function(item){ return item.layoutAlign == "client"; }));
+ // 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.layoutAlign;
+ 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.bottom = elmStyle.right = "auto";
+ 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"){
- size(child, { w: dim.w });
+ sizeSetting.w = dim.w;
+ size(child, sizeSetting);
dim.h -= child.h;
if(pos == "top"){
dim.t += child.h;
@@ -5289,14 +5749,15 @@ dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
elmStyle.top = dim.t + dim.h + "px";
}
}else if(pos == "left" || pos == "right"){
- size(child, { h: dim.h });
+ 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"){
+ }else if(pos == "client" || pos == "center"){
size(child, dim);
}
});
@@ -5340,7 +5801,19 @@ dojo.declare("dijit._CssStateMixin", [], {
// is hovered, etc.
cssStateNodes: {},
- postCreate: function(){
+ // 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
@@ -5349,15 +5822,8 @@ dojo.declare("dijit._CssStateMixin", [], {
}, this);
// Monitoring changes to disabled, readonly, etc. state, and update CSS class of root node
- this.connect(this, "set", function(name, value){
- if(arguments.length >= 2 && {disabled: true, readOnly: true, checked:true, selected:true}[name]){
- this._setStateClass();
- }
- });
-
- // The widget coming in/out of the focus change affects it's state
- dojo.forEach(["_onFocus", "_onBlur"], function(ap){
- this.connect(this, ap, "_setStateClass");
+ 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
@@ -5365,44 +5831,42 @@ dojo.declare("dijit._CssStateMixin", [], {
this._trackMouseState(this[ap], this.cssStateNodes[ap]);
}
// Set state initially; there's probably no hover/active/focus state but widget might be
- // disabled/readonly so we want to set CSS classes for those conditions.
+ // 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,
- // then calls _setStateClass() to set appropriate CSS classes for this.domNode.
+ // Sets hovering and active properties depending on mouse state,
+ // which triggers _setStateClass() to set appropriate CSS classes for this.domNode.
if(!this.disabled){
switch(event.type){
case "mouseenter":
case "mouseover": // generated on non-IE browsers even though we connected to mouseenter
- this._hovering = true;
- this._active = this._mouseDown;
+ 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._hovering = false;
- this._active = false;
+ this._set("hovering", false);
+ this._set("active", false);
break;
case "mousedown" :
- this._active = true;
+ 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._active = false;
this._mouseDown = false;
- this._setStateClass();
+ this._set("active", false);
this.disconnect(mouseUpConnector);
});
break;
}
- this._setStateClass();
}
},
@@ -5421,11 +5885,12 @@ dojo.declare("dijit._CssStateMixin", [], {
// 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, this._focused):
+ // 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
@@ -5458,9 +5923,9 @@ dojo.declare("dijit._CssStateMixin", [], {
}else if(this.readOnly){
multiply("ReadOnly");
}else{
- if(this._active){
+ if(this.active){
multiply("Active");
- }else if(this._hovering){
+ }else if(this.hovering){
multiply("Hover");
}
}
@@ -5553,11 +6018,8 @@ dojo.declare("dijit._CssStateMixin", [], {
// Just in case widget is enabled/disabled while it has focus/hover/active state.
// Maybe this is overkill.
- this.connect(this, "set", function(name, value){
- if(name == "disabled" || name == "readOnly"){
- setClass();
- }
- });
+ this.watch("disabled", setClass);
+ this.watch("readOnly", setClass);
}
});
@@ -5572,7 +6034,6 @@ dojo.provide("dijit.form._FormWidget");
-
dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._CssStateMixin],
{
// summary:
@@ -5586,7 +6047,7 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._
//
// They also share some common methods.
- // name: String
+ // name: [const] String
// Name used when submitting form; same as "name" attribute or plain HTML elements
name: "",
@@ -5643,7 +6104,7 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._
},
_setDisabledAttr: function(/*Boolean*/ value){
- this.disabled = value;
+ this._set("disabled", value);
dojo.attr(this.focusNode, 'disabled', value);
if(this.valueNode){
dojo.attr(this.valueNode, 'disabled', value);
@@ -5653,8 +6114,8 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._
if(value){
// reset these, because after the domNode is disabled, we can no longer receive
// mouse related events, see #4200
- this._hovering = false;
- this._active = false;
+ 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";
@@ -5664,17 +6125,19 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._
if(dojo.isWebKit || dijit.hasDefaultTabStop(node)){ // see #11064 about webkit bug
node.setAttribute('tabIndex', "-1");
}else{
- node.removeAttribute('tabIndex');
+ node.removeAttribute('tabIndex');
}
}, this);
}else{
- this.focusNode.setAttribute('tabIndex', this.tabIndex);
+ if(this.tabIndex != ""){
+ this.focusNode.setAttribute('tabIndex', this.tabIndex);
+ }
}
},
setDisabled: function(/*Boolean*/ disabled){
// summary:
- // Deprecated. Use set('disabled', ...) instead.
+ // Deprecated. Use set('disabled', ...) instead.
dojo.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0");
this.set('disabled', disabled);
},
@@ -5688,21 +6151,23 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._
isFocusable: function(){
// summary:
- // Tells if this widget is focusable or not. Used internally by dijit.
+ // Tells if this widget is focusable or not. Used internally by dijit.
// tags:
// protected
- return !this.disabled && !this.readOnly && this.focusNode && (dojo.style(this.domNode, "display") != "none");
+ return !this.disabled && this.focusNode && (dojo.style(this.domNode, "display") != "none");
},
focus: function(){
// summary:
// Put focus on this widget
- dijit.focus(this.focusNode);
+ if(!this.disabled){
+ dijit.focus(this.focusNode);
+ }
},
- compare: function(/*anything*/val1, /*anything*/val2){
+ compare: function(/*anything*/ val1, /*anything*/ val2){
// summary:
- // Compare 2 values (as returned by attr('value') for this widget).
+ // Compare 2 values (as returned by get('value') for this widget).
// tags:
// protected
if(typeof val1 == "number" && typeof val2 == "number"){
@@ -5729,27 +6194,28 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._
// when the initial value is set.
_onChangeActive: false,
- _handleOnChange: function(/*anything*/ newValue, /* Boolean? */ priorityChange){
+ _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==true,
+ // but on mouse up, it's priorityChange==true. If intermediateChanges==false,
// onChange is only called form priorityChange=true events.
// tags:
// private
- this._lastValue = newValue;
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;
}
- if((this.intermediateChanges || priorityChange || priorityChange === undefined) &&
- ((typeof newValue != typeof this._lastValueReported) ||
- this.compare(newValue, this._lastValueReported) != 0)){
+ 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);
@@ -5781,14 +6247,14 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._
setValue: function(/*String*/ value){
// summary:
- // Deprecated. Use set('value', ...) instead.
+ // 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.
+ // Deprecated. Use get('value') instead.
dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0");
return this.get('value');
},
@@ -5798,7 +6264,7 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._
// 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 && this.isFocusable()){ // !e.ctrlKey to ignore right-click on mac
+ 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(){
@@ -5822,7 +6288,7 @@ dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
// 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.
+ // 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
@@ -5840,39 +6306,40 @@ dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
}),
_setReadOnlyAttr: function(/*Boolean*/ value){
- this.readOnly = 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){ // IE won't stop the event with keypress
+ 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._resetValue = this.value;
+ this._lastValueReported = this._resetValue = this.value;
}
},
- _setValueAttr: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+ _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){
// summary:
- // Hook so attr('value', value) works.
+ // 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.value = newValue;
this._handleOnChange(newValue, priorityChange);
},
- _getValueAttr: function(){
+ _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){
// summary:
- // Hook so attr('value') works.
- return this._lastValue;
+ // 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(){
@@ -5933,6 +6400,14 @@ if(!dojo._hasResource["dijit.dijit"]){ //_hasResource checks added by build. Do
dojo._hasResource["dijit.dijit"] = true;
dojo.provide("dijit.dijit");
+
+
+
+
+
+
+
+
/*=====
dijit.dijit = {
// summary:
@@ -5949,21 +6424,15 @@ dijit.dijit = {
// 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
-
-
-
-
-
-
}
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.
@@ -5971,16 +6440,16 @@ dojo.declare("dojo.fx.Toggler", null, {
// 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`).
+ // 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,
+ // | showFunc: dojo.fx.wipeIn,
// | // hideFunc will default to "fadeOut"
// | });
// | t.show(100); // delay showing for 100ms
@@ -5995,7 +6464,7 @@ dojo.declare("dojo.fx.Toggler", null, {
// The function that returns the `dojo.Animation` to show the node
showFunc: dojo.fadeIn,
- // hideFunc: Function
+ // hideFunc: Function
// The function that returns the `dojo.Animation` to hide the node
hideFunc: dojo.fadeOut,
@@ -6011,7 +6480,7 @@ dojo.declare("dojo.fx.Toggler", null, {
// 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.
+ // each animation individually.
// FIXME: also would be nice to have events from the animations exposed/bridged
/*=====
@@ -6064,7 +6533,9 @@ dojo.declare("dojo.fx.Toggler", null, {
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");
- // FIXME: remove this back-compat require in 2.0
+
+
+
/*=====
dojo.fx = {
// summary: Effects library on top of Base animations
@@ -6072,7 +6543,7 @@ dojo.fx = {
=====*/
(function(){
- var d = dojo,
+ var d = dojo,
_baseObj = {
_fire: function(evt, args){
if(this[evt]){
@@ -6191,14 +6662,14 @@ dojo.fx = {
d.extend(_chain, _baseObj);
dojo.fx.chain = function(/*dojo.Animation[]*/ animations){
- // summary:
+ // 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,
+ // onEnd of this animation means the end of the chain,
// not the individual animations within)
//
// example:
@@ -6226,7 +6697,7 @@ dojo.fx = {
this._pseudoAnimation = new d.Animation({curve: [0, 1], duration: this.duration});
var self = this;
- d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"],
+ d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"],
function(evt){
self._connects.push(d.connect(self._pseudoAnimation, evt,
function(){ self._fire(evt, arguments); }
@@ -6284,11 +6755,11 @@ dojo.fx = {
d.extend(_combine, _baseObj);
dojo.fx.combine = function(/*dojo.Animation[]*/ animations){
- // summary:
+ // summary:
// Combine a list of `dojo.Animation`s to run in parallel
//
// description:
- // Combine an array of `dojo.Animation`s to run in parallel,
+ // Combine an array of `dojo.Animation`s to run in parallel,
// providing a new `dojo.Animation` instance encompasing each
// animation, firing standard animation events.
//
@@ -6359,17 +6830,17 @@ dojo.fx = {
}
}, args));
- d.connect(anim, "onEnd", function(){
+ 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.
+ // Shrink a node to nothing and hide it.
//
// description:
// Returns an animation that will shrink node defined in "args"
@@ -6378,7 +6849,7 @@ dojo.fx = {
// 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()
@@ -6404,14 +6875,14 @@ dojo.fx = {
});
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"
+ // Returns an animation that will slide "node"
// defined in args Object from its current position to
// the position defined by (args.left, args.top).
//
@@ -6423,7 +6894,7 @@ dojo.fx = {
// example:
// | dojo.fx.slideTo({ node: node, left:"40", top:"50", units:"px" }).play()
- var node = args.node = d.byId(args.node),
+ var node = args.node = d.byId(args.node),
top = null, left = null;
var init = (function(n){
@@ -6453,7 +6924,7 @@ dojo.fx = {
d.connect(anim, "beforeBegin", anim, init);
return anim; // dojo.Animation
- }
+ };
})();
@@ -6464,6 +6935,7 @@ dojo._hasResource["dojo.NodeList-fx"] = true;
dojo.provide("dojo.NodeList-fx");
+
/*=====
dojo["NodeList-fx"] = {
// summary: Adds dojo.fx animation support to dojo.query()
@@ -6479,7 +6951,7 @@ dojo.extend(dojo.NodeList, {
dojo.mixin(tmpArgs, args);
return obj[method](tmpArgs);
})
- );
+ );
return args.auto ? a.play() && this : a; // dojo.Animation|dojo.NodeList
},
@@ -6488,7 +6960,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -6512,7 +6984,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -6531,7 +7003,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -6554,7 +7026,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -6573,7 +7045,7 @@ dojo.extend(dojo.NodeList, {
// 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
+ // Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
// returns: dojo.Animation|dojo.NodeList
@@ -6609,14 +7081,14 @@ dojo.extend(dojo.NodeList, {
// example:
// | dojo.query(".zork").animateProperty({
// | duration: 500,
- // | properties: {
+ // | properties: {
// | color: { start: "black", end: "white" },
- // | left: { end: 300 }
- // | }
+ // | left: { end: 300 }
+ // | }
// | }).play();
//
// example:
- // | dojo.query(".grue").animateProperty({
+ // | dojo.query(".grue").animateProperty({
// | auto:true,
// | properties: {
// | height:240
@@ -6625,9 +7097,9 @@ dojo.extend(dojo.NodeList, {
return this._anim(dojo, "animateProperty", args); // dojo.Animation|dojo.NodeList
},
- anim: function( /*Object*/ properties,
- /*Integer?*/ duration,
- /*Function?*/ easing,
+ anim: function( /*Object*/ properties,
+ /*Integer?*/ duration,
+ /*Function?*/ easing,
/*Function?*/ onEnd,
/*Integer?*/ delay){
// summary:
@@ -6635,8 +7107,8 @@ dojo.extend(dojo.NodeList, {
// 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.
+ // 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?
@@ -6661,7 +7133,7 @@ dojo.extend(dojo.NodeList, {
easing: easing
});
})
- );
+ );
if(onEnd){
dojo.connect(canim, "onEnd", onEnd);
}
@@ -6675,6 +7147,8 @@ if(!dojo._hasResource["dojo.colors"]){ //_hasResource checks added by build. Do
dojo._hasResource["dojo.colors"] = true;
dojo.provide("dojo.colors");
+dojo.getObject("colors", true, dojo);
+
//TODO: this module appears to break naming conventions
/*=====
@@ -6721,9 +7195,9 @@ dojo.colors = {
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,
+ // 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,
@@ -6905,13 +7379,16 @@ if(!dojo._hasResource["dojo.i18n"]){ //_hasResource checks added by build. Do no
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)
};
=====*/
-dojo.i18n.getLocalization = function(/*String*/packageName, /*String*/bundleName, /*String?*/locale){
+// 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.
@@ -6939,7 +7416,7 @@ dojo.i18n.getLocalization = function(/*String*/packageName, /*String*/bundleName
// look for nearest locale match
var elements = locale.split('-');
var module = [packageName,"nls",bundleName].join('.');
- var bundle = dojo._loadedModules[module];
+ var bundle = dojo._loadedModules[module];
if(bundle){
var localization;
for(var i = elements.length; i > 0; i--){
@@ -6989,7 +7466,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
var targetLocale = dojo.i18n.normalizeLocale(locale);
var bundlePackage = [moduleName, "nls", bundleName].join(".");
- // NOTE:
+ // 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.
@@ -6999,7 +7476,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
// 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){
@@ -7016,7 +7493,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
}
if(!bestLocale){
bestLocale = "ROOT";
- }
+ }
}
//See if the desired locale is already loaded.
@@ -7048,6 +7525,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
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;
@@ -7062,7 +7540,7 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
}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.
@@ -7080,8 +7558,8 @@ dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundle
(function(){
// If other locales are used, dojo.requireLocalization should load them as
- // well, by default.
- //
+ // 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.
@@ -7158,6 +7636,7 @@ dojo._hasResource["dijit._PaletteMixin"] = true;
dojo.provide("dijit._PaletteMixin");
+
dojo.declare("dijit._PaletteMixin",
[dijit._CssStateMixin],
{
@@ -7184,23 +7663,23 @@ dojo.declare("dijit._PaletteMixin",
// 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,
=====*/
@@ -7217,7 +7696,7 @@ dojo.declare("dijit._PaletteMixin",
// dyeClass should implements dijit.Dye interface
dyeClass: '',
- _preparePalette: function(choices, titles) {
+ _preparePalette: function(choices, titles, dyeClassObj) {
// summary:
// Subclass must call _preparePalette() from postCreate(), passing in the tooltip
// for each cell
@@ -7225,18 +7704,20 @@ dojo.declare("dijit._PaletteMixin",
// 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;
- var dyeClassObj = dojo.getObject(this.dyeClass);
+ 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);
+ var cellObject = new dyeClassObj(value, row, col);
var cellNode = dojo.create("td", {
"class": this.cellClass,
@@ -7316,7 +7797,7 @@ dojo.declare("dijit._PaletteMixin",
// tags:
// private
- var target = evt.currentTarget,
+ var target = evt.currentTarget,
value = this._getDye(target).getValue();
// First focus the clicked cell, and then send onChange() notification.
@@ -7326,8 +7807,8 @@ dojo.declare("dijit._PaletteMixin",
// 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);
+ dijit.focus(target);
+ this._setValueAttr(value, true);
}));
// workaround bug where hover class is not removed on popup because the popup is
@@ -7371,8 +7852,7 @@ dojo.declare("dijit._PaletteMixin",
// Optional parameter used to tell the select whether or not to fire
// onChange event.
- // clear old value and selected cell
- this.value = null;
+ // clear old selected cell
if(this._selectedCell >= 0){
dojo.removeClass(this._cells[this._selectedCell].node, "dijitPaletteCellSelected");
}
@@ -7383,18 +7863,18 @@ dojo.declare("dijit._PaletteMixin",
for(var i = 0; i < this._cells.length; i++){
if(value == this._cells[i].dye.getValue()){
this._selectedCell = i;
- this.value = value;
-
dojo.addClass(this._cells[i].node, "dijitPaletteCellSelected");
-
- if(priorityChange || priorityChange === undefined){
- this.onChange(value);
- }
-
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){
@@ -7444,7 +7924,7 @@ dojo.declare("dijit.Dye",
// summary:
// Interface for the JS Object associated with a palette cell (i.e. DOMNode)
- constructor: function(alias){
+ constructor: function(alias, row, col){
// summary:
// Initialize according to value or alias like "white"
// alias: String
@@ -7483,7 +7963,6 @@ dojo.provide("dijit.ColorPalette");
-
dojo.declare("dijit.ColorPalette",
[dijit._Widget, dijit._Templated, dijit._PaletteMixin],
{
@@ -7501,7 +7980,7 @@ dojo.declare("dijit.ColorPalette",
// | picker.startup();
- // palette: String
+ // palette: [const] String
// Size of grid, either "7x10" or "3x4".
palette: "7x10",
@@ -7523,65 +8002,88 @@ dojo.declare("dijit.ColorPalette",
["gray", "red", "purple", "black"]]
},
- // _imagePaths: [protected] Map
- // This is stores the path to the palette images
- _imagePaths: {
- "7x10": dojo.moduleUrl("dijit.themes", "a11y/colors7x10.png"),
- "3x4": dojo.moduleUrl("dijit.themes", "a11y/colors3x4.png"),
- "7x10-rtl": dojo.moduleUrl("dijit.themes", "a11y/colors7x10-rtl.png"),
- "3x4-rtl": dojo.moduleUrl("dijit.themes", "a11y/colors3x4-rtl.png")
- },
-
// templateString: String
// The template of this widget.
- templateString: dojo.cache("dijit", "templates/ColorPalette.html", "<div class=\"dijitInline dijitColorPalette\">\n\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\" alt=\"\"/>\n\t<table class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\">\n\t\t<tbody dojoAttachPoint=\"gridNode\"></tbody>\n\t</table>\n</div>\n"),
+ 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",
- dyeClass: 'dijit._Color',
-
buildRendering: function(){
// Instantiate the template, which makes a skeleton into which we'll insert a bunch of
// <img> nodes
-
this.inherited(arguments);
- this.imageNode.setAttribute("src", this._imagePaths[this.palette + (this.isLeftToRight() ? "" : "-rtl")].toString());
-
- var i18nColorNames = dojo.i18n.getLocalization("dojo", "colors", this.lang);
+ // 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],
- i18nColorNames
+ 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,
+dojo.declare("dijit._Color", dojo.Color, {
// summary:
// Object associated with each cell in a ColorPalette palette.
// Implements dijit.Dye.
- {
- constructor: function(/*String*/alias){
- this._alias = alias;
- 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();
- },
+ // 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>",
- fillCell: function(/*DOMNode*/ cell, /*String*/ blankGif){
- dojo.create("img", {
- src: blankGif,
- "class": "dijitPaletteImg",
- alt: this._alias
- }, cell);
- }
+ // _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);
}
-);
+});
}
@@ -7589,6 +8091,8 @@ if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build.
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;
@@ -7620,25 +8124,10 @@ if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by bu
dojo._hasResource["dojo.dnd.autoscroll"] = true;
dojo.provide("dojo.dnd.autoscroll");
-dojo.dnd.getViewport = function(){
- // summary:
- // Returns a viewport size (visible part of the window)
-
- // TODO: remove this when getViewport() moved to dojo core, see #7028
-
- // FIXME: need more docs!!
- var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
- if(dojo.isMozilla){
- return {w: dd.clientWidth, h: w.innerHeight}; // Object
- }else if(!dojo.isOpera && w.innerWidth){
- return {w: w.innerWidth, h: w.innerHeight}; // Object
- }else if (!dojo.isOpera && dd && dd.clientWidth){
- return {w: dd.clientWidth, h: dd.clientHeight}; // Object
- }else if (b.clientWidth){
- return {w: b.clientWidth, h: b.clientHeight}; // Object
- }
- return null; // Object
-};
+
+dojo.getObject("dnd", true, dojo);
+
+dojo.dnd.getViewport = dojo.window.getBox;
dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
@@ -7654,7 +8143,7 @@ dojo.dnd.autoScroll = function(e){
// onmousemove event
// FIXME: needs more docs!
- var v = dojo.dnd.getViewport(), dx = 0, dy = 0;
+ 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){
@@ -7685,14 +8174,15 @@ dojo.dnd.autoScrollNodes = function(e){
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),
+ 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
+ // 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;
+ rx += dojo.body().scrollLeft;
+ ry += dojo.body().scrollTop;
}
if(rx > 0 && rx < b.w){
if(rx < w){
@@ -7736,7 +8226,7 @@ dojo.provide("dojo.dnd.Mover");
dojo.declare("dojo.dnd.Mover", null, {
constructor: function(node, e, host){
// summary:
- // an object, which makes a node follow the mouse.
+ // 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
@@ -7747,17 +8237,27 @@ dojo.declare("dojo.dnd.Mover", null, {
// 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};
+ 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,
- firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
+ 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),
- firstEvent
+ dojo.connect(d.body, "onselectstart", dojo.stopEvent)
];
// notify that the move has started
if(h && h.onMoveStart){
@@ -7767,17 +8267,18 @@ dojo.declare("dojo.dnd.Mover", null, {
// mouse event processors
onMouseMove: function(e){
// summary:
- // event processor for onmousemove
+ // event processor for onmousemove/ontouchmove
// e: Event
- // mouse 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);
+ 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){
+ 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);
@@ -7785,7 +8286,7 @@ dojo.declare("dojo.dnd.Mover", null, {
// utilities
onFirstMove: function(e){
// summary:
- // makes the node absolute; it is meant to be called only once.
+ // 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){
@@ -7805,7 +8306,7 @@ dojo.declare("dojo.dnd.Mover", null, {
// 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.
+ // the computed style.
var b = dojo.doc.body;
var bs = dojo.getComputedStyle(b);
var bm = dojo._getMarginBox(b, bs);
@@ -7819,7 +8320,10 @@ dojo.declare("dojo.dnd.Mover", null, {
if(h && h.onFirstMove){
h.onFirstMove(this, e);
}
- dojo.disconnect(this.events.pop());
+
+ // Disconnect onmousemove and ontouchmove events that call this function
+ dojo.disconnect(this.events.shift());
+ dojo.disconnect(this.events.shift());
},
destroy: function(){
// summary:
@@ -7886,6 +8390,7 @@ dojo.declare("dojo.dnd.Moveable", null, {
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")
@@ -7908,17 +8413,20 @@ dojo.declare("dojo.dnd.Moveable", null, {
// mouse event processors
onMouseDown: function(e){
// summary:
- // event processor for onmousedown, creates a Mover for the node
+ // event processor for onmousedown/ontouchstart, creates a Mover for the node
// e: Event
- // mouse 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, "onmouseup", this, "onMouseUp")
+ dojo.connect(this.handle, "ontouchmove", this, "onMouseMove"),
+ dojo.connect(this.handle, "onmouseup", this, "onMouseUp"),
+ dojo.connect(this.handle, "ontouchend", this, "onMouseUp")
);
- this._lastX = e.pageX;
- this._lastY = e.pageY;
+ var pos = e.touches ? e.touches[0] : e;
+ this._lastX = pos.pageX;
+ this._lastY = pos.pageY;
}else{
this.onDragDetected(e);
}
@@ -7926,10 +8434,11 @@ dojo.declare("dojo.dnd.Moveable", null, {
},
onMouseMove: function(e){
// summary:
- // event processor for onmousemove, used only for delayed drags
+ // event processor for onmousemove/ontouchmove, used only for delayed drags
// e: Event
- // mouse event
- if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
+ // 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);
}
@@ -7966,8 +8475,8 @@ dojo.declare("dojo.dnd.Moveable", null, {
// summary:
// called before every move operation
dojo.publish("/dnd/move/start", [mover]);
- dojo.addClass(dojo.body(), "dojoMove");
- dojo.addClass(this.node, "dojoMoveItem");
+ dojo.addClass(dojo.body(), "dojoMove");
+ dojo.addClass(this.node, "dojoMoveItem");
},
onMoveStop: function(/* dojo.dnd.Mover */ mover){
// summary:
@@ -8059,7 +8568,7 @@ dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
c.r = c.l + c.w;
c.b = c.t + c.h;
if(this.within){
- var mb = dojo.marginBox(mover.node);
+ var mb = dojo._getMarginSize(mover.node);
c.r -= mb.w;
c.b -= mb.h;
}
@@ -8069,8 +8578,12 @@ dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
// called during every move notification;
// should actually move the node; can be overwritten.
var c = this.constraintBox, s = mover.node.style;
- s.left = (leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l) + "px";
- s.top = (leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t) + "px";
+ 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);
}
});
@@ -8132,8 +8645,8 @@ dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constraine
// an optional object with parameters
var area = params && params.area;
this.constraints = function(){
- var n = this.node.parentNode,
- s = dojo.getComputedStyle(n),
+ var n = this.node.parentNode,
+ s = dojo.getComputedStyle(n),
mb = dojo._getMarginBox(n, s);
if(area == "margin"){
return mb; // Object
@@ -8155,100 +8668,6 @@ dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constraine
}
});
-// WARNING: below are obsolete objects, instead of custom movers use custom moveables (above)
-
-dojo.dnd.move.constrainedMover = function(fun, within){
- // summary:
- // returns a constrained version of dojo.dnd.Mover
- // description:
- // this function produces n object, which will put a constraint on
- // the margin box of dragged object in absolute coordinates
- // fun: Function
- // called on drag, and returns a constraint box
- // within: Boolean
- // if true, constraints the whole dragged object withtin the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");
- var mover = function(node, e, notifier){
- dojo.dnd.Mover.call(this, node, e, notifier);
- };
- dojo.extend(mover, dojo.dnd.Mover.prototype);
- dojo.extend(mover, {
- onMouseMove: function(e){
- // summary: event processor for onmousemove
- // e: Event: mouse event
- dojo.dnd.autoScroll(e);
- var m = this.marginBox, c = this.constraintBox,
- l = m.l + e.pageX, t = m.t + e.pageY;
- l = l < c.l ? c.l : c.r < l ? c.r : l;
- t = t < c.t ? c.t : c.b < t ? c.b : t;
- this.host.onMove(this, {l: l, t: t});
- },
- onFirstMove: function(){
- // summary: called once to initialize things; it is meant to be called only once
- dojo.dnd.Mover.prototype.onFirstMove.call(this);
- var c = this.constraintBox = fun.call(this);
- c.r = c.l + c.w;
- c.b = c.t + c.h;
- if(within){
- var mb = dojo.marginBox(this.node);
- c.r -= mb.w;
- c.b -= mb.h;
- }
- }
- });
- return mover; // Object
-};
-
-dojo.dnd.move.boxConstrainedMover = function(box, within){
- // summary:
- // a specialization of dojo.dnd.constrainedMover, which constrains to the specified box
- // box: Object
- // a constraint box (l, t, w, h)
- // within: Boolean
- // if true, constraints the whole dragged object withtin the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");
- return dojo.dnd.move.constrainedMover(function(){ return box; }, within); // Object
-};
-
-dojo.dnd.move.parentConstrainedMover = function(area, within){
- // summary:
- // a specialization of dojo.dnd.constrainedMover, which constrains to the parent node
- // area: String
- // "margin" to constrain within the parent's margin box, "border" for the border box,
- // "padding" for the padding box, and "content" for the content box; "content" is the default value.
- // within: Boolean
- // if true, constraints the whole dragged object within the rectangle,
- // otherwise the constraint is applied to the left-top corner
-
- dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");
- var fun = 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
- };
- return dojo.dnd.move.constrainedMover(fun, within); // Object
-};
-
// patching functions one level up for compatibility
dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover;
@@ -8279,7 +8698,7 @@ dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], {
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
+ // 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.
@@ -8338,8 +8757,7 @@ dojo.provide("dijit.form._FormMixin");
-dojo.declare("dijit.form._FormMixin", null,
- {
+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)
@@ -8350,10 +8768,10 @@ dojo.declare("dijit.form._FormMixin", null,
// form widgets
/*=====
- // value: Object
+ // 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).
@@ -8364,6 +8782,12 @@ dojo.declare("dijit.form._FormMixin", null,
// | { 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
@@ -8382,11 +8806,11 @@ dojo.declare("dijit.form._FormMixin", null,
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
+ // 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
@@ -8407,9 +8831,9 @@ dojo.declare("dijit.form._FormMixin", null,
dojo.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.", "", "2.0");
return this.set('value', val);
},
- _setValueAttr: function(/*object*/obj){
+ _setValueAttr: function(/*Object*/ obj){
// summary:
- // Fill in form values from according to an Object (in the format returned by attr('value'))
+ // 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 = { };
@@ -8487,7 +8911,7 @@ dojo.declare("dijit.form._FormMixin", null,
return; // like "continue"
}
- // TODO: widget values (just call attr('value', ...) on the widget)
+ // TODO: widget values (just call set('value', ...) on the widget)
// TODO: maybe should call dojo.getNodeProp() instead
switch(element.type){
@@ -8519,6 +8943,9 @@ 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(){
@@ -8527,17 +8954,18 @@ dojo.declare("dijit.form._FormMixin", null,
},
_getValueAttr: function(){
// summary:
- // Returns Object representing form values.
+ // Returns Object representing form values. See description of `value` for details.
// description:
- // Returns name/value hash for each form element.
- // If there are multiple elements w/the same name, value is an array,
- // unless they are radio buttons in which case value is a scalar since only
- // one can be checked at a time.
+
+ // 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:
//
- // If the name is a dot separated list (like a.b.c.d), creates a nested structure.
- // Only works on widget form elements.
- // example:
- // | { name: "John Smith", interests: ["sports", "movies"] }
+ // 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 = { };
@@ -8545,7 +8973,7 @@ dojo.declare("dijit.form._FormMixin", null,
var name = widget.name;
if(!name || widget.disabled){ return; }
- // Single value widget (checkbox, radio, or plain <input> type widget
+ // 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
@@ -8648,98 +9076,132 @@ dojo.declare("dijit.form._FormMixin", null,
return obj;
},
- // TODO: ComboBox might need time to process a recently input value. This should be async?
isValid: function(){
// summary:
- // Returns true if all of the widgets are valid
-
- // This also populate this._invalidWidgets[] array with list of invalid widgets...
- // TODO: put that into separate function? It's confusing to have that as a side effect
- // of a method named isValid().
+ // Returns true if all of the widgets are valid.
+ // Deprecated, will be removed in 2.0. Use get("state") instead.
- this._invalidWidgets = dojo.filter(this.getDescendants(), function(widget){
- return !widget.disabled && widget.isValid && !widget.isValid();
- });
- return !this._invalidWidgets.length;
+ 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.
},
- _widgetChange: function(widget){
+ _getState: function(){
// summary:
- // Connected to a widget's onChange function - update our
- // valid state, if needed.
- var isValid = this._lastValidState;
- if(!widget || this._lastValidState === undefined){
- // We have passed a null widget, or we haven't been validated
- // yet - let's re-check all our children
- // This happens when we connect (or reconnect) our children
- isValid = this.isValid();
- if(this._lastValidState === undefined){
- // Set this so that we don't fire an onValidStateChange
- // the first time
- this._lastValidState = isValid;
- }
- }else if(widget.isValid){
- this._invalidWidgets = dojo.filter(this._invalidWidgets || [], function(w){
- return (w != widget);
- }, this);
- if(!widget.isValid() && !widget.get("disabled")){
- this._invalidWidgets.push(widget);
- }
- isValid = (this._invalidWidgets.length === 0);
- }
- if(isValid !== this._lastValidState){
- this._lastValidState = isValid;
- this.onValidStateChange(isValid);
- }
+ // 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" : "";
},
- connectChildren: function(){
+ disconnectChildren: function(){
// summary:
- // Connects to the onChange function of all children to
- // track valid state changes. You can call this function
- // directly, ex. in the event that you programmatically
- // add a widget to the form *after* the form has been
+ // 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.
- dojo.forEach(this._changeConnections, dojo.hitch(this, "disconnect"));
+
var _this = this;
- // we connect to validate - so that it better reflects the states
- // of the widgets - also, we only connect if it has a validate
- // function (to avoid too many unneeded connections)
- var conns = (this._changeConnections = []);
- dojo.forEach(dojo.filter(this.getDescendants(),
+ // 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 is validated - or
- // whenever the disabled attribute on that widget is changed
- conns.push(_this.connect(widget, "validate",
- dojo.hitch(_this, "_widgetChange", widget)));
- conns.push(_this.connect(widget, "_setDisabledAttr",
- dojo.hitch(_this, "_widgetChange", 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());
+ }));
+ });
});
- // Call the widget change function to update the valid state, in
- // case something is different now.
- this._widgetChange(null);
+ // 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 our valid state tracking. Needs to be done in startup
- // because it's not guaranteed that our children are initialized
- // yet.
- this._changeConnections = [];
- this.connectChildren();
+
+ // 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);
}
+
});
}
@@ -8802,22 +9264,16 @@ dojo.declare("dijit._DialogMixin", null,
this.execute(this.get('value'));
},
- _getFocusItems: function(/*Node*/ dialogNode){
+ _getFocusItems: function(){
// summary:
- // Find focusable Items each time a dialog is opened,
- // setting _firstFocusItem and _lastFocusItem
+ // Finds focusable items in dialog,
+ // and sets this._firstFocusItem and this._lastFocusItem
// tags:
// protected
- var elems = dijit._getTabNavigable(dojo.byId(dialogNode));
- this._firstFocusItem = elems.lowest || elems.first || dialogNode;
+ 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.isMoz && this._firstFocusItem.tagName.toLowerCase() == "input" &&
- dojo.getNodeProp(this._firstFocusItem, "type").toLowerCase() == "file"){
- // FF doesn't behave well when first element is input type=file, set first focusable to dialog container
- dojo.attr(dialogNode, "tabIndex", "0");
- this._firstFocusItem = dialogNode;
- }
}
}
);
@@ -8832,7 +9288,6 @@ dojo.provide("dijit.DialogUnderlay");
-
dojo.declare(
"dijit.DialogUnderlay",
[dijit._Widget, dijit._Templated],
@@ -8869,10 +9324,12 @@ dojo.declare(
_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(){
@@ -8921,17 +9378,265 @@ dojo.declare(
// summary:
// Hides the dialog underlay
this.bgIframe.destroy();
+ delete this.bgIframe;
this.domNode.style.display = "none";
- },
+ }
+ }
+);
- uninitialize: function(){
- if(this.bgIframe){
- this.bgIframe.destroy();
+}
+
+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.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.inherited(arguments);
+ 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;
}
-);
+});
}
@@ -8939,24 +9644,25 @@ if(!dojo._hasResource["dojo.html"]){ //_hasResource checks added by build. Do no
dojo._hasResource["dojo.html"] = true;
dojo.provide("dojo.html");
-// the parser might be needed..
-
+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,
+ 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
};
@@ -8976,7 +9682,7 @@ dojo.provide("dojo.html");
// node:
// the parent element
// content:
- // the content to be set on the parent element.
+ // 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
@@ -9002,7 +9708,7 @@ dojo.provide("dojo.html");
};
// we wrap up the content-setting operation in a object
- dojo.declare("dojo.html._ContentSetter", null,
+ dojo.declare("dojo.html._ContentSetter", null,
{
// node: DomNode|String
// An node which will be the parent element that we set content into
@@ -9013,11 +9719,11 @@ dojo.provide("dojo.html");
content: "",
// id: String?
- // Usually only used internally, and auto-generated with each instance
+ // Usually only used internally, and auto-generated with each instance
id: "",
// cleanContent: Boolean
- // Should the content be treated as a full html document,
+ // Should the content be treated as a full html document,
// and the real content stripped of <html>, <body> wrapper before injection
cleanContent: false,
@@ -9028,6 +9734,17 @@ dojo.provide("dojo.html");
// 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){
@@ -9045,14 +9762,14 @@ dojo.provide("dojo.html");
if(!this.id){
this.id = [
"Setter",
- (node) ? node.id || node.tagName : "",
+ (node) ? node.id || node.tagName : "",
idCounter++
].join("_");
}
},
set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){
// summary:
- // front-end to the set-content sequence
+ // 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
@@ -9072,9 +9789,9 @@ dojo.provide("dojo.html");
},
setContent: function(){
// summary:
- // sets the content on the node
+ // sets the content on the node
- var node = this.node;
+ var node = this.node;
if(!node) {
// can't proceed
throw new Error(this.declaredClass + ": setContent given no node");
@@ -9086,7 +9803,7 @@ dojo.provide("dojo.html");
// 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);
+ var errMess = this.onContentError(e);
try{
node.innerHTML = errMess;
}catch(e){
@@ -9102,7 +9819,7 @@ dojo.provide("dojo.html");
// cleanly empty out existing content
// destroy any widgets from a previous run
- // NOTE: if you dont want this you'll need to empty
+ // 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) {
@@ -9112,17 +9829,17 @@ dojo.provide("dojo.html");
});
delete this.parseResults;
}
- // this is fast, but if you know its already empty or safe, you could
+ // 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
+ // 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
+ // This default implementation checks for cleanContent and extractContent flags to
// optionally pre-process html string content
var cont = this.content;
@@ -9160,21 +9877,21 @@ dojo.provide("dojo.html");
// summary
// manually reset the Setter instance if its being re-used for example for another set()
// description
- // tearDown() is not called automatically.
+ // 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;
+ delete this.parseResults;
+ delete this.node;
+ delete this.content;
},
onContentError: function(err){
- return "Error occured setting content: " + 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
+ // 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;
@@ -9182,21 +9899,28 @@ dojo.provide("dojo.html");
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];
+ this[key] = params[key];
}
},
_parse: function(){
- // summary:
+ // 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,
- dir: this.dir,
- lang: this.lang
+ noStart: !this.startup,
+ inherited: inherited,
+ scope: this.parserScope
});
}catch(e){
this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id);
@@ -9229,29 +9953,29 @@ dojo.provide("dojo.html");
// node:
// the parent element that will receive the content
// cont:
- // the content to be set on the parent element.
+ // 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:
+ // 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});
+ // 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{
+ }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 }
+ var op = new dojo.html._ContentSetter(dojo.mixin(
+ params,
+ { content: cont, node: node }
));
return op.set();
}
@@ -9266,35 +9990,39 @@ dojo.provide("dijit.layout.ContentPane");
- // for dijit.layout.marginBox2contentBox()
-
-
dojo.declare(
- "dijit.layout.ContentPane", dijit._Widget,
+ "dijit.layout.ContentPane", [dijit._Widget, dijit.layout._ContentPaneResizeMixin],
{
// summary:
- // A widget that acts as a container for mixed HTML and widgets, and includes an Ajax interface
+ // A widget containing an HTML fragment, specified inline
+ // or by uri. Fragment may include widgets.
+ //
// description:
- // A widget that can be used as a stand alone widget
- // or as a base class for other widgets.
+ // 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.
//
- // Handles replacement of document fragment using either external uri or javascript
- // generated markup or DOM content, instantiating widgets within that content.
- // Don't confuse it with an iframe, it only needs/wants document fragments.
- // It's useful as a child of LayoutContainer, SplitContainer, or TabContainer.
- // But note that those classes can contain any widget as a child.
// example:
// Some quick samples:
- // To change the innerHTML use .set('content', '<b>new content</b>')
+ // To change the innerHTML: cp.set('content', '<b>new content</b>')
//
- // Or you can send it a NodeList, .set('content', dojo.query('div [class=selected]', userSelection))
- // please note that the nodes in NodeList will copied, not moved
+ // Or you can send it a NodeList: cp.set('content', dojo.query('div [class=selected]', userSelection))
//
- // To do a ajax update use .set('href', url)
+ // To do an ajax update: cp.set('href', url)
// href: String
// The href of the content that displays now.
@@ -9306,7 +10034,7 @@ dojo.declare(
/*=====
// content: String || DomNode || NodeList || dijit._Widget
// The innerHTML of the ContentPane.
- // Note that the initialization parameter / argument to attr("content", ...)
+ // Note that the initialization parameter / argument to set("content", ...)
// can be a String, DomNode, Nodelist, or _Widget.
content: "",
=====*/
@@ -9320,6 +10048,13 @@ dojo.declare(
// 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,
@@ -9343,7 +10078,7 @@ dojo.declare(
// isLoaded: [readonly] Boolean
// True if the ContentPane has data in it, either specified
// during initialization (via href or inline content), or set
- // via attr('content', ...) / attr('href', ...)
+ // via set('content', ...) / set('href', ...)
//
// False if it doesn't have any content, or if ContentPane is
// still in the process of downloading href.
@@ -9351,35 +10086,19 @@ dojo.declare(
baseClass: "dijitContentPane",
- // 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,
-
// ioArgs: Object
// Parameters to pass to xhrGet() request, for example:
// | <div dojoType="dijit.layout.ContentPane" href="./bar" ioArgs="{timeout: 500}">
ioArgs: {},
- // 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,
-
// onLoadDeferred: [readonly] dojo.Deferred
- // This is the `dojo.Deferred` returned by attr('href', ...) and refresh().
+ // 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 attr('href', ...) call or
+ // 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 is loaded.
+ // 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
@@ -9389,99 +10108,71 @@ dojo.declare(
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);
-
- // Detect if we were initialized with data
- if(!this.href && this.srcNodeRef && this.srcNodeRef.innerHTML){
- this.isLoaded = true;
- }
},
buildRendering: function(){
- // Overrides Widget.buildRendering().
- // Since we have no template we need to set this.containerNode ourselves.
- // For subclasses of ContentPane do have a template, does nothing.
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){
- // make getDescendants() work
this.containerNode = this.domNode;
}
- },
- postCreate: function(){
// remove the title attribute so it doesn't show up when hovering
- // over a node
+ // 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");
}
-
- dojo.addClass(this.domNode, this.baseClass);
},
- startup: function(){
+ _startChildren: 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;
-
- if(this.isLoaded){
- dojo.forEach(this.getChildren(), function(child){
- child.startup();
- });
- }
-
- if(this._isShown() || this.preload){
- this._onShow();
- }
+ // Call startup() on all children including non _Widget ones like dojo.dnd.Source objects
+ // This starts all the widgets
this.inherited(arguments);
- },
-
- _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 propogate 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, "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;
+ // 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);
}
-
- // 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);
},
setHref: function(/*String|Uri*/ href){
@@ -9492,23 +10183,25 @@ dojo.declare(
},
_setHrefAttr: function(/*String|Uri*/ href){
// summary:
- // Hook so attr("href", ...) works.
+ // 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 (an attr('href') will cancel any in-flight attr('href', ...))
+ // 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.href = href;
+ this._set("href", href);
// _setHrefAttr() is called during creation and by the user, after creation.
- // only in the second case do we actually load the URL; otherwise it's done in startup()
- if(this._created && (this.preload || this._isShown())){
+ // 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
@@ -9527,7 +10220,7 @@ dojo.declare(
},
_setContentAttr: function(/*String|DomNode|Nodelist*/data){
// summary:
- // Hook to make attr("content", ...) work.
+ // 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
@@ -9537,24 +10230,30 @@ dojo.declare(
// clear href so we can't run refresh and clear content
// refresh should only work if we downloaded the content
- this.href = "";
+ this._set("href", "");
- // Cancel any in-flight requests (an attr('content') will cancel any in-flight attr('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 attr('content') not an attr('href')
+ 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 attr("content") work
+ // Hook to make get("content") work
return this.containerNode.innerHTML;
},
@@ -9587,69 +10286,6 @@ dojo.declare(
this.inherited(arguments);
},
- 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.
- if(!this._wasShown){
- this._onShow();
- }
-
- this._resizeCalled = true;
-
- // 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);
- }
-
- // Make my children layout, or size my single child widget
- this._layoutChildren();
- },
-
- _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{
- // TODO: with _childOfLayoutWidget check maybe this branch no longer necessary?
- var node = this.domNode;
- return (node.style.display != 'none') && (node.style.visibility != 'hidden') && !dojo.hasClass(node, "dijitHidden");
- }
- },
-
_onShow: function(){
// summary:
// Called when the ContentPane is made visible
@@ -9661,26 +10297,15 @@ dojo.declare(
// 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)
){
- this.refresh();
- }
- }else{
- // If we are the child of a layout widget then the layout widget will call resize() on
- // us, and then we will size our child/children. Otherwise, we need to do it now.
- if(!this._childOfLayoutWidget && this._needLayout){
- // If a layout has been scheduled for when we become visible, do it now
- this._layoutChildren();
+ return this.refresh(); // If child has an href, promise that fires when the load is complete
}
}
-
- 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;
},
refresh: function(){
@@ -9695,8 +10320,9 @@ dojo.declare(
this.cancel();
this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel"));
+ this.onLoadDeferred.addCallback(dojo.hitch(this, "onLoad"));
this._load();
- return this.onLoadDeferred;
+ return this.onLoadDeferred; // If child has an href, promise that fires when refresh is complete
},
_load: function(){
@@ -9746,10 +10372,9 @@ dojo.declare(
_onLoadHandler: function(data){
// summary:
// This is called whenever new content is being loaded
- this.isLoaded = true;
+ this._set("isLoaded", true);
try{
this.onLoadDeferred.callback(data);
- this.onLoad(data);
}catch(e){
console.error('Error '+this.widgetId+' running custom onLoad code: ' + e.message);
}
@@ -9758,7 +10383,7 @@ dojo.declare(
_onUnloadHandler: function(){
// summary:
// This is called whenever the content is being unloaded
- this.isLoaded = false;
+ this._set("isLoaded", false);
try{
this.onUnload();
}catch(e){
@@ -9804,7 +10429,7 @@ dojo.declare(
delete this._singleChild;
},
- _setContent: function(cont, isFakeContent){
+ _setContent: function(/*String|DocumentFragment*/ cont, /*Boolean*/ isFakeContent){
// summary:
// Insert the content into the container node
@@ -9839,31 +10464,31 @@ dojo.declare(
cleanContent: this.cleanContent,
extractContent: this.extractContent,
parseContent: this.parseOnLoad,
+ parserScope: this.parserScope,
+ startup: false,
dir: this.dir,
lang: this.lang
}, this._contentSetterParams || {});
- dojo.mixin(setter, setterParams);
-
- setter.set( (dojo.isObject(cont) && cont.domNode) ? cont.domNode : cont );
+ 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(!isFakeContent){
- // Startup each top level child widget (and they will start their children, recursively)
- dojo.forEach(this.getChildren(), function(child){
- // The parser has already called startup on all widgets *without* a getParent() method
- if(!this.parseOnLoad || child.getParent){
- child.startup();
- }
- }, this);
+ if(this.doLayout){
+ this._checkIfSingleChild();
+ }
- // 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();
+ 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);
}
@@ -9873,7 +10498,7 @@ dojo.declare(
this.onLoadDeferred.errback(err);
// shows user the string that is returned by on[type]Error
- // overide on[type]Error and return your own string to customize
+ // 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);
@@ -9882,48 +10507,6 @@ dojo.declare(
}
},
- _scheduleLayout: function(){
- // summary:
- // 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._layoutChildren();
- }else{
- this._needLayout = true;
- }
- },
-
- _layoutChildren: function(){
- // summary:
- // Since I am a Container widget, each of my children expects me to
- // call resize() or layout() on them.
- // description:
- // Should be called on initialization and also whenever we get new content
- // (from an href, or from attr('content', ...))... but deferred until
- // the ContentPane is visible
-
- 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();
- }
- });
- }
- delete this._needLayout;
- },
-
// EVENT's, should be overide-able
onLoad: function(data){
// summary:
@@ -10035,12 +10618,16 @@ dojo.declare(
// Set by `dijit._DialogMixin._getFocusItems`.
_lastFocusItem: null,
- templateString: dojo.cache("dijit", "templates/TooltipDialog.html", "<div waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presentation\"></div>\n</div>\n"),
+ 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");
- this.containerNode.title = this.title;
},
orient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ corner){
@@ -10050,13 +10637,19 @@ dojo.declare(
// directly.
// tags:
// protected
- var c = this._currentOrientClass;
- if(c){
- dojo.removeClass(this.domNode, c);
- }
- c = "dijitTooltipAB"+(corner.charAt(1) == 'L'?"Left":"Right")+" dijitTooltip"+(corner.charAt(0) == 'T' ? "Below" : "Above");
- dojo.addClass(this.domNode, c);
- this._currentOrientClass = c;
+ 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){
@@ -10068,11 +10661,6 @@ dojo.declare(
this.orient(this.domNode,pos.aroundCorner, pos.corner);
this._onShow(); // lazy load trigger
-
- if(this.autofocus){
- this._getFocusItems(this.containerNode);
- dijit.focus(this._firstFocusItem);
- }
},
onClose: function(){
@@ -10141,6 +10729,8 @@ dojo.provide("dijit.Dialog");
+// dijit/TooltipDialog required for back-compat. TODO: remove in 2.0
+
/*=====
dijit._underlay = function(kwArgs){
// summary:
@@ -10152,7 +10742,6 @@ dijit._underlay = function(kwArgs){
// or subclass thereof is shown.
};
=====*/
-
dojo.declare(
"dijit._DialogBase",
[dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin, dijit._CssStateMixin],
@@ -10173,7 +10762,7 @@ dojo.declare(
// | dojo.body().appendChild(foo.domNode);
// | foo.startup();
- templateString: dojo.cache("dijit", "templates/Dialog.html", "<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"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=\"onclick: onCancel\" title=\"${buttonCancel}\">\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"),
+ 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",
@@ -10189,7 +10778,7 @@ dojo.declare(
"aria-describedby":""
}),
- // open: Boolean
+ // open: [readonly] Boolean
// True if Dialog is currently displayed on screen.
open: false,
@@ -10209,12 +10798,12 @@ dojo.declare(
// False will disable autofocusing. Default: true
autofocus: true,
- // _firstFocusItem: [private] [readonly] DomNode
+ // _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
+ // _lastFocusItem: [private readonly] DomNode
// The pointer to which node has focus prior to our dialog.
// Set by `dijit._DialogMixin._getFocusItems`.
_lastFocusItem: null,
@@ -10266,14 +10855,14 @@ dojo.declare(
// 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 overriden.
+ // 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){
+ if(this.autofocus && dijit._DialogLevelManager.isTop(this)){
this._getFocusItems(this.domNode);
dijit.focus(this._firstFocusItem);
}
@@ -10304,7 +10893,7 @@ dojo.declare(
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 });
- dojo.subscribe("/dnd/move/stop",this,"_endDrag");
+ this._dndListener = dojo.subscribe("/dnd/move/stop",this,"_endDrag");
}else{
dojo.addClass(node,"dijitDialogFixed");
}
@@ -10313,95 +10902,6 @@ dojo.declare(
dialogId: this.id,
"class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
};
-
- this._fadeIn = dojo.fadeIn({
- node: node,
- duration: this.duration,
- beforeBegin: dojo.hitch(this, function(){
- var underlay = dijit._underlay;
- if(!underlay){
- underlay = dijit._underlay = new dijit.DialogUnderlay(this.underlayAttrs);
- }else{
- underlay.set(this.underlayAttrs);
- }
-
- var ds = dijit._dialogStack,
- zIndex = 948 + ds.length*2;
- if(ds.length == 1){ // first dialog
- underlay.show();
- }
- dojo.style(dijit._underlay.domNode, 'zIndex', zIndex);
- dojo.style(this.domNode, 'zIndex', zIndex + 1);
- }),
- onEnd: dojo.hitch(this, function(){
- if(this.autofocus){
- // 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._fadeOut = dojo.fadeOut({
- node: node,
- duration: this.duration,
- onEnd: dojo.hitch(this, function(){
- node.style.display = "none";
-
- // Restore the previous dialog in the stack, or if this is the only dialog
- // then restore to original page
- var ds = dijit._dialogStack;
- if(ds.length == 0){
- dijit._underlay.hide();
- }else{
- dojo.style(dijit._underlay.domNode, 'zIndex', 948 + ds.length*2);
- dijit._underlay.set(ds[ds.length-1].underlayAttrs);
- }
-
- // Restore focus to wherever it was before this dialog was displayed
- if(this.refocus){
- var focus = this._savedFocus;
-
- // 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.
- if(ds.length > 0){
- var pd = ds[ds.length-1];
- if(!dojo.isDescendant(focus.node, pd.domNode)){
- pd._getFocusItems(pd.domNode);
- focus = pd._firstFocusItem;
- }
- }
-
- dijit.focus(focus);
- }
- })
- });
- },
-
- uninitialize: function(){
- var wasPlaying = false;
- if(this._fadeIn && this._fadeIn.status() == "playing"){
- wasPlaying = true;
- this._fadeIn.stop();
- }
- if(this._fadeOut && this._fadeOut.status() == "playing"){
- wasPlaying = true;
- this._fadeOut.stop();
- }
-
- // 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((this.open || wasPlaying) && !dijit._underlay._destroyed){
- dijit._underlay.hide();
- }
-
- if(this._moveable){
- this._moveable.destroy();
- }
- this.inherited(arguments);
},
_size: function(){
@@ -10427,7 +10927,7 @@ dojo.declare(
});
}
- var mb = dojo.marginBox(this.domNode);
+ 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
@@ -10482,12 +10982,6 @@ dojo.declare(
// tags:
// private
- var ds = dijit._dialogStack;
- if(ds[ds.length-1] != this){
- // console.debug(this.id + ': skipping because', this, 'is not the active dialog');
- return;
- }
-
if(evt.charOrCode){
var dk = dojo.keys;
var node = evt.target;
@@ -10534,16 +11028,23 @@ dojo.declare(
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._fadeOut.status() == "playing"){
- this._fadeOut.stop();
+ if(this._fadeOutDeferred){
+ this._fadeOutDeferred.cancel();
}
this._modalconnects.push(dojo.connect(window, "onscroll", this, "layout"));
@@ -10558,43 +11059,81 @@ dojo.declare(
this._oldViewport = viewport;
}
}));
- this._modalconnects.push(dojo.connect(dojo.doc.documentElement, "onkeypress", this, "_onKey"));
+ this._modalconnects.push(dojo.connect(this.domNode, "onkeypress", this, "_onKey"));
dojo.style(this.domNode, {
opacity:0,
display:""
});
- this.open = true;
+ this._set("open", true);
this._onShow(); // lazy load trigger
this._size();
this._position();
- dijit._dialogStack.push(this);
- this._fadeIn.play();
- this._savedFocus = dijit.getFocus(this);
+ // 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
- // or if we aren't the active dialog, don't allow us to close yet
- var ds = dijit._dialogStack;
- if(!this._alreadyInitialized || this != ds[ds.length-1]){
+ if(!this._alreadyInitialized){
return;
}
-
- if(this._fadeIn.status() == "playing"){
- this._fadeIn.stop();
+ if(this._fadeInDeferred){
+ this._fadeInDeferred.cancel();
}
- // throw away current active dialog from stack -- making the previous dialog or the node on the original page active
- ds.pop();
+ // fade-in Animation object, setup below
+ var fadeOut;
+
+ this._fadeOutDeferred = new dojo.Deferred(dojo.hitch(this, function(){
+ fadeOut.stop();
+ delete this._fadeOutDeferred;
+ }));
- this._fadeOut.play();
+ 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;
@@ -10605,9 +11144,9 @@ dojo.declare(
if(this._relativePosition){
delete this._relativePosition;
}
- this.open = false;
+ this._set("open", false);
- this.onHide();
+ return this._fadeOutDeferred;
},
layout: function(){
@@ -10624,10 +11163,22 @@ dojo.declare(
},
destroy: function(){
- dojo.forEach(this._modalconnects, dojo.disconnect);
- if(this.refocus && this.open){
- setTimeout(dojo.hitch(dijit,"focus",this._savedFocus), 25);
+ 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);
}
}
@@ -10639,11 +11190,129 @@ dojo.declare(
{}
);
-// Stack of currenctly displayed dialogs, layered on top of each other
-dijit._dialogStack = [];
+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.
-// For back-compat. TODO: remove in 2.0
+ 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
+];
}
@@ -10653,7 +11322,6 @@ dojo.provide("dijit._HasDropDown");
-
dojo.declare("dijit._HasDropDown",
null,
{
@@ -10702,8 +11370,9 @@ dojo.declare("dijit._HasDropDown",
forceWidth: false,
// maxHeight: [protected] Integer
- // The max height for our dropdown. Set to 0 for no max height.
- // any dropdown taller than this will have scrollbars
+ // 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[]
@@ -10733,6 +11402,8 @@ dojo.declare("dijit._HasDropDown",
if(this.disabled || this.readOnly){ return; }
+ dojo.stopEvent(e);
+
this._docHandler = this.connect(dojo.doc, "onmouseup", "_onDropDownMouseUp");
this.toggleDropDown();
@@ -10786,7 +11457,7 @@ dojo.declare("dijit._HasDropDown",
}
}
}
- if(this._opened && dropDown.focus){
+ 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);
@@ -10797,27 +11468,14 @@ dojo.declare("dijit._HasDropDown",
// the drop down was already opened on mousedown/keydown; just need to call stopEvent()
if(this._stopClickEvents){
dojo.stopEvent(e);
- }
+ }
},
- _setupDropdown: function(){
- // summary:
- // set up nodes and connect our mouse and keypress events
+ buildRendering: function(){
+ this.inherited(arguments);
+
this._buttonNode = this._buttonNode || this.focusNode || this.domNode;
this._popupStateNode = this._popupStateNode || this.focusNode || this._buttonNode;
- this._aroundNode = this._aroundNode || this.domNode;
- this.connect(this._buttonNode, "onmousedown", "_onDropDownMouseDown");
- this.connect(this._buttonNode, "onclick", "_onDropDownClick");
- this.connect(this._buttonNode, "onkeydown", "_onDropDownKeydown");
- this.connect(this._buttonNode, "onkeyup", "_onKey");
-
- // If we have a _setStateClass function (which happens when
- // we are a form widget), then we need to connect our open/close
- // functions to it
- if(this._setStateClass){
- this.connect(this, "openDropDown", "_setStateClass");
- this.connect(this, "closeDropDown", "_setStateClass");
- }
// 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
@@ -10833,11 +11491,18 @@ dojo.declare("dijit._HasDropDown",
},
postCreate: function(){
- this._setupDropdown();
+ // 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");
},
- destroyDescendants: function(){
+ 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.
@@ -10849,27 +11514,43 @@ dojo.declare("dijit._HasDropDown",
this.inherited(arguments);
},
- _onDropDownKeydown: function(/*Event*/ e){
- if(e.keyCode == dojo.keys.DOWN_ARROW || e.keyCode == dojo.keys.ENTER || e.keyCode == dojo.keys.SPACE){
- e.preventDefault(); // stop IE screen jump
- }
- },
-
_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;
+
+ var d = this.dropDown, target = e.target;
if(d && this._opened && d.handleKey){
- if(d.handleKey(e) === false){ return; }
+ 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.keyCode == dojo.keys.ESCAPE){
- this.toggleDropDown();
- }else if(d && !this._opened &&
- (e.keyCode == dojo.keys.DOWN_ARROW || e.keyCode == dojo.keys.ENTER || e.keyCode == dojo.keys.SPACE)){
+ 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();
- if(d.focus){
+ var d = this.dropDown; // drop down may not exist until toggleDropDown() call
+ if(d && d.focus){
setTimeout(dojo.hitch(d, "focus"), 1);
}
}
@@ -10879,8 +11560,14 @@ dojo.declare("dijit._HasDropDown",
// summary:
// Called magically when focus has shifted away from this widget and it's dropdown
- this.closeDropDown();
- // don't focus on button. the user has explicitly focused on something else.
+ // 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);
},
@@ -10897,7 +11584,8 @@ dojo.declare("dijit._HasDropDown",
loadDropDown: function(/* Function */ loadCallback){
// summary:
// Loads the data for the dropdown, and at some point, calls
- // the given callback
+ // the given callback. This is basically a callback when the
+ // user presses the down arrow button to open the drop down.
// tags:
// protected
@@ -10906,14 +11594,13 @@ dojo.declare("dijit._HasDropDown",
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; }
- this.focus();
- var dropDown = this.dropDown;
- if(!dropDown){ return; }
if(!this._opened){
// If we aren't loaded, load it first so there isn't a flicker
if(!this.isLoaded()){
@@ -10929,14 +11616,17 @@ dojo.declare("dijit._HasDropDown",
openDropDown: function(){
// summary:
- // Opens the dropdown for this widget - it returns the
- // return value of dijit.popup.open
+ // 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;
- var ddNode = dropDown.domNode;
- var self = this;
+ 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.
@@ -10944,8 +11634,7 @@ dojo.declare("dijit._HasDropDown",
// ie, dependent on how much space is available (BK)
if(!this._preparedNode){
- dijit.popup.moveOffScreen(ddNode);
- this._preparedNode = true;
+ 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;
@@ -10969,29 +11658,44 @@ dojo.declare("dijit._HasDropDown",
}
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.marginBox(ddNode);
- var overHeight = (this.maxHeight && mb.h > this.maxHeight);
+ var mb = dojo._getMarginSize(ddNode);
+ var overHeight = (maxHeight && mb.h > maxHeight);
dojo.style(ddNode, {
overflowX: "hidden",
overflowY: overHeight ? "auto" : "hidden"
});
if(overHeight){
- mb.h = this.maxHeight;
+ mb.h = maxHeight;
if("w" in mb){
mb.w += 16; // room for vertical scrollbar
}
}else{
delete mb.h;
}
- delete mb.t;
- delete mb.l;
// Adjust dropdown width to match or be larger than my width
if(this.forceWidth){
- mb.w = this.domNode.offsetWidth;
+ mb.w = aroundNode.offsetWidth;
}else if(this.autoWidth){
- mb.w = Math.max(mb.w, this.domNode.offsetWidth);
+ mb.w = Math.max(mb.w, aroundNode.offsetWidth);
}else{
delete mb.w;
}
@@ -11007,7 +11711,7 @@ dojo.declare("dijit._HasDropDown",
var retVal = dijit.popup.open({
parent: this,
popup: dropDown,
- around: this._aroundNode,
+ around: aroundNode,
orient: dijit.getPopupAroundAlignment((this.dropDownPosition && this.dropDownPosition.length) ? this.dropDownPosition : ["below"],this.isLeftToRight()),
onExecute: function(){
self.closeDropDown(true);
@@ -11019,13 +11723,12 @@ dojo.declare("dijit._HasDropDown",
dojo.attr(self._popupStateNode, "popupActive", false);
dojo.removeClass(self._popupStateNode, "dijitHasDropDownOpen");
self._opened = false;
- self.state = "";
}
});
dojo.attr(this._popupStateNode, "popupActive", "true");
dojo.addClass(self._popupStateNode, "dijitHasDropDownOpen");
this._opened=true;
- this.state="Opened";
+
// TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown
return retVal;
},
@@ -11033,6 +11736,8 @@ dojo.declare("dijit._HasDropDown",
closeDropDown: function(/*Boolean*/ focus){
// summary:
// Closes the drop down on this widget
+ // focus:
+ // If true, refocuses the button widget
// tags:
// protected
@@ -11040,7 +11745,6 @@ dojo.declare("dijit._HasDropDown",
if(focus){ this.focus(); }
dijit.popup.close(this.dropDown);
this._opened = false;
- this.state = "";
}
}
@@ -11099,14 +11803,12 @@ dojo.declare("dijit.form.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\twaiRole=\"button\" waiState=\"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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),
+ 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",
- iconClass: { node: "iconNode", type: "class" }
+ value: "valueNode"
}),
-
_onClick: function(/*Event*/ e){
// summary:
// Internal function to handle click actions
@@ -11136,25 +11838,26 @@ dojo.declare("dijit.form.Button",
}
},
+ 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);
}
},
- postCreate: function(){
- dojo.setSelectable(this.focusNode, false);
- this.inherited(arguments);
- },
-
_setShowLabelAttr: function(val){
if(this.containerNode){
dojo.toggleClass(this.containerNode, "dijitDisplayNone", !val);
}
- this.showLabel = val;
+ this._set("showLabel", val);
},
onClick: function(/*Event*/ e){
@@ -11180,13 +11883,24 @@ dojo.declare("dijit.form.Button",
_setLabelAttr: function(/*String*/ content){
// summary:
- // Hook for attr('label', ...) to work.
+ // Hook for set('label', ...) to work.
// description:
// Set the label (text) of the button; takes an HTML string.
- this.containerNode.innerHTML = this.label = content;
+ 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);
}
});
@@ -11207,7 +11921,7 @@ dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container,
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\twaiRole=\"button\" waiState=\"haspopup-true,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\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),
+ 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().
@@ -11232,12 +11946,14 @@ dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container,
// 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){
+ if(!this.dropDown && this.dropDownContainer){
var dropDownNode = dojo.query("[widgetId]", this.dropDownContainer)[0];
this.dropDown = dijit.byNode(dropDownNode);
delete this.dropDownContainer;
}
- dijit.popup.moveOffScreen(this.dropDown.domNode);
+ if(this.dropDown){
+ dijit.popup.hide(this.dropDown);
+ }
this.inherited(arguments);
},
@@ -11246,7 +11962,7 @@ dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container,
// 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.href || dropDown.isLoaded);
+ return (!!dropDown && (!dropDown.href || dropDown.isLoaded));
},
loadDropDown: function(){
@@ -11288,7 +12004,7 @@ dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
// | dojo.body().appendChild(button1.domNode);
//
- templateString: dojo.cache("dijit.form", "templates/ComboButton.html", "<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tcellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"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\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"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\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"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"),
+ 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: "",
@@ -11336,8 +12052,9 @@ dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
// otherwise on arrow node
// position:
// "start" or "end"
-
- dijit.focus(position == "start" ? this.titleNode : this._popupStateNode);
+ if(!this.disabled){
+ dijit.focus(position == "start" ? this.titleNode : this._popupStateNode);
+ }
}
});
@@ -11363,8 +12080,8 @@ dojo.declare("dijit.form.ToggleButton", dijit.form.Button, {
this.set('checked', !this.checked);
},
- _setCheckedAttr: function(/*Boolean*/ value, /* Boolean? */ priorityChange){
- this.checked = value;
+ _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);
@@ -11372,7 +12089,7 @@ dojo.declare("dijit.form.ToggleButton", dijit.form.Button, {
setChecked: function(/*Boolean*/ checked){
// summary:
- // Deprecated. Use set('checked', true/false) instead.
+ // Deprecated. Use set('checked', true/false) instead.
dojo.deprecated("setChecked("+checked+") is deprecated. Use set('checked',"+checked+") instead.", "", "2.0");
this.set('checked', checked);
},
@@ -11395,6 +12112,8 @@ 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.
@@ -11424,26 +12143,26 @@ dojo.declare(
// 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\" waiRole=\"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"),
+ 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.
+ // 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, attr('value') will return either the string or false depending on
+ // However, get('value') will return either the string or false depending on
// whether or not the checkbox is checked.
//
- // attr('value', string) will check the checkbox and change the value to the
+ // set('value', string) will check the checkbox and change the value to the
// specified string
//
- // attr('value', boolean) will change the checked state.
+ // set('value', boolean) will change the checked state.
value: "on",
// readOnly: Boolean
@@ -11452,22 +12171,22 @@ dojo.declare(
// Similar to disabled except readOnly form values are submitted.
readOnly: false,
- // the attributeMap should inherit from dijit.form._FormWidget.prototype.attributeMap
+ // 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.readOnly = value;
+ this._set("readOnly", value);
dojo.attr(this.focusNode, 'readOnly', value);
dijit.setWaiState(this.focusNode, "readonly", value);
},
- _setValueAttr: function(/*String or Boolean*/ newValue, /*Boolean*/ priorityChange){
+ _setValueAttr: function(/*String|Boolean*/ newValue, /*Boolean*/ priorityChange){
// summary:
// Handler for value= attribute to constructor, and also calls to
- // attr('value', val).
+ // set('value', val).
// description:
// During initialization, just saves as attribute to the <input type=checkbox>.
//
@@ -11477,7 +12196,7 @@ dojo.declare(
// specified as "value" when the CheckBox was constructed (ex: <input
// dojoType="dijit.CheckBox" value="chicken">)
if(typeof newValue == "string"){
- this.value = newValue;
+ this._set("value", newValue);
dojo.attr(this.focusNode, 'value', newValue);
newValue = true;
}
@@ -11487,7 +12206,7 @@ dojo.declare(
},
_getValueAttr: function(){
// summary:
- // Hook so attr('value') works.
+ // Hook so get('value') works.
// description:
// If the CheckBox is checked, returns the value attribute.
// Otherwise returns false.
@@ -11524,7 +12243,7 @@ dojo.declare(
this.set('checked', this.params.checked || false);
// Handle unlikely event that the <input type=checkbox> value attribute has changed
- this.value = this.params.value || "on";
+ this._set("value", this.params.value || "on");
dojo.attr(this.focusNode, 'value', this.value);
},
@@ -11547,6 +12266,7 @@ dojo.declare(
// 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);
@@ -11600,12 +12320,15 @@ 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
@@ -11624,7 +12347,7 @@ dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){
}
return "\\" + ch;
}); // String
-}
+};
dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){
// summary:
@@ -11639,7 +12362,7 @@ dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boole
// A single value or an array of values.
// re:
// A function. Takes one parameter and converts it to a regular
- // expression.
+ // expression.
// nonCapture:
// If true, uses non-capturing match, otherwise matches are retained
// by regular expression. Defaults to false
@@ -11658,16 +12381,16 @@ dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boole
// 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.
+ // by regular expression.
return "(" + (nonCapture ? "?:":"") + expression + ")"; // String
-}
+};
}
@@ -11675,11 +12398,13 @@ if(!dojo._hasResource["dojo.data.util.sorter"]){ //_hasResource checks added by
dojo._hasResource["dojo.data.util.sorter"] = true;
dojo.provide("dojo.data.util.sorter");
-dojo.data.util.sorter.basicComparator = function( /*anything*/ a,
+dojo.getObject("data.util.sorter", true, dojo);
+
+dojo.data.util.sorter.basicComparator = function( /*anything*/ a,
/*anything*/ b){
- // summary:
+ // summary:
// Basic comparision function that compares if an item is greater or less than another item
- // description:
+ // 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.
@@ -11696,18 +12421,18 @@ dojo.data.util.sorter.basicComparator = function( /*anything*/ a,
b = undefined;
}
if(a == b){
- r = 0;
+ r = 0;
}else if(a > b || a == null){
- r = 1;
+ r = 1;
}
return r; //int {-1,0,1}
};
dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortSpec,
/*dojo.data.core.Read*/ store){
- // summary:
+ // summary:
// Helper function to generate the sorting function based off the list of sort attributes.
- // description:
+ // 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.
@@ -11749,7 +12474,7 @@ dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortS
}
comp = map[attr] || bc;
}
- sortFunctions.push(createSortFunction(attr,
+ sortFunctions.push(createSortFunction(attr,
dir, comp, store));
}
}
@@ -11761,7 +12486,7 @@ dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortS
return ret;//int
}
}
- return 0; //int
+ return 0; //int
}; // Function
};
@@ -11772,30 +12497,32 @@ 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()
+ // 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
+ // 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
+ // 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.
+ // 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
+ // 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()
@@ -11862,12 +12589,14 @@ if(!dojo._hasResource["dojo.data.util.filter"]){ //_hasResource checks added by
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:
+ // 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:
+ // For example:
// ca* -> /^ca.*$/
// *ca* -> /^.*ca.*$/
// *c\*a* -> /^.*c\*a.*$/
@@ -11879,7 +12608,7 @@ dojo.data.util.filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/
// * 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
+ // 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:
@@ -11957,20 +12686,20 @@ dojo.declare(
// Converts the first character of each word to uppercase if true.
propercase: false,
- // maxLength: String
+ // maxLength: String
// HTML INPUT tag maxLength declaration.
maxLength: "",
- // selectOnClick: [const] Boolean
+ // selectOnClick: [const] Boolean
// If true, all text will be selected when focused with mouse
selectOnClick: false,
- // placeHolder: String
+ // 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}\" waiRole=\"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"),
+ 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
@@ -11983,14 +12712,14 @@ dojo.declare(
postMixInProperties: function(){
var type = this.type.toLowerCase();
- if(this.templateString.toLowerCase() == "input" || ((type == "hidden" || type == "file") && this.templateString == dijit.form.TextBox.prototype.templateString)){
+ 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.placeHolder = v;
+ this._set("placeHolder", v);
if(!this._phspan){
this._attachPoints.push('_phspan');
/* dijitInputField class gives placeHolder same padding as the input field
@@ -12013,7 +12742,7 @@ dojo.declare(
_getValueAttr: function(){
// summary:
- // Hook so attr('value') works as we like.
+ // Hook so get('value') works as we like.
// description:
// For `dijit.form.TextBox` this basically returns the value of the <input>.
//
@@ -12026,7 +12755,7 @@ dojo.declare(
_setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
// summary:
- // Hook so attr('value', ...) works.
+ // Hook so set('value', ...) works.
//
// description:
// Sets the value of the widget to "value" which can be of
@@ -12057,6 +12786,7 @@ dojo.declare(
}
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();
@@ -12069,7 +12799,7 @@ dojo.declare(
// (ex: Kentucky) and the serialized value (ex: KY) are different,
// this represents the displayed value.
//
- // Setting 'displayedValue' through attr('displayedValue', ...)
+ // Setting 'displayedValue' through set('displayedValue', ...)
// updates 'value', and vice-versa. Otherwise 'value' is updated
// from 'displayedValue' periodically, like onBlur etc.
//
@@ -12080,7 +12810,7 @@ dojo.declare(
getDisplayedValue: function(){
// summary:
- // Deprecated. Use set('displayedValue') instead.
+ // Deprecated. Use get('displayedValue') instead.
// tags:
// deprecated
dojo.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.", "", "2.0");
@@ -12089,7 +12819,7 @@ dojo.declare(
_getDisplayedValueAttr: function(){
// summary:
- // Hook so attr('displayedValue') works.
+ // Hook so get('displayedValue') works.
// description:
// Returns the displayed value (what the user sees on the screen),
// after filtering (ie, trimming spaces etc.).
@@ -12098,21 +12828,24 @@ dojo.declare(
// 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){
+ setDisplayedValue: function(/*String*/ value){
// summary:
- // Deprecated. Use set('displayedValue', ...) instead.
+ // 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){
+ _setDisplayedValueAttr: function(/*String*/ value){
// summary:
- // Hook so attr('displayedValue', ...) works.
+ // 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,
@@ -12120,11 +12853,18 @@ dojo.declare(
if(value === null || value === undefined){ value = '' }
else if(typeof value != "string"){ value = String(value) }
+
this.textbox.value = value;
- this._setValueAttr(this.get('value'), undefined, 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){
+ format: function(/*String*/ value, /*Object*/ constraints){
// summary:
// Replacable function to convert a value to a properly formatted string.
// tags:
@@ -12132,7 +12872,7 @@ dojo.declare(
return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value));
},
- parse: function(/* String */ value, /* Object */ constraints){
+ parse: function(/*String*/ value, /*Object*/ constraints){
// summary:
// Replacable function to convert a formatted string to a value
// tags:
@@ -12166,12 +12906,15 @@ dojo.declare(
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(){
- // 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
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;
@@ -12184,16 +12927,22 @@ dojo.declare(
}
}
}
+ }), 0);
}
- this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values shuld be the same
+
+ // 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", this._onInput);
+ this.connect(this.textbox, "oninput", "_onInput");
}else{
- this.connect(this.textbox, "onkeydown", this._onInput);
- this.connect(this.textbox, "onkeyup", this._onInput);
- this.connect(this.textbox, "onpaste", this._onInput);
- this.connect(this.textbox, "oncut", this._onInput);
+ this.connect(this.textbox, "onkeydown", "_onInput");
+ this.connect(this.textbox, "onkeyup", "_onInput");
+ this.connect(this.textbox, "onpaste", "_onInput");
+ this.connect(this.textbox, "oncut", "_onInput");
}
},
@@ -12205,8 +12954,8 @@ dojo.declare(
// description:
// For MappedTextBox subclasses, this is called twice
// - once with the display value
- // - once the value as set/returned by attr('value', ...)
- // and attr('value'), ex: a Number for NumberTextBox.
+ // - 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()
@@ -12284,8 +13033,11 @@ dojo.declare(
this._updatePlaceHolder();
- this._refreshState();
+ // 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(){
@@ -12297,7 +13049,7 @@ dojo.declare(
}
);
-dijit.selectInputText = function(/*DomNode*/element, /*Number?*/ start, /*Number?*/ stop){
+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).
@@ -12310,14 +13062,12 @@ dijit.selectInputText = function(/*DomNode*/element, /*Number?*/ start, /*Number
dijit.focus(element);
if(_document["selection"] && dojo.body()["createTextRange"]){ // IE
if(element.createTextRange){
- var range = element.createTextRange();
- with(range){
- collapse(true);
- moveStart("character", -99999); // move to 0
- moveStart("character", start); // delta from 0 is the correct position
- moveEnd("character", stop-start);
- select();
- }
+ 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){
@@ -12351,7 +13101,7 @@ dojo.declare(
// 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\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></div>\n</div>\n"),
+ 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);
@@ -12361,7 +13111,6 @@ dojo.declare(
// 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){
@@ -12373,6 +13122,9 @@ dojo.declare(
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;
@@ -12389,12 +13141,17 @@ dojo.declare(
this.aroundNode = aroundNode;
},
- orient: function(/* DomNode */ node, /* String */ aroundCorner, /* String */ tooltipCorner){
+ 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.
+ // 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 " +
{
@@ -12405,6 +13162,52 @@ dojo.declare(
"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(){
@@ -12421,6 +13224,7 @@ dojo.declare(
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()
@@ -12487,69 +13291,70 @@ dojo.declare(
// the tooltip is displayed.
showDelay: 400,
- // connectId: [const] String[]
- // Id's of domNodes to attach the tooltip to.
- // When user hovers over any of the specified dom nodes, the tooltip will appear.
- //
- // Note: Currently connectId can only be specified on initialization, it cannot
- // be changed via attr('connectId', ...)
- //
- // Note: in 2.0 this will be renamed to connectIds for less confusion.
+ // 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: [],
- constructor: function(){
- // Map id's of nodes I'm connected to to a list of the this.connect() handles
- this._nodeConnectionsById = {};
- },
+ _setConnectIdAttr: function(/*String*/ newId){
+ // summary:
+ // Connect to node(s) (specified by id)
- _setConnectIdAttr: function(newIds){
- for(var oldId in this._nodeConnectionsById){
- this.removeTarget(oldId);
- }
- dojo.forEach(dojo.isArrayLike(newIds) ? newIds : [newIds], this.addTarget, this);
- },
+ // Remove connections to old nodes (if there are any)
+ dojo.forEach(this._connections || [], function(nested){
+ dojo.forEach(nested, dojo.hitch(this, "disconnect"));
+ }, this);
- _getConnectIdAttr: function(){
- var ary = [];
- for(var id in this._nodeConnectionsById){
- ary.push(id);
- }
- return ary;
+ // 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*/ id){
+ addTarget: function(/*DOMNODE || String*/ node){
// summary:
- // Attach tooltip to specified node, if it's not already connected
- var node = dojo.byId(id);
- if(!node){ return; }
- if(node.id in this._nodeConnectionsById){ return; }//Already connected
-
- this._nodeConnectionsById[node.id] = [
- this.connect(node, "onmouseenter", "_onTargetMouseEnter"),
- this.connect(node, "onmouseleave", "_onTargetMouseLeave"),
- this.connect(node, "onfocus", "_onTargetFocus"),
- this.connect(node, "onblur", "_onTargetBlur")
- ];
+ // 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
- // map from DOMNode back to plain id string
- var id = node.id || node;
-
- if(id in this._nodeConnectionsById){
- dojo.forEach(this._nodeConnectionsById[id], this.disconnect, this);
- delete this._nodeConnectionsById[id];
+ // 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);
}
},
- postCreate: function(){
+ buildRendering: function(){
+ this.inherited(arguments);
dojo.addClass(this.domNode,"dijitTooltipData");
},
@@ -12716,8 +13521,6 @@ dojo.provide("dijit.form.ValidationTextBox");
-
-
/*=====
dijit.form.ValidationTextBox.__Constraints = function(){
// locale: String
@@ -12738,7 +13541,7 @@ dojo.declare(
// tags:
// protected
- templateString: dojo.cache("dijit.form", "templates/ValidationTextBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\" waiRole=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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: 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
@@ -12747,6 +13550,7 @@ dojo.declare(
// 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.
//
@@ -12765,6 +13569,12 @@ dojo.declare(
// 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: {},
@@ -12774,7 +13584,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.
@@ -12784,7 +13594,7 @@ dojo.declare(
},
// state: [readonly] String
- // Shows current state (ie, validation result) of input (Normal, Warning, or Error)
+ // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error)
state: "",
// tooltipPosition: String[]
@@ -12793,12 +13603,12 @@ dojo.declare(
_setValueAttr: function(){
// summary:
- // Hook so attr('value', ...) works.
+ // Hook so set('value', ...) works.
this.inherited(arguments);
this.validate(this._focused);
},
- validator: function(/*anything*/value, /*dijit.form.ValidationTextBox.__Constraints*/constraints){
+ validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){
// summary:
// Overridable function used to validate the text input against the regular expression.
// tags:
@@ -12827,7 +13637,7 @@ dojo.declare(
_isEmpty: function(value){
// summary:
// Checks for whitespace
- return /^\s*$/.test(value); // Boolean
+ return (this.trim ? /^\s*$/ : /^$/).test(value); // Boolean
},
getErrorMessage: function(/*Boolean*/ isFocused){
@@ -12858,37 +13668,32 @@ dojo.declare(
var isValid = this.disabled || this.isValid(isFocused);
if(isValid){ this._maskValidSubsetError = true; }
var isEmpty = this._isEmpty(this.textbox.value);
- var isValidSubset = !isValid && !isEmpty && isFocused && this._isValidSubset();
- this.state = ((isValid || ((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "" : "Error";
- if(this.state == "Error"){ this._maskValidSubsetError = isFocused; } // we want the error to show up afer a blur and refocus
- this._setStateClass();
+ 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(isFocused){
- if(this.state == "Error"){
- message = this.getErrorMessage(true);
- }else{
- message = this.getPromptMessage(true); // show the prompt whever there's no error
- }
- this._maskValidSubsetError = true; // since we're focused, always mask warnings
+
+ 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.displayMessage(message);
+ this.set("message", message);
+
return isValid;
},
- // _message: String
- // Currently displayed message
- _message: "",
-
displayMessage: function(/*String*/ message){
// summary:
// Overridable method to display validation errors/hints.
// By default uses a tooltip.
// tags:
// extension
- if(this._message == message){ return; }
- this._message = message;
dijit.hideTooltip(this.domNode);
- if(message){
+ if(message && this._focused){
dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
}
},
@@ -12905,11 +13710,11 @@ dojo.declare(
this.constraints = {};
},
- _setConstraintsAttr: function(/* Object */ constraints){
+ _setConstraintsAttr: function(/*Object*/ constraints){
if(!constraints.locale && this.lang){
constraints.locale = this.lang;
}
- this.constraints = constraints;
+ this._set("constraints", constraints);
this._computePartialRE();
},
@@ -12966,11 +13771,16 @@ dojo.declare(
},
_setRequiredAttr: function(/*Boolean*/ value){
- this.required = 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
@@ -12979,7 +13789,10 @@ dojo.declare(
},
_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);
}
}
@@ -13010,9 +13823,9 @@ dojo.declare(
this.nameAttrSetting = "";
},
- serialize: function(/*anything*/val, /*Object?*/options){
+ serialize: function(/*anything*/ val, /*Object?*/ options){
// summary:
- // Overridable function used to convert the attr('value') result to a canonical
+ // 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:
@@ -13044,10 +13857,10 @@ dojo.declare(
// (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 + "'" : "") + ">", this.textbox, "after");
+ this.valueNode = dojo.place("<input type='hidden'" + (this.name ? " name='" + this.name.replace(/'/g, "&quot;") + "'" : "") + "/>", this.textbox, "after");
},
- reset:function(){
+ reset: function(){
// Overrides `dijit.form.ValidationTextBox.reset` to
// reset the hidden textbox value to ''
this.valueNode.value = '';
@@ -13151,7 +13964,7 @@ dojo.declare(
}
},
- _setConstraintsAttr: function(/* Object */ constraints){
+ _setConstraintsAttr: function(/*Object*/ constraints){
this.inherited(arguments);
if(this.focusNode){ // not set when called from postMixInProperties
if(this.constraints.min !== undefined){
@@ -13169,7 +13982,7 @@ dojo.declare(
_setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){
// summary:
- // Hook so attr('value', ...) works.
+ // Hook so set('value', ...) works.
dijit.setWaiState(this.focusNode, "valuenow", value);
this.inherited(arguments);
@@ -13193,10 +14006,9 @@ dojo.provide("dijit.form.ComboBox");
-
dojo.declare(
"dijit.form.ComboBoxMixin",
- null,
+ dijit._HasDropDown,
{
// summary:
// Implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect`
@@ -13215,14 +14027,14 @@ dojo.declare(
// Specifies number of search results per page (before hitting "next" button)
pageSize: Infinity,
- // store: Object
+ // 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} }
+ // | { sort: [{attribute:"name",descending: true}] }
// To override the default queryOptions so that deep=false, do:
// | { queryOptions: {ignoreCase: true, deep: false} }
fetchProperties:{},
@@ -13275,7 +14087,7 @@ dojo.declare(
// 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.
+ // etc. Use it in conjunction with highlightMatch.
// dojo.data query expression pattern.
// `${0}` will be substituted for the user text.
// `*` is used for wildcards.
@@ -13286,21 +14098,32 @@ dojo.declare(
// Set true if the ComboBox/FilteringSelect should ignore case when matching possible items
ignoreCase: true,
- // hasDownArrow: [const] Boolean
+ // 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/ComboBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachPoint=\"comboNode\" waiRole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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=\"&Chi; \" type=\"text\" tabIndex=\"-1\" readOnly waiRole=\"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\tdojoAttachEvent=\"onkeypress:_onKeyPress,compositionend\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t/></div\n></div>\n"),
+ 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: {
- "downArrowNode": "dijitDownArrowButton"
+ "_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;
@@ -13317,7 +14140,7 @@ dojo.declare(
tr.move("character",0);
ntr.move("character",0);
try{
- // If control doesnt have focus, you get an exception.
+ // 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);
@@ -13338,7 +14161,7 @@ dojo.declare(
// Additional code to set disabled state of ComboBox node.
// Overrides _FormValueWidget._setDisabledAttr() or ValidationTextBox._setDisabledAttr().
this.inherited(arguments);
- dijit.setWaiState(this.comboNode, "disabled", value);
+ dijit.setWaiState(this.domNode, "disabled", value);
},
_abortQuery: function(){
@@ -13358,29 +14181,39 @@ dojo.declare(
// 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._onKeyPress({charOrCode: 229}); // fake IME key to cause a search
+ 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);
},
- _onKeyPress: function(/*Event*/ evt){
+ _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 searchFunction = "_startSearchFromInput";
- var pw = this._popupWidget;
+ var pw = this.dropDown;
var dk = dojo.keys;
var highlighted = null;
this._prev_key_backspace = false;
this._abortQuery();
- if(this._isShowingNow){
- pw.handleKey(key);
+
+ // _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){
@@ -13388,10 +14221,9 @@ dojo.declare(
case dk.DOWN_ARROW:
case dk.PAGE_UP:
case dk.UP_ARROW:
- if(!this._isShowingNow){
- doSearch = true;
- searchFunction = "_startSearchAll";
- }else{
+ // 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);
@@ -13418,8 +14250,12 @@ dojo.declare(
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:
@@ -13435,29 +14271,24 @@ dojo.declare(
if(highlighted){
this._selectOption();
}
- if(this._isShowingNow){
+ if(this._opened){
this._lastQuery = null; // in case results come back later
- this._hideResultList();
+ this.closeDropDown();
}
break;
case ' ':
if(highlighted){
+ // user is effectively clicking a choice in the drop down menu
dojo.stopEvent(evt);
this._selectOption();
- this._hideResultList();
+ this.closeDropDown();
}else{
+ // user typed a space into the input box, treat as normal character
doSearch = true;
}
break;
- case dk.ESCAPE:
- if(this._isShowingNow){
- dojo.stopEvent(evt);
- this._hideResultList();
- }
- break;
-
case dk.DELETE:
case dk.BACKSPACE:
this._prev_key_backspace = true;
@@ -13467,15 +14298,14 @@ dojo.declare(
default:
// Non char keys (F1-F12 etc..) shouldn't open list.
// Ascii characters and IME input (Chinese, Japanese etc.) should.
- // On IE and safari, IME input produces keycode == 229, and we simulate
- // it on firefox by attaching to compositionend event (see compositionend method)
+ //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, searchFunction),1);
+ this.searchTimer = setTimeout(dojo.hitch(this, "_startSearchFromInput"),1);
}
},
@@ -13511,6 +14341,12 @@ dojo.declare(
},
_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 ||
@@ -13518,13 +14354,13 @@ dojo.declare(
){
return;
}
- this._popupWidget.clearResultList();
- if(!results.length && !this._maxOptions){ // this condition needs to match !this._isvalid set in FilteringSelect::_openResultList
- this._hideResultList();
+ 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
@@ -13532,7 +14368,7 @@ dojo.declare(
// highlighted.
dataObject._maxOptions = this._maxOptions;
- var nodes = this._popupWidget.createOptions(
+ var nodes = this.dropDown.createOptions(
results,
dataObject,
dojo.hitch(this, "_getMenuLabelFromItem")
@@ -13546,12 +14382,14 @@ dojo.declare(
// shouting the next choice
if(dataObject.direction){
if(1 == dataObject.direction){
- this._popupWidget.highlightFirstOption();
+ this.dropDown.highlightFirstOption();
}else if(-1 == dataObject.direction){
- this._popupWidget.highlightLastOption();
+ this.dropDown.highlightLastOption();
}
- this._announceOption(this._popupWidget.getHighlightedOption());
- }else if(this.autoComplete && !this._prev_key_backspace /*&& !dataObject.direction*/
+ 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
@@ -13562,62 +14400,42 @@ dojo.declare(
},
_showResultList: function(){
- this._hideResultList();
+ // 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("");
- // Position the list and if it's too big to fit on the screen then
- // size it to the maximum possible height
- // Our dear friend IE doesnt take max-height so we need to
- // calculate that on our own every time
-
- // TODO: want to redo this, see
- // http://trac.dojotoolkit.org/ticket/3272
- // and
- // http://trac.dojotoolkit.org/ticket/4108
-
-
- // natural size of the list has changed, so erase old
- // width/height settings, which were hardcoded in a previous
- // call to this function (via dojo.marginBox() call)
- dojo.style(this._popupWidget.domNode, {width: "", height: ""});
-
- var best = this.open();
- // #3212:
- // only set auto scroll bars if necessary prevents issues with
- // scroll bars appearing when they shouldn't when node is made
- // wider (fractional pixels cause this)
- var popupbox = dojo.marginBox(this._popupWidget.domNode);
- this._popupWidget.domNode.style.overflow =
- ((best.h == popupbox.h) && (best.w == popupbox.w)) ? "hidden" : "auto";
- // #4134:
- // borrow TextArea scrollbar test so content isn't covered by
- // scrollbar and horizontal scrollbar doesn't appear
- var newwidth = best.w;
- if(best.h < this._popupWidget.domNode.scrollHeight){
- newwidth += 16;
- }
- dojo.marginBox(this._popupWidget.domNode, {
- h: best.h,
- w: Math.max(newwidth, this.domNode.offsetWidth)
- });
+ 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.
- // If we increased the width of drop down to match the width of ComboBox.domNode,
- // then need to reposition the drop down (wrapper) so (all of) the drop down still
- // appears underneath the ComboBox.domNode
- if(newwidth < this.domNode.offsetWidth){
- this._popupWidget.domNode.parentNode.style.left = dojo.position(this.domNode, true).x + "px";
- }
+ this._startSearchAll();
+ },
- dijit.setWaiState(this.comboNode, "expanded", "true");
+ isLoaded: function(){
+ // signal to _HasDropDown that it needs to call loadDropDown() to load the
+ // drop down asynchronously before displaying it
+ return false;
},
- _hideResultList: function(){
+ 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._isShowingNow){
- dijit.popup.close(this._popupWidget);
- this._isShowingNow=false;
- dijit.setWaiState(this.comboNode, "expanded", "false");
+ if(this._opened){
+ this.inherited(arguments);
+ dijit.setWaiState(this.domNode, "expanded", "false");
dijit.removeWaiState(this.focusNode,"activedescendant");
}
},
@@ -13629,7 +14447,7 @@ dojo.declare(
// if value is now more choices or previous choices, revert
// the value
var newvalue = this.get('displayedValue');
- var pw = this._popupWidget;
+ var pw = this.dropDown;
if(pw && (
newvalue == pw._messages["previousMessage"] ||
newvalue == pw._messages["nextMessage"]
@@ -13651,23 +14469,25 @@ dojo.declare(
_onBlur: function(){
// summary:
// Called magically when focus has shifted away from this widget and it's drop down
- this._hideResultList();
+ 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.
+ // 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
- // attr('item', value)
+ // Users shouldn't call this function; they should be calling
+ // set('item', value)
// tags:
- // private
- if(!displayedValue){ displayedValue = this.labelFunc(item, this.store); }
- this.value = this._getValueField() != this.searchAttr? this.store.getIdentity(item) : displayedValue;
- this.item = item;
- dijit.form.ComboBox.superclass._setValueAttr.call(this, this.value, priorityChange, displayedValue);
+ // 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){
@@ -13681,13 +14501,13 @@ dojo.declare(
}
// pull the text value from the item attached to the DOM node
var newValue;
- if(node == this._popupWidget.nextButton ||
- node == this._popupWidget.previousButton){
+ if(node == this.dropDown.nextButton ||
+ node == this.dropDown.previousButton){
newValue = node.innerHTML;
this.item = undefined;
this.value = '';
}else{
- newValue = this.labelFunc(node.item, this.store);
+ 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)
@@ -13704,28 +14524,11 @@ dojo.declare(
if(evt){
this._announceOption(evt.target);
}
- this._hideResultList();
+ 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
},
- _onArrowMouseDown: function(evt){
- // summary:
- // Callback when arrow is clicked
- if(this.disabled || this.readOnly){
- return;
- }
- dojo.stopEvent(evt);
- this.focus();
- if(this._isShowingNow){
- this._hideResultList();
- }else{
- // forces full population of results, if they click
- // on the arrow it means they want to see more options
- this._startSearchAll();
- }
- },
-
_startSearchAll: function(){
this._startSearch('');
},
@@ -13739,9 +14542,13 @@ dojo.declare(
},
_startSearch: function(/*String*/ key){
- if(!this._popupWidget){
- var popupId = this.id + "_popup";
- this._popupWidget = new dijit.form._ComboBoxMenu({
+ // 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
@@ -13770,7 +14577,7 @@ dojo.declare(
onError: function(errText){
_this._fetchHandle = null;
console.error('dijit.form.ComboBox: ' + errText);
- dojo.hitch(_this, "_hideResultList")();
+ _this.closeDropDown();
},
start: 0,
count: this.pageSize
@@ -13785,8 +14592,9 @@ dojo.declare(
// reader knows which menu option to shout
dataObject.direction = direction;
this._fetchHandle = this.store.fetch(dataObject);
+ this.focus();
};
- this._nextSearch = this._popupWidget.onPage = dojo.hitch(this, nextSearch, this._fetchHandle);
+ this._nextSearch = this.dropDown.onPage = dojo.hitch(this, nextSearch, this._fetchHandle);
}, query, this), this.searchDelay);
},
@@ -13795,29 +14603,12 @@ dojo.declare(
},
_getValueField: function(){
- // summmary:
+ // 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;
},
- /////////////// Event handlers /////////////////////
-
- // FIXME: For 2.0, rename to "_compositionEnd"
- compositionend: function(/*Event*/ evt){
- // summary:
- // When inputting characters using an input method, such as
- // Asian languages, it will generate this event instead of
- // onKeyDown event.
- // Note: this event is only triggered in FF (not in IE/safari)
- // tags:
- // private
-
- // 229 is the code produced by IE and safari while pressing keys during
- // IME input mode
- this._onKeyPress({charOrCode: 229});
- },
-
//////////// INITIALIZATION METHODS ///////////////////////////////////////
constructor: function(){
@@ -13841,13 +14632,14 @@ dojo.declare(
// 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.store.fetchSelectedItem();
+ var item = (this.item = this.store.fetchSelectedItem());
if(item){
var valueField = this._getValueField();
- this.value = valueField != this.searchAttr? this.store.getValue(item, valueField) : this.labelFunc(item, this.store);
+ this.value = this.store.getValue(item, valueField);
}
}
}
+
this.inherited(arguments);
},
@@ -13857,32 +14649,24 @@ dojo.declare(
// tags:
// protected
- if(!this.hasDownArrow){
- this.downArrowNode.style.display = "none";
- }
-
// 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");
- var cn=this.comboNode;
- dijit.setWaiState(cn, "labelledby", label[0].id);
+ dijit.setWaiState(this.domNode, "labelledby", label[0].id);
}
this.inherited(arguments);
},
- uninitialize: function(){
- if(this._popupWidget && !this._popupWidget._destroyed){
- this._hideResultList();
- this._popupWidget.destroy();
- }
- this.inherited(arguments);
+ _setHasDownArrowAttr: function(val){
+ this.hasDownArrow = val;
+ this._buttonNode.style.display = val ? "" : "none";
},
_getMenuLabelFromItem: function(/*Item*/ item){
- var label = this.labelAttr? this.store.getValue(item, this.labelAttr) : this.labelFunc(item, this.store);
- var labelType = this.labelType;
+ 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));
@@ -13891,24 +14675,27 @@ dojo.declare(
return {html: labelType == "html", label: label};
},
- doHighlight: function(/*String*/label, /*String*/find){
+ doHighlight: function(/*String*/ label, /*String*/ find){
// summary:
// Highlights the string entered by the user in the menu. By default this
- // highlights the first occurence found. Override this method
- // to implement your custom highlighing.
+ // highlights the first occurrence found. Override this method
+ // to implement your custom highlighting.
// tags:
// protected
- // Add greedy when this.highlightMatch == "all"
- var modifiers = "i"+(this.highlightMatch == "all"?"g":"");
- var escapedLabel = this._escapeHtml(label);
+ 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
- var ret = escapedLabel.replace(new RegExp("(^|\\s)("+ find +")", modifiers),
- '$1<span class="dijitComboBoxHighlightMatch">$2</span>');
- return ret;// returns String, (almost) valid HTML (entities encoded)
+ 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){
+ _escapeHtml: function(/*String*/ str){
// TODO Should become dojo.html.entities(), when exists use instead
// summary:
// Adds escape sequences for special characters in XML: &<>"'
@@ -13917,19 +14704,6 @@ dojo.declare(
return str; // string
},
- open: function(){
- // summary:
- // Opens the drop down menu. TODO: rename to _open.
- // tags:
- // private
- this._isShowingNow=true;
- return dijit.popup.open({
- popup: this._popupWidget,
- around: this.domNode,
- parent: this
- });
- },
-
reset: function(){
// Overrides the _FormWidget.reset().
// Additionally reset the .item (to clean up).
@@ -13939,15 +14713,15 @@ dojo.declare(
labelFunc: function(/*item*/ item, /*dojo.data.store*/ store){
// summary:
- // Computes the label to display based on the dojo.data store item.
+ // Computes the label to display based on the dojo.data store item.
// returns:
- // The label that the ComboBox should display
+ // The label that the ComboBox should display
// tags:
- // private
+ // private
// Use toString() because XMLStore returns an XMLItem whereas this
// method is expected to return a String (#9354)
- return store.getValue(item, this.searchAttr).toString(); // String
+ return store.getValue(item, this.labelAttr || this.searchAttr).toString(); // String
}
}
);
@@ -13961,9 +14735,9 @@ dojo.declare(
// tags:
// private
- templateString: "<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"
- +"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"
- +"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRole='option'></li>"
+ 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
@@ -13973,8 +14747,16 @@ dojo.declare(
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){
@@ -13997,13 +14779,6 @@ dojo.declare(
// callback
},
- postCreate: function(){
- // fill in template with i18n messages
- this.previousButton.innerHTML = this._messages["previousMessage"];
- this.nextButton.innerHTML = this._messages["nextMessage"];
- this.inherited(arguments);
- },
-
onClose: function(){
// summary:
// Callback from dijit.popup code to this widget, notifying it that it closed
@@ -14017,9 +14792,11 @@ dojo.declare(
// 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);
- var menuitem = dojo.doc.createElement("li");
- dijit.setWaiRole(menuitem, "option");
if(labelObject.html){
menuitem.innerHTML = labelObject.label;
}else{
@@ -14056,8 +14833,6 @@ dojo.declare(
// iterate over cache nondestructively
dojo.forEach(results, function(item, i){
var menuitem = this._createOption(item, labelFunc);
- menuitem.className = "dijitReset dijitMenuItem" +
- (this.isLeftToRight() ? "" : " dijitMenuItemRtl");
dojo.attr(menuitem, "id", this.id + i);
this.domNode.insertBefore(menuitem, this.nextButton);
}, this);
@@ -14090,6 +14865,7 @@ dojo.declare(
while(this.domNode.childNodes.length>2){
this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
}
+ this._blurOptionNode();
},
_onMouseDown: function(/*Event*/ evt){
@@ -14098,10 +14874,14 @@ dojo.declare(
_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;
@@ -14268,20 +15048,25 @@ dojo.declare(
return (ho && ho.parentNode) ? ho : null;
},
- handleKey: function(key){
- switch(key){
+ 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();
- break;
+ return false;
case dojo.keys.PAGE_DOWN:
this.pageDown();
- break;
+ return false;
case dojo.keys.UP_ARROW:
this._highlightPrevOption();
- break;
+ return false;
case dojo.keys.PAGE_UP:
this.pageUp();
- break;
+ return false;
+ default:
+ return true;
}
}
}
@@ -14309,10 +15094,10 @@ dojo.declare(
_setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){
// summary:
- // Hook so attr('value', value) works.
+ // Hook so set('value', value) works.
// description:
// Sets the value of the select.
- this.item = null; // value not looked up in store
+ 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);
}
@@ -14356,13 +15141,13 @@ dojo.declare("dijit.form._ComboBoxDataStore", null, {
},
- getValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
- /* value? */ defaultValue){
+ getValue: function( /*item*/ item,
+ /*attribute-name-string*/ attribute,
+ /*value?*/ defaultValue){
return (attribute == "value") ? item.value : (item.innerText || item.textContent || '');
},
- isItemLoaded: function(/* anything */ something){
+ isItemLoaded: function(/*anything*/ something){
return true;
},
@@ -14370,9 +15155,9 @@ dojo.declare("dijit.form._ComboBoxDataStore", null, {
return {"dojo.data.api.Read": true, "dojo.data.api.Identity": true};
},
- _fetchItems: function( /* Object */ args,
- /* Function */ findCallback,
- /* Function */ errorCallback){
+ _fetchItems: function( /*Object*/ args,
+ /*Function*/ findCallback,
+ /*Function*/ errorCallback){
// summary:
// See dojo.data.util.simpleFetch.fetch()
if(!args.query){ args.query = {}; }
@@ -14388,19 +15173,19 @@ dojo.declare("dijit.form._ComboBoxDataStore", null, {
findCallback(items, args);
},
- close: function(/*dojo.data.api.Request || args || null */ request){
+ close: function(/*dojo.data.api.Request || args || null*/ request){
return;
},
- getLabel: function(/* item */ item){
+ getLabel: function(/*item*/ item){
return item.innerHTML;
},
- getIdentity: function(/* item */ item){
+ getIdentity: function(/*item*/ item){
return dojo.attr(item, "value");
},
- fetchItemByIdentity: function(/* Object */ args){
+ fetchItemByIdentity: function(/*Object*/ args){
// summary:
// Given the identity of an item, this method returns the item that has
// that identity through the onItem callback.
@@ -14468,17 +15253,19 @@ dojo.declare(
// - List can be specified either as a static list or via a javascript
// function (that can get the list from a server)
- _isvalid: true,
-
// 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._isvalid || (!this.required && this.get('displayedValue') == ""); // #5974
+ return this.item || (!this.required && this.get('displayedValue') == ""); // #5974
},
_refreshState: function(){
@@ -14487,12 +15274,12 @@ dojo.declare(
}
},
- _callbackSetLabel: function( /*Array*/ result,
+ _callbackSetLabel: function(
+ /*Array*/ result,
/*Object*/ dataObject,
/*Boolean?*/ priorityChange){
// summary:
- // Callback function that dynamically sets the label of the
- // ComboBox
+ // Callback from dojo.data after lookup of user entered value finishes
// setValue does a synchronous lookup,
// so it calls _callbackSetLabel directly,
@@ -14502,35 +15289,38 @@ dojo.declare(
return;
}
if(!result.length){
- //#3268: do nothing on bad input
+ //#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._isvalid = false;
+ this._set("item", null);
this.validate(this._focused);
- this.item = null;
}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
- this._isvalid = results.length != 0 || this._maxOptions != 0; // result.length==0 && maxOptions != 0 implies the nextChoices item selected but then the datastore returned 0 more entries
+ // 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);
}
- dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments);
},
_getValueAttr: function(){
// summary:
- // Hook for attr('value') to work.
+ // 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
@@ -14544,7 +15334,7 @@ dojo.declare(
_setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){
// summary:
- // Hook so attr('value', value) works.
+ // Hook so set('value', value) works.
// description:
// Sets the value of the select.
// Also sets the label to the corresponding value by reverse lookup.
@@ -14572,10 +15362,9 @@ dojo.declare(
// that gets submitted, based on a dojo.data store item.
// description:
// Users shouldn't call this function; they should be calling
- // attr('item', value)
+ // set('item', value)
// tags:
// private
- this._isvalid = true;
this.inherited(arguments);
this.valueNode.value = this.value;
this._lastDisplayedValue = this.textbox.value;
@@ -14587,30 +15376,38 @@ dojo.declare(
_setDisplayedValueAttr: function(/*String*/ label, /*Boolean?*/ priorityChange){
// summary:
- // Hook so attr('displayedValue', label) works.
+ // Hook so set('displayedValue', label) works.
// description:
// Sets textbox to display label. Also performs reverse lookup
- // to set the hidden value.
+ // to set the hidden value. label should corresponding to item.searchAttr.
- // When this is called during initialization it'll ping the datastore
- // for reverse lookup, and when that completes (after an XHR request)
- // will call setValueAttr()... but that shouldn't trigger an onChange()
- // event, even when it happens after creation has finished
+ 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._hideResultList();
+ 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
+ // 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,
@@ -14633,11 +15430,6 @@ dojo.declare(
}
},
- postMixInProperties: function(){
- this.inherited(arguments);
- this._isvalid = !this.required;
- },
-
undo: function(){
this.set('displayedValue', this._lastDisplayedValue);
}
@@ -14654,9 +15446,10 @@ dojo.provide("dijit.form.Form");
+
dojo.declare(
"dijit.form.Form",
- [dijit._Widget, dijit._Templated, dijit.form._FormMixin],
+ [dijit._Widget, dijit._Templated, dijit.form._FormMixin, dijit.layout._ContentPaneResizeMixin],
{
// summary:
// Widget corresponding to HTML form tag, for validation and serialization
@@ -14740,7 +15533,7 @@ dojo.declare(
postCreate: function(){
// IE tries to hide encType
- // TODO: this code should be in parser, not here.
+ // 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")){
@@ -14761,8 +15554,8 @@ dojo.declare(
preventDefault: function(){ // not IE
this.returnValue = false;
},
- stopPropagation: function(){},
- currentTarget: e ? e.target : this.domNode,
+ 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
@@ -14801,7 +15594,7 @@ dojo.declare(
}
},
- onSubmit: function(/*Event?*/e){
+ onSubmit: function(/*Event?*/ e){
// summary:
// Callback when user submits the form.
// description:
@@ -14833,6 +15626,7 @@ dojo._hasResource["dijit.form.RadioButton"] = true;
dojo.provide("dijit.form.RadioButton");
+
// TODO: for 2.0, move the RadioButton code into this file
}
@@ -14851,7 +15645,7 @@ dijit.form.__SelectOption = function(){
// place a separator at that location
// label: String
// The label for our option. It can contain html tags.
- // selected: Boolean
+ // selected: Boolean
// Whether or not we are a selected option
// disabled: Boolean
// Whether or not this specific option is disabled
@@ -14869,13 +15663,13 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// This also provides the mechanism for reading the elements from
// a store, if desired.
- // multiple: Boolean
+ // 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.
+ // the html <option> tag.
options: null,
// store: dojo.data.api.Identity
@@ -14897,20 +15691,20 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// iterated over (i.e. to filter even futher what you want to add)
onFetch: null,
- // sortByLabel: boolean
+ // sortByLabel: Boolean
// Flag to sort the options returned from a store by the label of
// the store.
sortByLabel: true,
- // loadChildrenOnOpen: boolean
+ // 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 opens the click the button.
- // dropdown
+ // of the options/menuitems) until the user clicks the button to open the
+ // dropdown.
loadChildrenOnOpen: false,
- getOptions: function(/* anything */ valueOrIdx){
+ getOptions: function(/*anything*/ valueOrIdx){
// summary:
// Returns a given option (or options).
// valueOrIdx:
@@ -14976,7 +15770,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
return null; // null
},
- addOption: function(/* dijit.form.__SelectOption, dijit.form.__SelectOption[] */ option){
+ 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.
@@ -14991,7 +15785,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
this._loadChildren();
},
- removeOption: function(/* string, dijit.form.__SelectOption, number, or array */ valueOrIdx){
+ 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
@@ -15006,7 +15800,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// 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);
+ return (node.value !== i.value || node.label !== i.label);
});
this._removeOptionItem(i);
}
@@ -15014,7 +15808,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
this._loadChildren();
},
- updateOption: function(/* dijit.form.__SelectOption, dijit.form.__SelectOption[] */ newOption){
+ 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
@@ -15030,9 +15824,9 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
this._loadChildren();
},
- setStore: function(/* dojo.data.api.Identity */ store,
- /* anything? */ selectedValue,
- /* Object? */ fetchArgs){
+ 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
@@ -15059,7 +15853,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
dojo.connect(store, "onSet", this, "_onSetItem")
];
}
- this.store = store;
+ this._set("store", store);
}
// Turn off change notifications while we make all these changes
@@ -15072,48 +15866,52 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// Add our new options
if(store){
- var cb = function(items){
- 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(items);
- }
- // 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);
- };
- var opts = dojo.mixin({onComplete:cb, scope: this}, fetchArgs);
this._loadingStore = true;
- store.fetch(opts);
+ 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
},
- _setValueAttr: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+ // 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.
@@ -15149,7 +15947,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
var val = dojo.map(newValue, function(i){ return i.value; }),
disp = dojo.map(newValue, function(i){ return i.label; });
- this.value = this.multiple ? val : val[0];
+ this._set("value", this.multiple ? val : val[0]);
this._setDisplay(this.multiple ? disp : disp[0]);
this._updateSelection();
this._handleOnChange(this.value, priorityChange);
@@ -15173,23 +15971,10 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
return this.multiple ? ret : ret[0];
},
- _getValueDeprecated: false, // remove when _FormWidget:getValue is removed
- getValue: function(){
- // summary:
- // get the value of the widget.
- return this._lastValue;
- },
-
- undo: function(){
- // summary:
- // restore the value to the last value passed to onChange
- this._setValueAttr(this._lastValueReported, false);
- },
-
_loadChildren: function(){
// summary:
// Loads the children represented by this widget's options.
- // reset the menu to make it "populatable on the next click
+ // reset the menu to make it populatable on the next click
if(this._loadingStore){ return; }
dojo.forEach(this._getChildren(), function(child){
child.destroyRecursive();
@@ -15204,7 +15989,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
_updateSelection: function(){
// summary:
// Sets the "selected" class on the item for styling purposes
- this.value = this._getValueFromOpts();
+ this._set("value", this._getValueFromOpts());
var val = this.value;
if(!dojo.isArray(val)){
val = [val];
@@ -15218,7 +16003,6 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
dijit.setWaiState(child.domNode, "selected", isSelected);
}, this);
}
- this._handleOnChange(this.value);
},
_getValueFromOpts: function(){
@@ -15249,17 +16033,17 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
},
// Internal functions to call when we have store notifications come in
- _onNewItem: function(/* item */ item, /* Object? */ parentInfo){
+ _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){
+ _onDeleteItem: function(/*item*/ item){
var store = this.store;
this.removeOption(store.getIdentity(item));
},
- _onSetItem: function(/* item */ item){
+ _onSetItem: function(/*item*/ item){
this.updateOption(this._getOptionObjForItem(item));
},
@@ -15274,7 +16058,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
return {value: value, label: label, item:item}; // dijit.form.__SelectOption
},
- _addOptionForItem: function(/* item */ item){
+ _addOptionForItem: function(/*item*/ item){
// summary:
// Creates (and adds) the option for the given item
var store = this.store;
@@ -15290,13 +16074,18 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
this.addOption(newOpt);
},
- constructor: function(/* Object */ keywordArgs){
+ 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
@@ -15309,16 +16098,21 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
if(node.getAttribute("type") === "separator"){
return { value: "", label: "", selected: false, disabled: false };
}
- return { value: node.getAttribute("value"),
+ 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 };
+ disabled: node.getAttribute("disabled") || false
+ };
}, this) : [];
}
if(!this.value){
- this.value = this._getValueFromOpts();
+ this._set("value", this._getValueFromOpts());
}else if(this.multiple && typeof this.value == "string"){
- this.value = this.value.split(",");
+ this_set("value", this.value.split(","));
}
},
@@ -15326,7 +16120,6 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// summary:
// sets up our event handling that we need for functioning
// as a select
- dojo.setSelectable(this.focusNode, false);
this.inherited(arguments);
// Make our event connections for updating state
@@ -15362,7 +16155,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
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
@@ -15370,7 +16163,7 @@ 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.
@@ -15396,7 +16189,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.
@@ -15419,6 +16212,7 @@ dojo._hasResource["dijit._KeyNavContainer"] = true;
dojo.provide("dijit._KeyNavContainer");
+
dojo.declare("dijit._KeyNavContainer",
dijit._Container,
{
@@ -15460,6 +16254,8 @@ dojo.declare("dijit._KeyNavContainer",
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");
},
@@ -15496,6 +16292,17 @@ dojo.declare("dijit._KeyNavContainer",
}
},
+ 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
@@ -15529,15 +16336,16 @@ dojo.declare("dijit._KeyNavContainer",
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.focusedChild = widget;
+ 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
+ // Sets tabIndex=-1 on each child, so that the tab key will
// leave the container rather than visiting each child.
// tags:
// private
@@ -15618,6 +16426,12 @@ dojo.declare("dijit._KeyNavContainer",
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
@@ -15665,7 +16479,7 @@ dojo.declare("dijit.MenuItem",
// 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\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"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"),
+ 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" },
@@ -15702,9 +16516,8 @@ dojo.declare("dijit.MenuItem",
}
},
- postCreate: function(){
+ buildRendering: function(){
this.inherited(arguments);
- dojo.setSelectable(this.domNode, false);
var label = this.id+"_text";
dojo.attr(this.containerNode, "id", label);
if(this.accelKeyNode){
@@ -15712,6 +16525,7 @@ dojo.declare("dijit.MenuItem",
label += " " + this.id + "_accel";
}
dijit.setWaiState(this.domNode, "labelledby", label);
+ dojo.setSelectable(this.domNode, false);
},
_onHover: function(){
@@ -15734,11 +16548,10 @@ dojo.declare("dijit.MenuItem",
// then unselect it
this.getParent().onItemUnhover(this);
- // _onUnhover() is called when the menu is hidden (collapsed), due to clicking
- // a MenuItem and having it execut. When that happens, FF and IE don't generate
- // an onmouseout event for the MenuItem, so give _CssStateMixin some help
- this._hovering = false;
- this._setStateClass();
+ // 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){
@@ -15823,19 +16636,21 @@ dojo.declare("dijit.MenuItem",
// summary:
// Hook for attr('disabled', ...) to work.
// Enable or disable this menu item.
- this.disabled = value;
+
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.accelKey=value;
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);
}
});
@@ -15907,7 +16722,6 @@ dojo.declare("dijit.PopupMenuItem",
}
});
-
}
if(!dojo._hasResource["dijit.CheckedMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -15922,7 +16736,7 @@ dojo.declare("dijit.CheckedMenuItem",
// summary:
// A checkbox-like menu item for toggling on and off
- templateString: dojo.cache("dijit", "templates/CheckedMenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" waiRole=\"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\" waiRole=\"presentation\">&nbsp;</td>\n</tr>\n"),
+ 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
@@ -15933,7 +16747,7 @@ dojo.declare("dijit.CheckedMenuItem",
// Sets the class and state for the check box.
dojo.toggleClass(this.domNode, "dijitCheckedMenuItemChecked", checked);
dijit.setWaiState(this.domNode, "checked", checked);
- this.checked = checked;
+ this._set("checked", checked);
},
onChange: function(/*Boolean*/ checked){
@@ -15974,7 +16788,8 @@ dojo.declare("dijit.MenuSeparator",
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"),
- postCreate: function(){
+ buildRendering: function(){
+ this.inherited(arguments);
dojo.setSelectable(this.domNode, false);
},
@@ -15988,7 +16803,6 @@ dojo.declare("dijit.MenuSeparator",
}
});
-
}
if(!dojo._hasResource["dijit.Menu"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -16001,6 +16815,11 @@ 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],
{
@@ -16277,8 +17096,7 @@ dojo.declare("dijit._MenuBase",
// menus (similar to TAB navigation) but the menu is not active
// (ie no dropdown) until an item is clicked.
this.isActive = true;
- dojo.addClass(this.domNode, "dijitMenuActive");
- dojo.removeClass(this.domNode, "dijitMenuPassive");
+ dojo.replaceClass(this.domNode, "dijitMenuActive", "dijitMenuPassive");
},
onOpen: function(/*Event*/ e){
@@ -16297,8 +17115,7 @@ dojo.declare("dijit._MenuBase",
// 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.removeClass(this.domNode, "dijitMenuActive");
- dojo.addClass(this.domNode, "dijitMenuPassive");
+ dojo.replaceClass(this.domNode, "dijitMenuPassive", "dijitMenuActive");
},
onClose: function(){
@@ -16321,16 +17138,25 @@ dojo.declare("dijit._MenuBase",
// tags:
// private
this._stopPopupTimer();
- if(this.focusedChild){ // unhighlight the focused item
- this.focusedChild._setSelected(false);
- this.focusedChild._onUnhover();
- this.focusedChild = null;
- }
+
+ 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){
@@ -16381,7 +17207,7 @@ dojo.declare("dijit.Menu",
this._bindings = [];
},
- templateString: dojo.cache("dijit", "templates/Menu.html", "<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\" cellspacing=0>\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n"),
+ 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",
@@ -16408,7 +17234,7 @@ dojo.declare("dijit.Menu",
this.bindDomNode(dojo.body());
}else{
// TODO: should have _setTargetNodeIds() method to handle initialization and a possible
- // later attr('targetNodeIds', ...) call. There's also a problem that targetNodeIds[]
+ // 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);
}
@@ -16521,7 +17347,7 @@ dojo.declare("dijit.Menu",
this._scheduleOpen(evt.target, iframe); // no coords - open near target node
}
})
- ];
+ ];
});
binding.connects = cn ? doConnects(cn) : [];
@@ -16687,13 +17513,6 @@ dojo.declare("dijit.Menu",
}
);
-// Back-compat (TODO: remove in 2.0)
-
-
-
-
-
-
}
if(!dojo._hasResource["dijit.form.Select"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -16706,7 +17525,6 @@ dojo.provide("dijit.form.Select");
-
dojo.declare("dijit.form._SelectMenu", dijit.Menu, {
// summary:
// An internally-used menu for dropdown that allows us a vertical scrollbar
@@ -16727,6 +17545,16 @@ dojo.declare("dijit.form._SelectMenu", dijit.Menu, {
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
@@ -16755,7 +17583,7 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
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\twaiRole=\"combobox\" waiState=\"haspopup-true\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" waiRole=\"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}\" waiState=\"hidden-true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"titleNode\" waiRole=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t\t></td\n\t></tr></tbody\n></table>\n"),
+ 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
@@ -16769,13 +17597,17 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// 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: "",
+ emptyLabel: "&nbsp;",
// _isLoaded: Boolean
// Whether or not we have been loaded
@@ -16789,11 +17621,11 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// 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;
- this.value = this.options[si != -1 ? si : 0].value;
+ 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");
@@ -16803,7 +17635,7 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// 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){
+ if(!option.value && !option.label){
// We are a separator (no label set for it)
return new dijit.MenuSeparator();
}else{
@@ -16811,7 +17643,7 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
var click = dojo.hitch(this, "_setValueAttr", option);
var item = new dijit.MenuItem({
option: option,
- label: option.label,
+ label: option.label || this.emptyLabel,
onClick: click,
disabled: option.disabled || false
});
@@ -16865,7 +17697,6 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
this._updateSelection();
}
- var len = this.options.length;
this._isLoaded = false;
this._childrenLoaded = true;
@@ -16883,10 +17714,9 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
_setDisplay: function(/*String*/ newDisplay){
// summary:
// sets the display for the given value (or values)
- this.containerNode.innerHTML = '<span class="dijitReset dijitInline ' + this.baseClass + 'Label">' +
- (newDisplay || this.emptyLabel || "&nbsp;") +
- '</span>';
- dijit.setWaiState(this.focusNode, "valuetext", (newDisplay || this.emptyLabel || "&nbsp;") );
+ 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){
@@ -16898,12 +17728,11 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// set the value.
var isValid = this.isValid(isFocused);
- this.state = isValid ? "" : "Error";
- this._setStateClass();
+ this._set("state", isValid ? "" : "Error");
dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
var message = isValid ? "" : this._missingMsg;
- if(this._message !== message){
- this._message = message;
+ if(this.message !== message){
+ this._set("message", message);
dijit.hideTooltip(this.domNode);
if(message){
dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
@@ -16914,9 +17743,9 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
isValid: function(/*Boolean*/ isFocused){
// summary:
- // Whether or not this is a valid value. The only way a Select
+ // 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 || !(/^\s*$/.test(this.value)));
+ return (!this.required || this.value === 0 || !(/^\s*$/.test(this.value || ""))); // handle value is null or undefined
},
reset: function(){
@@ -16924,9 +17753,8 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// Overridden so that the state will be cleared.
this.inherited(arguments);
dijit.hideTooltip(this.domNode);
- this.state = "";
- this._setStateClass();
- delete this._message;
+ this._set("state", "");
+ this._set("message", "")
},
postMixInProperties: function(){
@@ -16938,10 +17766,17 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
},
postCreate: function(){
+ // summary:
+ // stop mousemove from selecting text on IE to be consistent with other browsers
+
this.inherited(arguments);
- if(this.tableNode.style.width){
- dojo.addClass(this.domNode, this.baseClass + "FixedWidth");
- }
+
+ 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(){
@@ -17017,12 +17852,20 @@ dojo.declare("dijit.form.SimpleTextarea",
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
@@ -17032,13 +17875,6 @@ dojo.declare("dijit.form.SimpleTextarea",
return this.inherited(arguments);
},
- postCreate: function(){
- this.inherited(arguments);
- if(dojo.isIE && this.cols){ // attribute selectors is not supported in IE6
- dojo.addClass(this.textbox, "dijitTextAreaCols");
- }
- },
-
_previousValue: "",
_onInput: function(/*Event?*/ e){
// Override TextBox._onInput() to enforce maxLength restriction
@@ -17086,8 +17922,6 @@ dojo.provide("dijit.InlineEditBox");
-
-
dojo.declare("dijit.InlineEditBox",
dijit._Widget,
{
@@ -17131,12 +17965,12 @@ dojo.declare("dijit.InlineEditBox",
// rather than plain text (ex: `dijit.Editor`)
renderAsHtml: false,
- // editor: String
- // Class name for Editor widget
+ // editor: String|Function
+ // Class name (or reference to the Class) for Editor widget
editor: "dijit.form.TextBox",
- // editorWrapper: String
- // Class name for widget that wraps the editor widget, displaying save/cancel
+ // editorWrapper: String|Function
+ // Class name (or reference to the Class) for widget that wraps the editor widget, displaying save/cancel
// buttons.
editorWrapper: "dijit._InlineEditor",
@@ -17144,6 +17978,10 @@ dojo.declare("dijit.InlineEditBox",
// 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.
@@ -17226,7 +18064,6 @@ dojo.declare("dijit.InlineEditBox",
// summary:
// Hook to make set("disabled", ...) work.
// Set disabled state of widget.
- this.disabled = disabled;
dijit.setWaiState(this.domNode, "disabled", disabled);
if(disabled){
this.displayNode.removeAttribute("tabIndex");
@@ -17234,6 +18071,7 @@ dojo.declare("dijit.InlineEditBox",
this.displayNode.setAttribute("tabIndex", 0);
}
dojo.toggleClass(this.displayNode, "dijitInlineEditBoxDisplayModeDisabled", disabled);
+ this._set("disabled", disabled);
},
_onMouseOver: function(){
@@ -17291,7 +18129,7 @@ dojo.declare("dijit.InlineEditBox",
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 = dojo.getObject(this.editorWrapper);
+ var ewc = typeof this.editorWrapper == "string" ? dojo.getObject(this.editorWrapper) : this.editorWrapper;
this.wrapperWidget = new ewc({
value: this.value,
buttonSave: this.buttonSave,
@@ -17305,6 +18143,9 @@ dojo.declare("dijit.InlineEditBox",
save: dojo.hitch(this, "save"),
cancel: dojo.hitch(this, "cancel")
}, placeholder);
+ if(!this._started){
+ this.startup();
+ }
}
var ww = this.wrapperWidget;
@@ -17350,7 +18191,7 @@ dojo.declare("dijit.InlineEditBox",
},
destroy: function(){
- if(this.wrapperWidget){
+ if(this.wrapperWidget && !this.wrapperWidget._destroyed){
this.wrapperWidget.destroy();
delete this.wrapperWidget;
}
@@ -17387,9 +18228,6 @@ dojo.declare("dijit.InlineEditBox",
var value = ww.getValue();
this.set('value', value); // display changed, formatted value
- // tell the world that we have changed
- setTimeout(dojo.hitch(this, "onChange", value), 0); // setTimeout prevents browser freeze for long-running event handlers
-
this._showText(focus); // set focus as needed
},
@@ -17407,11 +18245,15 @@ dojo.declare("dijit.InlineEditBox",
// Hook to make set("value", ...) work.
// Inserts specified HTML value into this node, or an "input needed" character if node is blank.
- this.value = val = dojo.trim(val);
- if(!this.renderAsHtml){
- val = val.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;").replace(/\n/g, "<br>");
+ 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
}
- this.displayNode.innerHTML = val || this.noValueIndicator;
},
getValue: function(){
@@ -17456,7 +18298,7 @@ dojo.declare(
// value: String
// Value as an HTML string or plain text string, depending on renderAsHTML flag
- templateString: dojo.cache("dijit", "templates/InlineEditBox.html", "<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\"\n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" label=\"${buttonSave}\"></button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\" label=\"${buttonCancel}\"></button\n\t></span\n></span>\n"),
+ 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(){
@@ -17467,9 +18309,11 @@ dojo.declare(
}, this);
},
- postCreate: function(){
+ buildRendering: function(){
+ this.inherited(arguments);
+
// Create edit widget in place in the template
- var cls = dojo.getObject(this.editor);
+ 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.
@@ -17504,13 +18348,21 @@ dojo.declare(
lang: this.lang
});
editorParams[ "displayedValue" in cls.prototype ? "displayedValue" : "value"] = this.value;
- var ew = (this.editWidget = new cls(editorParams, this.editorPlaceholder));
+ 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");
@@ -17520,7 +18372,7 @@ dojo.declare(
this.connect(ew, "onKeyPress", "_onKeyPress");
}else{
// If possible, enable/disable save button based on whether the user has changed the value
- if("intermediateChanges" in cls.prototype){
+ if("intermediateChanges" in ew){
ew.set("intermediateChanges", true);
this.connect(ew, "onChange", "_onIntermediateChange");
this.saveButton.set("disabled", true);
@@ -17670,7 +18522,7 @@ dojo.__cookieProps = function(){
dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){
- // summary:
+ // summary:
// Get or set a cookie.
// description:
// If one argument is passed, returns the value of the cookie
@@ -17679,17 +18531,17 @@ dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/
// Name of the cookie
// value:
// Value for the cookie
- // props:
+ // 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});
@@ -17701,7 +18553,7 @@ dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/
props = props || {};
// FIXME: expires=0 seems to disappear right away, not on close? (FF3) Change docs?
var exp = props.expires;
- if(typeof exp == "number"){
+ if(typeof exp == "number"){
var d = new Date();
d.setTime(d.getTime() + exp*24*60*60*1000);
exp = props.expires = d;
@@ -17722,7 +18574,7 @@ dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/
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.
@@ -17758,7 +18610,7 @@ dojo.declare(
// Monitors the specified StackContainer, and whenever a page is
// added, deleted, or selected, updates itself accordingly.
- templateString: "<span wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",
+ templateString: "<span role='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",
// containerId: [const] String
// The id of the page container that I point to
@@ -17768,11 +18620,19 @@ dojo.declare(
// The name of the button widget to create to correspond to each page
buttonWidget: "dijit.layout._StackButton",
- postCreate: function(){
- dijit.setWaiRole(this.domNode, "tablist");
-
+ constructor: function(){
this.pane2button = {}; // mapping from pane id to buttons
- this.pane2handles = {}; // mapping from pane id to this.connect() handles
+ 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");
@@ -17822,22 +18682,25 @@ dojo.declare(
title: page.tooltip
});
dijit.setWaiState(button.focusNode,"selected", "false");
- this.pane2handles[page.id] = [
- this.connect(page, 'set', function(name, value){
- var buttonAttr = {
- title: 'label',
- showTitle: 'showLabel',
- iconClass: 'iconClass',
- closable: 'closeButton',
- tooltip: 'title'
- }[name];
- if(buttonAttr){
- button.set(buttonAttr, value);
- }
- }),
+
+
+ // 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
@@ -17860,8 +18723,13 @@ dojo.declare(
// private
if(this._currentChild === page){ this._currentChild = null; }
- dojo.forEach(this.pane2handles[page.id], this.disconnect, this);
- delete this.pane2handles[page.id];
+
+ // 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);
@@ -17963,6 +18831,14 @@ dojo.declare(
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);
@@ -17982,7 +18858,7 @@ dojo.declare(
}
}
}
- // handle page navigation
+ // handle next/previous page navigation (left/right arrow, etc.)
if(forward !== null){
this.adjacent(forward).onClick();
dojo.stopEvent(e);
@@ -18016,9 +18892,9 @@ dojo.declare("dijit.layout._StackButton",
// Probably we should be calling this.startupKeyNavChildren() instead.
tabIndex: "-1",
- postCreate: function(/*Event*/ evt){
- dijit.setWaiRole((this.focusNode || this.domNode), "tab");
+ buildRendering: function(/*Event*/ evt){
this.inherited(arguments);
+ dijit.setWaiRole((this.focusNode || this.domNode), "tab");
},
onClick: function(/*Event*/ evt){
@@ -18040,7 +18916,6 @@ dojo.declare("dijit.layout._StackButton",
}
});
-
}
if(!dojo._hasResource["dijit.layout.StackContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -18052,6 +18927,7 @@ dojo.provide("dijit.layout.StackContainer");
+
dojo.declare(
"dijit.layout.StackContainer",
dijit.layout._LayoutWidget,
@@ -18085,10 +18961,14 @@ dojo.declare(
selectedChildWidget: null,
=====*/
- postCreate: function(){
+ 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);
},
@@ -18144,8 +19024,7 @@ dojo.declare(
this.inherited(arguments);
- dojo.removeClass(child.domNode, "dijitVisible");
- dojo.addClass(child.domNode, "dijitHidden");
+ dojo.replaceClass(child.domNode, "dijitHidden", "dijitVisible");
// remove the title attribute so it doesn't show up when i hover
// over a node
@@ -18218,17 +19097,19 @@ dojo.declare(
if(this.selectedChildWidget != page){
// Deselect old page and select new one
- this._transition(page, this.selectedChildWidget, animate);
- this.selectedChildWidget = page;
+ 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){
+ _transition: function(/*dijit._Widget*/ newWidget, /*dijit._Widget*/ oldWidget, /*Boolean*/ animate){
// summary:
// Hide the old widget and display the new widget.
// Subclasses should override this.
@@ -18237,7 +19118,7 @@ dojo.declare(
if(oldWidget){
this._hideChild(oldWidget);
}
- this._showChild(newWidget);
+ 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.
@@ -18251,6 +19132,8 @@ dojo.declare(
newWidget.resize();
}
}
+
+ return d; // If child has an href, promise that fires when the child's href finishes loading
},
_adjacent: function(/*Boolean*/ forward){
@@ -18265,13 +19148,13 @@ dojo.declare(
forward: function(){
// summary:
// Advance to next page.
- this.selectChild(this._adjacent(true), true);
+ return this.selectChild(this._adjacent(true), true);
},
back: function(){
// summary:
// Go back to previous page.
- this.selectChild(this._adjacent(false), true);
+ return this.selectChild(this._adjacent(false), true);
},
_onKeyPress: function(e){
@@ -18289,24 +19172,24 @@ dojo.declare(
// 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.selected = true;
+ page._set("selected", true);
- dojo.removeClass(page.domNode, "dijitHidden");
- dojo.addClass(page.domNode, "dijitVisible");
+ dojo.replaceClass(page.domNode, "dijitVisible", "dijitHidden");
- page._onShow();
+ 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.selected=false;
- dojo.removeClass(page.domNode, "dijitVisible");
- dojo.addClass(page.domNode, "dijitHidden");
+ page._set("selected", false);
+ dojo.replaceClass(page.domNode, "dijitHidden", "dijitVisible");
page.onHide();
},
@@ -18325,7 +19208,7 @@ dojo.declare(
}
},
- destroyDescendants: function(/*Boolean*/preserveDom){
+ destroyDescendants: function(/*Boolean*/ preserveDom){
dojo.forEach(this.getChildren(), function(child){
this.removeChild(child);
child.destroyRecursive(preserveDom);
@@ -18336,7 +19219,6 @@ dojo.declare(
// 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.)
@@ -18401,8 +19283,28 @@ dojo.provide("dijit.layout.AccordionContainer");
+//dojo.require("dijit.layout.AccordionPane "); // for back compat, remove for 2.0
- // 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",
@@ -18428,17 +19330,18 @@ dojo.declare(
// 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",
- postCreate: function(){
- this.domNode.style.overflow = "hidden";
+ buildRendering: function(){
this.inherited(arguments);
- dijit.setWaiRole(this.domNode, "tablist");
+ this.domNode.style.overflow = "hidden"; // TODO: put this in dijit.css
+ dijit.setWaiRole(this.domNode, "tablist"); // TODO: put this in template
},
startup: function(){
@@ -18452,20 +19355,6 @@ dojo.declare(
}
},
- _getTargetHeight: function(/* Node */ node){
- // summary:
- // For the given node, returns the height that should be
- // set to achieve our vertical space (subtract any padding
- // we may have).
- //
- // This is used by the animations.
- //
- // TODO: I don't think this works correctly in IE quirks when an elements
- // style.height including padding and borders
- var cs = dojo.getComputedStyle(node);
- return Math.max(this._verticalSpace - dojo._getPadBorderExtents(node, cs).h - dojo._getMarginExtents(node, cs).h, 0);
- },
-
layout: function(){
// Implement _LayoutWidget.layout() virtual method.
// Set the height of the open pane based on what room remains.
@@ -18474,25 +19363,31 @@ dojo.declare(
if(!openPane){ return;}
- var openPaneContainer = openPane._wrapperWidget.domNode,
- openPaneContainerMargin = dojo._getMarginExtents(openPaneContainer),
- openPaneContainerPadBorder = dojo._getPadBorderExtents(openPaneContainer),
+ // 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.marginBox(child._wrapperWidget.domNode).h;
+ totalCollapsedHeight += dojo._getMarginSize(child._wrapperWidget.domNode).h;
}
});
- this._verticalSpace = mySize.h - totalCollapsedHeight - openPaneContainerMargin.h
- - openPaneContainerPadBorder.h - openPane._buttonWidget.getTitleHeight();
+ 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 - openPaneContainerMargin.w - openPaneContainerPadBorder.w
+ w: this._contentBox.w - wrapperDomNodeMargin.w - wrapperDomNodePadBorder.w
+ - wrapperContainerNodeMargin.w - wrapperContainerNodePadBorder.w
};
if(openPane){
@@ -18516,7 +19411,7 @@ dojo.declare(
this.inherited(arguments);
},
- addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
+ 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
@@ -18532,7 +19427,7 @@ dojo.declare(
// Then stick the wrapper widget around the child widget
this._setupChild(child);
- // Code below copied from StackContainer
+ // Code below copied from StackContainer
dojo.publish(this.id+"-addChild", [child, insertIndex]);
this.layout();
if(!this.selectedChildWidget){
@@ -18548,9 +19443,15 @@ dojo.declare(
removeChild: function(child){
// Overrides _LayoutWidget.removeChild().
- // destroy wrapper widget first, before StackContainer.getChildren() call
- child._wrapperWidget.destroy();
- delete child._wrapperWidget;
+ // 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);
@@ -18564,23 +19465,53 @@ dojo.declare(
},
destroy: function(){
+ if(this._animation){
+ this._animation.stop();
+ }
dojo.forEach(this.getChildren(), function(child){
- child._wrapperWidget.destroy();
+ // 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);
},
- _transition: function(/*dijit._Widget?*/newWidget, /*dijit._Widget?*/oldWidget, /*Boolean*/ animate){
+ _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.
-//TODO: should be able to replace this with calls to slideIn/slideOut
- if(this._inTransition){ return; }
- var animations = [];
- var paneHeight = this._verticalSpace;
+ 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);
- this._showChild(newWidget); // prepare widget to be slid in
+ 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.
@@ -18588,74 +19519,51 @@ dojo.declare(
if(this.doLayout && newWidget.resize){
newWidget.resize(this._containerContentBox);
}
-
- var newContents = newWidget.domNode;
- dojo.addClass(newContents, "dijitVisible");
- dojo.removeClass(newContents, "dijitHidden");
-
- if(animate){
- var newContentsOverflow = newContents.style.overflow;
- newContents.style.overflow = "hidden";
- animations.push(dojo.animateProperty({
- node: newContents,
- duration: this.duration,
- properties: {
- height: { start: 1, end: this._getTargetHeight(newContents) }
- },
- onEnd: function(){
- newContents.style.overflow = newContentsOverflow;
-
- // Kick IE to workaround layout bug, see #11415
- if(dojo.isIE){
- setTimeout(function(){
- dojo.removeClass(newContents.parentNode, "dijitAccordionInnerContainerFocused");
- setTimeout(function(){
- dojo.addClass(newContents.parentNode, "dijitAccordionInnerContainerFocused");
- }, 0);
- }, 0);
- }
- }
- }));
- }
}
+
if(oldWidget){
oldWidget._wrapperWidget.set("selected", false);
- var oldContents = oldWidget.domNode;
- if(animate){
- var oldContentsOverflow = oldContents.style.overflow;
- oldContents.style.overflow = "hidden";
- animations.push(dojo.animateProperty({
- node: oldContents,
- duration: this.duration,
- properties: {
- height: { start: this._getTargetHeight(oldContents), end: 1 }
- },
- onEnd: function(){
- dojo.addClass(oldContents, "dijitHidden");
- dojo.removeClass(oldContents, "dijitVisible");
- oldContents.style.overflow = oldContentsOverflow;
- if(oldWidget.onHide){
- oldWidget.onHide();
- }
- }
- }));
- }else{
- dojo.addClass(oldContents, "dijitHidden");
- dojo.removeClass(oldContents, "dijitVisible");
- if(oldWidget.onHide){
- oldWidget.onHide();
- }
+ if(!animate){
+ this._hideChild(oldWidget);
}
}
if(animate){
- this._inTransition = true;
- var combined = dojo.fx.combine(animations);
- combined.onEnd = dojo.hitch(this, function(){
- delete this._inTransition;
+ 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);
+ }
});
- combined.play();
- }
+ 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
@@ -18666,10 +19574,7 @@ dojo.declare(
// 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._inTransition || this.disabled || e.altKey || !(fromTitle || e.ctrlKey)){
- if(this._inTransition){
- dojo.stopEvent(e);
- }
+ if(this.disabled || e.altKey || !(fromTitle || e.ctrlKey)){
return;
}
var k = dojo.keys,
@@ -18694,16 +19599,17 @@ dojo.declare("dijit.layout._AccordionInnerContainer",
// 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,
=====*/
@@ -18713,7 +19619,15 @@ dojo.declare("dijit.layout._AccordionInnerContainer",
isContainer: true,
isLayoutContainer: true,
- buildRendering: function(){
+ 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");
@@ -18731,22 +19645,32 @@ dojo.declare("dijit.layout._AccordionInnerContainer",
parent: this.parent
})).placeAt(this.domNode);
- // and then the actual content widget (changing it from prior-sibling to last-child)
- dojo.place(this.contentWidget.domNode, 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);
- this.connect(this.contentWidget, 'set', function(name, value){
- var mappedName = {title: "label", tooltip: "title", iconClass: "iconClass"}[name];
- if(mappedName){
- this.button.set(mappedName, value);
- }
- }, this);
+
+ // 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.selected = isSelected;
+ this._set("selected", isSelected);
this.button.set("selected", isSelected);
if(isSelected){
var cw = this.contentWidget;
@@ -18761,7 +19685,9 @@ dojo.declare("dijit.layout._AccordionInnerContainer",
destroy: function(){
this.button.destroyRecursive();
-
+
+ dojo.forEach(this._contentWidgetWatches || [], function(w){ w.unwatch(); });
+
delete this.contentWidget._buttonWidget;
delete this.contentWidget._wrapperWidget;
@@ -18783,7 +19709,7 @@ dojo.declare("dijit.layout._AccordionButton",
// 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' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowTextUp' waiRole=\"presentation\">+</span\n\t\t><span class='arrowTextDown' waiRole=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" waiRole=\"presentation\"/>\n\t\t<span waiRole=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'></span>\n\t</div>\n</div>\n"),
+ 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"},
@@ -18800,18 +19726,18 @@ dojo.declare("dijit.layout._AccordionButton",
return this.parent;
},
- postCreate: function(){
+ buildRendering: function(){
this.inherited(arguments);
- dojo.setSelectable(this.domNode, false);
- var titleTextNodeId = dojo.attr(this.domNode,'id').replace(' ','_');
+ 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.marginBox(this.domNode).h; // Integer
+ return dojo._getMarginSize(this.domNode).h; // Integer
},
// TODO: maybe the parent should set these methods directly rather than forcing the code
@@ -18820,10 +19746,8 @@ dojo.declare("dijit.layout._AccordionButton",
// summary:
// Callback when someone clicks my title.
var parent = this.getParent();
- if(!parent._inTransition){
parent.selectChild(this.contentWidget, true);
dijit.focus(this.focusNode);
- }
},
_onTitleKeyPress: function(/*Event*/ evt){
@@ -18831,7 +19755,7 @@ dojo.declare("dijit.layout._AccordionButton",
},
_setSelectedAttr: function(/*Boolean*/ isSelected){
- this.selected = isSelected;
+ this._set("selected", isSelected);
dijit.setWaiState(this.focusNode, "expanded", isSelected);
dijit.setWaiState(this.focusNode, "selected", isSelected);
this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
@@ -18847,6 +19771,7 @@ dojo.provide("dijit.layout.BorderContainer");
+
dojo.declare(
"dijit.layout.BorderContainer",
dijit.layout._LayoutWidget,
@@ -18862,19 +19787,21 @@ dojo.declare(
// include optional splitters (splitter="true") to make them resizable by the user. The remaining
// space is designated for the center region.
//
- // NOTE: Splitters must not be more than 50 pixels in width.
- //
// 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="ContentPane" region="top">header text</div>
- // | <div dojoType="ContentPane" region="right" splitter="true" style="width: 200px;">table of contents</div>
- // | <div dojoType="ContentPane" region="center">client area</div>
+ // | <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
@@ -18884,13 +19811,13 @@ dojo.declare(
// - "sidebar" where the left and right sides extend from top to bottom.
design: "headline",
- // gutters: Boolean
+ // 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: Boolean
+ // liveSplitters: [const] Boolean
// Specifies whether splitters resize as you drag (true) or only upon mouseup (false)
liveSplitters: true,
@@ -18913,13 +19840,6 @@ dojo.declare(
this.inherited(arguments);
},
- postCreate: function(){
- this.inherited(arguments);
-
- this._splitters = {};
- this._splitterThickness = {};
- },
-
startup: function(){
if(this._started){ return; }
dojo.forEach(this.getChildren(), this._setupChild, this);
@@ -18939,14 +19859,10 @@ dojo.declare(
if(region == "leading"){ region = ltr ? "left" : "right"; }
if(region == "trailing"){ region = ltr ? "right" : "left"; }
- //FIXME: redundant?
- this["_"+region] = child.domNode;
- this["_"+region+"Widget"] = child;
-
// Create draggable splitter for resizing pane,
// or alternately if splitter=false but BorderContainer.gutters=true then
// insert dummy div just for spacing
- if((child.splitter || this.gutters) && !this._splitters[region]){
+ 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",
@@ -18956,24 +19872,19 @@ dojo.declare(
live: this.liveSplitters
});
splitter.isSplitter = true;
- this._splitters[region] = splitter.domNode;
- dojo.place(this._splitters[region], child.domNode, "after");
+ child._splitterWidget = splitter;
- // Splitters arent added as Contained children, so we need to call startup explicitly
+ 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;
+ child.region = region; // TODO: technically wrong since it overwrites "trailing" with "left" etc.
}
},
- _computeSplitterThickness: function(region){
- this._splitterThickness[region] = this._splitterThickness[region] ||
- dojo.marginBox(this._splitters[region])[(/top|bottom/.test(region) ? 'h' : 'w')];
- },
-
layout: function(){
// Implement _LayoutWidget.layout() virtual method.
- for(var region in this._splitters){ this._computeSplitterThickness(region); }
this._layoutChildren();
},
@@ -18987,20 +19898,29 @@ dojo.declare(
removeChild: function(/*dijit._Widget*/ child){
// Override _LayoutWidget.removeChild().
+
var region = child.region;
- var splitter = this._splitters[region];
+ var splitter = child._splitterWidget
if(splitter){
- dijit.byNode(splitter).destroy();
- delete this._splitters[region];
- delete this._splitterThickness[region];
+ splitter.destroy();
+ delete child._splitterWidget;
}
this.inherited(arguments);
- delete this["_"+region];
- delete this["_" +region+"Widget"];
+
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(){
@@ -19010,11 +19930,15 @@ dojo.declare(
});
},
+ // TODO: remove in 2.0
getSplitter: function(/*String*/region){
// summary:
// Returns the widget responsible for rendering the splitter associated with region
- var splitter = this._splitters[region];
- return splitter ? dijit.byNode(splitter) : null;
+ // tags:
+ // deprecated
+ return dojo.filter(this.getChildren(), function(child){
+ return child.region == region;
+ })[0]._splitterWidget;
},
resize: function(newSize, currentSize){
@@ -19035,7 +19959,7 @@ dojo.declare(
this.inherited(arguments);
},
- _layoutChildren: function(/*String?*/changedRegion, /*Number?*/ changedRegionSize){
+ _layoutChildren: function(/*String?*/ changedChildId, /*Number?*/ changedChildSize){
// summary:
// This is the main routine for setting size/position of each child.
// description:
@@ -19045,11 +19969,10 @@ dojo.declare(
// 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.
- // changedRegion:
- // The region should be changed because splitter was dragged.
- // "left", "right", "top", or "bottom".
- // changedRegionSize:
- // The new width/height (in pixels) to make changedRegion
+ // 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.
@@ -19057,196 +19980,63 @@ dojo.declare(
return;
}
- var sidebarLayout = (this.design == "sidebar");
- var topHeight = 0, bottomHeight = 0, leftWidth = 0, rightWidth = 0;
- var topStyle = {}, leftStyle = {}, rightStyle = {}, bottomStyle = {},
- centerStyle = (this._center && this._center.style) || {};
-
- var changedSide = /left|right/.test(changedRegion);
-
- var layoutSides = !changedRegion || (!changedSide && !sidebarLayout);
- var layoutTopBottom = !changedRegion || (changedSide && sidebarLayout);
-
- // Ask browser for width/height of side panes.
- // Would be nice to cache this but height can change according to width
- // (because words wrap around). I don't think width will ever change though
- // (except when the user drags a splitter).
- if(this._top){
- topStyle = (changedRegion == "top" || layoutTopBottom) && this._top.style;
- topHeight = changedRegion == "top" ? changedRegionSize : dojo.marginBox(this._top).h;
- }
- if(this._left){
- leftStyle = (changedRegion == "left" || layoutSides) && this._left.style;
- leftWidth = changedRegion == "left" ? changedRegionSize : dojo.marginBox(this._left).w;
- }
- if(this._right){
- rightStyle = (changedRegion == "right" || layoutSides) && this._right.style;
- rightWidth = changedRegion == "right" ? changedRegionSize : dojo.marginBox(this._right).w;
- }
- if(this._bottom){
- bottomStyle = (changedRegion == "bottom" || layoutTopBottom) && this._bottom.style;
- bottomHeight = changedRegion == "bottom" ? changedRegionSize : dojo.marginBox(this._bottom).h;
- }
-
- var splitters = this._splitters;
- var topSplitter = splitters.top, bottomSplitter = splitters.bottom,
- leftSplitter = splitters.left, rightSplitter = splitters.right;
- var splitterThickness = this._splitterThickness;
- var topSplitterThickness = splitterThickness.top || 0,
- leftSplitterThickness = splitterThickness.left || 0,
- rightSplitterThickness = splitterThickness.right || 0,
- bottomSplitterThickness = splitterThickness.bottom || 0;
-
- // Check for race condition where CSS hasn't finished loading, so
- // the splitter width == the viewport width (#5824)
- if(leftSplitterThickness > 50 || rightSplitterThickness > 50){
- setTimeout(dojo.hitch(this, function(){
- // Results are invalid. Clear them out.
- this._splitterThickness = {};
-
- for(var region in this._splitters){
- this._computeSplitterThickness(region);
+ // 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];
}
- this._layoutChildren();
- }), 50);
- return false;
- }
-
- var pe = this.pe;
-
- var splitterBounds = {
- left: (sidebarLayout ? leftWidth + leftSplitterThickness: 0) + pe.l + "px",
- right: (sidebarLayout ? rightWidth + rightSplitterThickness: 0) + pe.r + "px"
- };
-
- if(topSplitter){
- dojo.mixin(topSplitter.style, splitterBounds);
- topSplitter.style.top = topHeight + pe.t + "px";
- }
-
- if(bottomSplitter){
- dojo.mixin(bottomSplitter.style, splitterBounds);
- bottomSplitter.style.bottom = bottomHeight + pe.b + "px";
- }
-
- splitterBounds = {
- top: (sidebarLayout ? 0 : topHeight + topSplitterThickness) + pe.t + "px",
- bottom: (sidebarLayout ? 0 : bottomHeight + bottomSplitterThickness) + pe.b + "px"
- };
-
- if(leftSplitter){
- dojo.mixin(leftSplitter.style, splitterBounds);
- leftSplitter.style.left = leftWidth + pe.l + "px";
- }
-
- if(rightSplitter){
- dojo.mixin(rightSplitter.style, splitterBounds);
- rightSplitter.style.right = rightWidth + pe.r + "px";
- }
-
- dojo.mixin(centerStyle, {
- top: pe.t + topHeight + topSplitterThickness + "px",
- left: pe.l + leftWidth + leftSplitterThickness + "px",
- right: pe.r + rightWidth + rightSplitterThickness + "px",
- bottom: pe.b + bottomHeight + bottomSplitterThickness + "px"
+ }
+ return 0;
});
- var bounds = {
- top: sidebarLayout ? pe.t + "px" : centerStyle.top,
- bottom: sidebarLayout ? pe.b + "px" : centerStyle.bottom
- };
- dojo.mixin(leftStyle, bounds);
- dojo.mixin(rightStyle, bounds);
- leftStyle.left = pe.l + "px"; rightStyle.right = pe.r + "px"; topStyle.top = pe.t + "px"; bottomStyle.bottom = pe.b + "px";
- if(sidebarLayout){
- topStyle.left = bottomStyle.left = leftWidth + leftSplitterThickness + pe.l + "px";
- topStyle.right = bottomStyle.right = rightWidth + rightSplitterThickness + pe.r + "px";
- }else{
- topStyle.left = bottomStyle.left = pe.l + "px";
- topStyle.right = bottomStyle.right = pe.r + "px";
- }
-
- // More calculations about sizes of panes
- var containerHeight = this._borderBox.h - pe.t - pe.b,
- middleHeight = containerHeight - ( topHeight + topSplitterThickness + bottomHeight + bottomSplitterThickness),
- sidebarHeight = sidebarLayout ? containerHeight : middleHeight;
-
- var containerWidth = this._borderBox.w - pe.l - pe.r,
- middleWidth = containerWidth - (leftWidth + leftSplitterThickness + rightWidth + rightSplitterThickness),
- sidebarWidth = sidebarLayout ? middleWidth : containerWidth;
+ // 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);
+ }
+ });
- // New margin-box size of each pane
+ // Compute the box in which to lay out my children
var dim = {
- top: { w: sidebarWidth, h: topHeight },
- bottom: { w: sidebarWidth, h: bottomHeight },
- left: { w: leftWidth, h: sidebarHeight },
- right: { w: rightWidth, h: sidebarHeight },
- center: { h: middleHeight, w: middleWidth }
+ l: this.pe.l,
+ t: this.pe.t,
+ w: this._borderBox.w - this.pe.w,
+ h: this._borderBox.h - this.pe.h
};
- if(changedRegion){
- // Respond to splitter drag event by changing changedRegion's width or height
- var child = this["_" + changedRegion + "Widget"],
- mb = {};
- mb[ /top|bottom/.test(changedRegion) ? "h" : "w"] = changedRegionSize;
- child.resize ? child.resize(mb, dim[child.region]) : dojo.marginBox(child.domNode, mb);
- }
+ // Layout the children, possibly changing size due to a splitter drag
+ dijit.layout.layoutChildren(this.domNode, dim, childrenAndSplitters,
+ changedChildId, changedChildSize);
+ },
- // Nodes in IE<8 don't respond to t/l/b/r, and TEXTAREA doesn't respond in any browser
- var janky = dojo.isIE < 8 || (dojo.isIE && dojo.isQuirks) || dojo.some(this.getChildren(), function(child){
- return child.domNode.tagName == "TEXTAREA" || child.domNode.tagName == "INPUT";
+ 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;
});
- if(janky){
- // Set the size of the children the old fashioned way, by setting
- // CSS width and height
-
- var resizeWidget = function(widget, changes, result){
- if(widget){
- (widget.resize ? widget.resize(changes, result) : dojo.marginBox(widget.domNode, changes));
- }
- };
-
- if(leftSplitter){ leftSplitter.style.height = sidebarHeight; }
- if(rightSplitter){ rightSplitter.style.height = sidebarHeight; }
- resizeWidget(this._leftWidget, {h: sidebarHeight}, dim.left);
- resizeWidget(this._rightWidget, {h: sidebarHeight}, dim.right);
-
- if(topSplitter){ topSplitter.style.width = sidebarWidth; }
- if(bottomSplitter){ bottomSplitter.style.width = sidebarWidth; }
- resizeWidget(this._topWidget, {w: sidebarWidth}, dim.top);
- resizeWidget(this._bottomWidget, {w: sidebarWidth}, dim.bottom);
-
- resizeWidget(this._centerWidget, dim.center);
- }else{
- // Calculate which panes need a notification that their size has been changed
- // (we've already set style.top/bottom/left/right on those other panes).
- var notifySides = !changedRegion || (/top|bottom/.test(changedRegion) && this.design != "sidebar"),
- notifyTopBottom = !changedRegion || (/left|right/.test(changedRegion) && this.design == "sidebar"),
- notifyList = {
- center: true,
- left: notifySides,
- right: notifySides,
- top: notifyTopBottom,
- bottom: notifyTopBottom
- };
-
- // Send notification to those panes that have changed size
- dojo.forEach(this.getChildren(), function(child){
- if(child.resize && notifyList[child.region]){
- child.resize(null, dim[child.region]);
- }
- }, this);
- }
- },
- destroy: function(){
- for(var region in this._splitters){
- var splitter = this._splitters[region];
- dijit.byNode(splitter).destroy();
- dojo.destroy(splitter);
- }
- delete this._splitters;
- delete this._splitterThickness;
+ // Then destroy the real children, and myself
this.inherited(arguments);
}
});
@@ -19261,6 +20051,12 @@ dojo.extend(dijit._Widget, {
// 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
@@ -19278,8 +20074,6 @@ dojo.extend(dijit._Widget, {
maxSize: Infinity
});
-
-
dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
{
// summary:
@@ -19299,7 +20093,7 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
// Pointer to the pane associated with this splitter
child: null,
- // region: String
+ // region: [const] String
// Region of pane associated with this splitter.
// "top", "bottom", "left", "right".
region: null,
@@ -19310,18 +20104,21 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
// 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" waiRole="separator"><div class="dijitSplitterThumb"></div></div>',
+ templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse" tabIndex="0" role="separator"><div class="dijitSplitterThumb"></div></div>',
- postCreate: function(){
+ postMixInProperties: function(){
this.inherited(arguments);
- this.horizontal = /top|bottom/.test(this.region);
- dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V"));
-// dojo.addClass(this.child.domNode, "dijitSplitterPane");
-// dojo.setSelectable(this.domNode, false); //TODO is this necessary?
+ 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);
@@ -19333,23 +20130,14 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
_computeMaxSize: function(){
// summary:
- // Compute the maximum size that my corresponding pane can be set to
+ // Return the maximum size that my corresponding pane can be set to
var dim = this.horizontal ? 'h' : 'w',
- thickness = this.container._splitterThickness[this.region];
-
- // Get DOMNode of opposite pane, if an opposite pane exists.
- // Ex: if I am the _Splitter for the left pane, then get the right pane.
- var flip = {left:'right', right:'left', top:'bottom', bottom:'top', leading:'trailing', trailing:'leading'},
- oppNode = this.container["_" + flip[this.region]];
-
- // I can expand up to the edge of the opposite pane, or if there's no opposite pane, then to
- // edge of BorderContainer
- var available = dojo.contentBox(this.container.domNode)[dim] -
- (oppNode ? dojo.marginBox(oppNode)[dim] : 0) -
- 20 - thickness * 2;
+ 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, available);
+ return Math.min(this.child.maxSize, childSize + spaceAvailable);
},
_startDrag: function(e){
@@ -19368,28 +20156,26 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
dojo.addClass(this.domNode, "dijitSplitterShadow");
dojo.place(this.fake, this.domNode, "after");
}
- dojo.addClass(this.domNode, "dijitSplitterActive");
- dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
+ dojo.addClass(this.domNode, "dijitSplitterActive dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
if(this.fake){
- dojo.removeClass(this.fake, "dijitSplitterHover");
- dojo.removeClass(this.fake, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover");
+ 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,
- max = this._computeMaxSize(),
- min = this.child.minSize || 20,
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,
- splitterStart = parseInt(this.domNode.style[region], 10),
+ splitterAttr = region == "top" || region == "bottom" ? "top" : "left", // style attribute of splitter to adjust
+ splitterStart = parseInt(splitterStyle[splitterAttr], 10),
resize = this._resize,
- childNode = this.child.domNode,
- layoutFunc = dojo.hitch(this.container, this.container._layoutChildren),
+ layoutFunc = dojo.hitch(this.container, "_layoutChildren", this.child.id),
de = dojo.doc;
this._handlers = (this._handlers || []).concat([
@@ -19399,9 +20185,10 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
boundChildSize = Math.max(Math.min(childSize, max), min);
if(resize || forceResize){
- layoutFunc(region, boundChildSize);
+ layoutFunc(boundChildSize);
}
- splitterStyle[region] = factor * delta + splitterStart + (boundChildSize - childSize) + "px";
+ // 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),
@@ -19422,9 +20209,8 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
dojo.removeClass(this.cover, "dijitSplitterCoverActive");
}
if(this.fake){ dojo.destroy(this.fake); }
- dojo.removeClass(this.domNode, "dijitSplitterActive");
- dojo.removeClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
- dojo.removeClass(this.domNode, "dijitSplitterShadow");
+ dojo.removeClass(this.domNode, "dijitSplitterActive dijitSplitter"
+ + (this.horizontal ? "H" : "V") + "Active dijitSplitterShadow");
this._drag(e); //TODO: redundant with onmousemove?
this._drag(e, true);
}finally{
@@ -19458,8 +20244,8 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
// this.inherited(arguments);
return;
}
- var childSize = dojo.marginBox(this.child.domNode)[ horizontal ? 'h' : 'w' ] + this._factor * tick;
- this.container._layoutChildren(this.region, Math.max(Math.min(childSize, this._computeMaxSize()), this.child.minSize));
+ 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);
},
@@ -19473,7 +20259,7 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
}
});
-dojo.declare("dijit.layout._Gutter", [dijit._Widget, dijit._Templated ],
+dojo.declare("dijit.layout._Gutter", [dijit._Widget, dijit._Templated],
{
// summary:
// Just a spacer div to separate side pane from center pane.
@@ -19484,10 +20270,15 @@ dojo.declare("dijit.layout._Gutter", [dijit._Widget, dijit._Templated ],
// tags:
// private
- templateString: '<div class="dijitGutter" waiRole="presentation"></div>',
+ templateString: '<div class="dijitGutter" role="presentation"></div>',
- postCreate: function(){
+ 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"));
}
});
@@ -19519,12 +20310,12 @@ dojo.declare("dijit.layout._TabContainerBase",
baseClass: "dijitTabContainer",
- // tabStrip: Boolean
+ // tabStrip: [const] Boolean
// Defines whether the tablist gets an extra class for layouting, putting a border/shading
- // around the set of tabs.
+ // around the set of tabs. Not supported by claro theme.
tabStrip: false,
- // nested: Boolean
+ // 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.
@@ -19541,7 +20332,7 @@ dojo.declare("dijit.layout._TabContainerBase",
this.inherited(arguments);
},
- postCreate: function(){
+ buildRendering: function(){
this.inherited(arguments);
// Create the tab list that will have a tab (a.k.a. tab button) for each tab panel
@@ -19608,7 +20399,12 @@ dojo.declare("dijit.layout._TabContainerBase",
}else{
// just layout the tab controller, so it can position left/right buttons etc.
if(this.tablist.resize){
- this.tablist.resize({w: dojo.contentBox(this.domNode).w});
+ //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
@@ -19626,7 +20422,6 @@ dojo.declare("dijit.layout._TabContainerBase",
}
});
-
}
if(!dojo._hasResource["dijit.layout.TabController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -19635,10 +20430,10 @@ dojo.provide("dijit.layout.TabController");
-// Menu is used for an accessible close button, would be nice to have a lighter-weight solution
+// Menu is used for an accessible close button, would be nice to have a lighter-weight solution
dojo.declare("dijit.layout.TabController",
@@ -19654,7 +20449,7 @@ dojo.declare("dijit.layout.TabController",
// tags:
// private
- templateString: "<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",
+ templateString: "<div role='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",
// tabPosition: String
// Defines where tabs go relative to the content.
@@ -19704,32 +20499,16 @@ dojo.declare("dijit.layout._TabButton",
closeNode: "dijitTabCloseButton"
},
- templateString: dojo.cache("dijit.layout", "templates/_TabButton.html", "<div waiRole=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick'>\n <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n \t<div waiRole=\"presentation\" dojoAttachPoint='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" 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' waiRole=\"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"),
+ 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,
- postMixInProperties: function(){
- // Override blank iconClass from Button to do tab height adjustment on IE6,
- // to make sure that tabs with and w/out close icons are same height
- if(!this.iconClass){
- this.iconClass = "dijitTabButtonIcon";
- }
- },
-
- postCreate: function(){
+ buildRendering: function(){
this.inherited(arguments);
- dojo.setSelectable(this.containerNode, false);
- // If a custom icon class has not been set for the
- // tab icon, set its width to one pixel. This ensures
- // that the height styling of the tab is maintained,
- // as it is based on the height of the icon.
- // TODO: I still think we can just set dijitTabButtonIcon to 1px in CSS <Bill>
- if(this.iconNode.className == "dijitTabButtonIcon"){
- dojo.style(this.iconNode, "width", "1px");
- }
+ dojo.setSelectable(this.containerNode, false);
},
startup: function(){
@@ -19743,8 +20522,10 @@ dojo.declare("dijit.layout._TabButton",
}, 1);
},
- _setCloseButtonAttr: function(disp){
- this.closeButton = disp;
+ _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){
@@ -19776,16 +20557,16 @@ dojo.declare("dijit.layout._TabButton",
},
_setLabelAttr: function(/*String*/ content){
// summary:
- // Hook for attr('label', ...) to work.
+ // Hook for set('label', ...) to work.
// description:
// takes an HTML string.
- // Inherited ToggleButton implementation will Set the label (text) of the button;
+ // 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 || '');
- }
- },
+ 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){
@@ -19805,6 +20586,8 @@ dojo.provide("dijit.layout.ScrollingTabController");
+
+
dojo.declare("dijit.layout.ScrollingTabController",
dijit.layout.TabController,
{
@@ -19816,9 +20599,9 @@ dojo.declare("dijit.layout.ScrollingTabController",
// tags:
// private
- templateString: dojo.cache("dijit.layout", "templates/ScrollingTabController.html", "<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\" iconClass=\"dijitTabStripMenuIcon\"\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 wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'\n\t\t\t\tdojoAttachPoint='containerNode' class='nowrapTabStrip'></div>\n\t</div>\n</div>\n"),
+ 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
+ // 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,
@@ -19828,7 +20611,7 @@ dojo.declare("dijit.layout.ScrollingTabController",
// wide to fit the TabContainer, false otherwise.
useSlider: true,
- // tabStripClass: String
+ // tabStripClass: [const] String
// The css class to apply to the tab strip, if it is visible.
tabStripClass: "",
@@ -19844,7 +20627,7 @@ dojo.declare("dijit.layout.ScrollingTabController",
"class": "containerNode"
}),
- postCreate: function(){
+ buildRendering: function(){
this.inherited(arguments);
var n = this.domNode;
@@ -19874,41 +20657,18 @@ dojo.declare("dijit.layout.ScrollingTabController",
onAddChild: function(page, insertIndex){
this.inherited(arguments);
- var menuItem;
- if(this.useMenu){
- var containerId = this.containerId;
- menuItem = new dijit.MenuItem({
- id: page.id + "_stcMi",
- label: page.title,
- dir: page.dir,
- lang: page.lang,
- onClick: dojo.hitch(this, function(){
- var container = dijit.byId(containerId);
- container.selectChild(page);
- })
- });
- this._menuChildren[page.id] = menuItem;
- this._menu.addChild(menuItem, insertIndex);
- }
- // update the menuItem label when the button label is updated
- this.pane2handles[page.id].push(
- this.connect(this.pane2button[page.id], "set", function(name, value){
- if(this._postStartup){
- if(name == "label"){
- if(menuItem){
- menuItem.set(name, value);
- }
-
- // The changed label will have changed the width of the
- // buttons, so do a resize
- if(this._dim){
- this.resize(this._dim);
- }
+ // 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.
@@ -19925,13 +20685,6 @@ dojo.declare("dijit.layout.ScrollingTabController",
this._selectedTab = null;
}
- // delete menu entry corresponding to pane that was removed from TabContainer
- if(this.useMenu && page && page.id && this._menuChildren[page.id]){
- this._menu.removeChild(this._menuChildren[page.id]);
- this._menuChildren[page.id].destroy();
- delete this._menuChildren[page.id];
- }
-
this.inherited(arguments);
},
@@ -19939,7 +20692,6 @@ dojo.declare("dijit.layout.ScrollingTabController",
// summary:
// Creates the buttons used to scroll to view tabs that
// may not be visible if the TabContainer is too narrow.
- this._menuChildren = {};
// Make a list of the buttons to display when the tab labels become
// wider than the TabContainer, and hide the other buttons.
@@ -19948,26 +20700,13 @@ dojo.declare("dijit.layout.ScrollingTabController",
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.marginBox(btn).w;
+ this._btnWidth += dojo._getMarginSize(btn).w;
return true;
}else{
dojo.style(btn, "display", "none");
return false;
}
}, this);
-
- if(this.useMenu){
- // Create the menu that is used to select tabs.
- this._menu = new dijit.Menu({
- id: this.id + "_menu",
- dir: this.dir,
- lang: this.lang,
- targetNodeIds: [this._menuBtn.domNode],
- leftClickToOpen: true,
- refocus: false // selecting a menu item sets focus to a TabButton
- });
- this._supportingWidgets.push(this._menu);
- }
},
_getTabsWidth: function(){
@@ -20037,6 +20776,10 @@ dojo.declare("dijit.layout.ScrollingTabController",
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(){
@@ -20139,7 +20882,7 @@ dojo.declare("dijit.layout.ScrollingTabController",
return pos;
},
- createSmoothScroll : function(x){
+ 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.
@@ -20185,7 +20928,7 @@ dojo.declare("dijit.layout.ScrollingTabController",
return anim; // dojo._Animation
},
- _getBtnNode: function(e){
+ _getBtnNode: function(/*Event*/ e){
// summary:
// Gets a button DOM node from a mouse click event.
// e:
@@ -20197,7 +20940,7 @@ dojo.declare("dijit.layout.ScrollingTabController",
return n;
},
- doSlideRight: function(e){
+ doSlideRight: function(/*Event*/ e){
// summary:
// Scrolls the menu to the right.
// e:
@@ -20205,7 +20948,7 @@ dojo.declare("dijit.layout.ScrollingTabController",
this.doSlide(1, this._getBtnNode(e));
},
- doSlideLeft: function(e){
+ doSlideLeft: function(/*Event*/ e){
// summary:
// Scrolls the menu to the left.
// e:
@@ -20213,7 +20956,7 @@ dojo.declare("dijit.layout.ScrollingTabController",
this.doSlide(-1,this._getBtnNode(e));
},
- doSlide: function(direction, node){
+ doSlide: function(/*Number*/ direction, /*DomNode*/ node){
// summary:
// Scrolls the tab list to the left or right by 75% of the widget width.
// direction:
@@ -20232,7 +20975,7 @@ dojo.declare("dijit.layout.ScrollingTabController",
this.createSmoothScroll(to).play();
},
- _setButtonClass: function(scroll){
+ _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.
@@ -20245,18 +20988,71 @@ dojo.declare("dijit.layout.ScrollingTabController",
}
});
-dojo.declare("dijit.layout._ScrollingTabControllerButton",
- dijit.form.Button,
- {
- baseClass: "dijitTab tabStripButton",
- templateString: dojo.cache("dijit.layout", "templates/_ScrollingTabControllerButton.html", "<div dojoAttachEvent=\"onclick:_onButtonClick\">\n\t<div waiRole=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div waiRole=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img waiRole=\"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"),
+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: "-1"
+ 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;
+ }
}
-);
+});
}
@@ -20328,7 +21124,6 @@ dojo.declare("dijit.layout.TabContainer",
}
});
-
}
if(!dojo._hasResource["dojo.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -20339,7 +21134,7 @@ dojo.provide("dojo.number");
-
+dojo.getObject("number", true, dojo);
/*=====
dojo.number = {
@@ -20444,7 +21239,7 @@ dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.
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:
@@ -20470,7 +21265,7 @@ dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/incr
// 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
@@ -20483,7 +21278,7 @@ if((0.9).toFixed() == 0){
d = 0;
}
return round(v, p, m) + (v > 0 ? d : -d);
- }
+ };
})();
}
@@ -20506,7 +21301,7 @@ dojo.number.__FormatAbsoluteOptions = function(){
=====*/
dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
- // summary:
+ // summary:
// Apply numeric pattern to absolute value using options. Gives no
// consideration to local customs.
// value:
@@ -20621,7 +21416,7 @@ dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
// 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 || {};
@@ -20709,7 +21504,7 @@ dojo.number._parseInfo = function(/*Object?*/options){
// normalize whitespace and return
return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
-}
+};
/*=====
dojo.number.__ParseOptions = function(){
@@ -20820,10 +21615,10 @@ dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*
var re = "";
if(q && (flags.places!==0)){
re = "\\" + flags.decimal;
- if(flags.places == Infinity){
- re = "(?:" + re + "\\d+)?";
+ if(flags.places == Infinity){
+ re = "(?:" + re + "\\d+)?";
}else{
- re += "\\d{" + flags.places + "}";
+ re += "\\d{" + flags.places + "}";
}
}
return re;
@@ -20832,9 +21627,9 @@ dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*
);
var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
- function(q){
+ function(q){
if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
- return "";
+ return "";
}
);
@@ -20866,7 +21661,7 @@ dojo.number.__IntegerRegexpFlags = function(){
=====*/
dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
- // summary:
+ // summary:
// Builds a regular expression that matches an integer
// assign default values to missing parameters
@@ -20905,7 +21700,7 @@ dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags
);
return signRE + numberRE; // String
-}
+};
}
@@ -20918,7 +21713,6 @@ dojo.provide("dijit.ProgressBar");
-
dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
// summary:
// A progress indication widget, showing the amount completed
@@ -20927,20 +21721,21 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
// example:
// | <div dojoType="ProgressBar"
// | places="0"
- // | progress="..." maximum="...">
+ // | value="..." maximum="...">
// | </div>
- //
- // description:
- // Note that the progress bar is updated via (a non-standard)
- // update() method, rather than via attr() like other widgets.
// progress: [const] 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
- // TODO: rename to value for 2.0
+ // 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,
@@ -20952,22 +21747,34 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
// 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\"\n\t><div waiRole=\"progressbar\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"),
+ 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"),
- // public functions
- postCreate: function(){
+ 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());
@@ -20976,28 +21783,28 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
update: function(/*Object?*/attributes){
// summary:
- // Change attributes of ProgressBar, similar to attr(hash).
- //
+ // 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;
- var percent = 1, classFunc;
+ var tip = this.internalProgress, ap = this.domNode;
+ var percent = 1;
if(this.indeterminate){
- classFunc = "addClass";
- dijit.removeWaiState(tip, "valuenow");
- dijit.removeWaiState(tip, "valuemin");
- dijit.removeWaiState(tip, "valuemax");
+ dijit.removeWaiState(ap, "valuenow");
+ dijit.removeWaiState(ap, "valuemin");
+ dijit.removeWaiState(ap, "valuemax");
}else{
- classFunc = "removeClass";
if(String(this.progress).indexOf("%") != -1){
percent = Math.min(parseFloat(this.progress)/100, 1);
this.progress = percent * this.maximum;
@@ -21005,19 +21812,21 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
this.progress = Math.min(this.progress, this.maximum);
percent = this.progress / this.maximum;
}
- var text = this.report(percent);
- this.label.firstChild.nodeValue = text;
- dijit.setWaiState(tip, "describedby", this.label.id);
- dijit.setWaiState(tip, "valuenow", this.progress);
- dijit.setWaiState(tip, "valuemin", 0);
- dijit.setWaiState(tip, "valuemax", 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);
}
- dojo[classFunc](this.domNode, "dijitProgressBarIndeterminate");
+ 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{
@@ -21025,8 +21834,15 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
}
},
- _getValueAttr: function(){
- return this.progress;
+ _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){
@@ -21036,14 +21852,15 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
// tags:
// extension
- return dojo.number.format(percent, { type: "percent", places: this.places, locale: this.lang });
+ 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:
- // progress
+ // extension
}
});
@@ -21061,8 +21878,11 @@ dojo.declare("dijit.ToolbarSeparator",
{
// summary:
// A spacer between two `dijit.Toolbar` items
- templateString: '<div class="dijitToolbarSeparator dijitInline" waiRole="presentation"></div>',
- postCreate: function(){ dojo.setSelectable(this.domNode, false); },
+ 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.
@@ -21073,8 +21893,6 @@ dojo.declare("dijit.ToolbarSeparator",
});
-
-
}
if(!dojo._hasResource["dijit.Toolbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -21085,6 +21903,9 @@ 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],
{
@@ -21092,7 +21913,7 @@ dojo.declare("dijit.Toolbar",
// A Toolbar widget, used to hold things like `dijit.Editor` buttons
templateString:
- '<div class="dijit" waiRole="toolbar" tabIndex="${tabIndex}" dojoAttachPoint="containerNode">' +
+ '<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>' +
@@ -21101,11 +21922,12 @@ dojo.declare("dijit.Toolbar",
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]
);
- this.inherited(arguments);
},
startup: function(){
@@ -21118,14 +21940,13 @@ dojo.declare("dijit.Toolbar",
}
);
-// For back-compat, remove for 2.0
-
-
}
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.
@@ -21183,7 +22004,7 @@ dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*B
dojo.DeferredList.prototype = new dojo.Deferred();
dojo.DeferredList.prototype.gatherResults= function(deferredList){
- // summary:
+ // summary:
// Gathers the results of the deferreds for packaging
// as the parameters to the Deferred Lists' callback
@@ -21204,6 +22025,7 @@ if(!dojo._hasResource["dijit.tree.TreeStoreModel"]){ //_hasResource checks added
dojo._hasResource["dijit.tree.TreeStoreModel"] = true;
dojo.provide("dijit.tree.TreeStoreModel");
+
dojo.declare(
"dijit.tree.TreeStoreModel",
null,
@@ -21415,7 +22237,7 @@ dojo.declare(
// 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], insertIndex: insertIndex};
+ 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.
@@ -21425,12 +22247,20 @@ dojo.declare(
this.pasteItem(item, null, parent, true, insertIndex);
}else{
// Create new item in the tree, based on the drag source.
- this.store.newItem(args, pInfo);
+ 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
- this.store.newItem(args, pInfo);
+ LnewItem=this.store.newItem(args, pInfo);
+ if (LnewItem && (insertIndex!=undefined)){
+ // Move new item to desired position
+ this.pasteItem(LnewItem, parent, parent, false, insertIndex);
+ }
}
},
@@ -21564,8 +22394,6 @@ dojo.declare(
}
});
-
-
}
if(!dojo._hasResource["dijit.tree.ForestStoreModel"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -21576,14 +22404,22 @@ dojo.provide("dijit.tree.ForestStoreModel");
dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
// summary:
- // Interface between Tree and a dojo.store that doesn't have a root item,
- // i.e. has multiple "top level" items.
+ // 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.store, making all the items matching the specified query
+ // 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.
- // It allows dijit.Tree to assume a single root item, even if the store doesn't have one.
+ // 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
@@ -21783,9 +22619,9 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
// 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).
//
- // Developers can override this function to do something more efficient if they can
- // detect which items are possible top level items (based on the item and the
- // parentInfo parameters). Often all top level items have parentInfo==null, but
+ // 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
@@ -21805,10 +22641,926 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
}
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);
}
+
+});
+
+}
+
+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.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};
+ };
+};
+
+}
+
+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
+ },
+
+ 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", "");
+ }
});
+}
+
+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.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);
+ }
+ }
+});
}
@@ -21826,6 +23578,8 @@ dojo.provide("dijit.Tree");
+
+
dojo.declare(
"dijit._TreeNode",
[dijit._Widget, dijit._Templated, dijit._Container, dijit._Contained, dijit._CssStateMixin],
@@ -21836,7 +23590,7 @@ dojo.declare(
// tags:
// private
- // item: dojo.data.Item
+ // item: [const] dojo.data.Item
// the dojo.data entry this tree represents
item: null,
@@ -21863,7 +23617,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\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t/><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" waiRole=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" waiRole=\"presentation\" style=\"display: none;\"></div>\n</div>\n"),
+ 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",
@@ -21878,7 +23632,7 @@ dojo.declare(
tooltip: {node: "rowNode", type: "attribute", attribute: "title"}
}),
- postCreate: function(){
+ buildRendering: function(){
this.inherited(arguments);
// set expand icon for leaf
@@ -21890,6 +23644,9 @@ dojo.declare(
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){
@@ -21898,7 +23655,6 @@ dojo.declare(
// description:
// 0 for top level nodes, 1 for their children, 2 for their
// grandchildren, etc.
- this.indent = indent;
// Math.max() is to prevent negative padding on hidden root node (when indent == -1)
var pixels = (Math.max(indent, 0) * this.tree._nodePixelIndent) + "px";
@@ -21909,6 +23665,8 @@ dojo.declare(
dojo.forEach(this.getChildren(), function(child){
child.set("indent", indent+1);
});
+
+ this._set("indent", indent);
},
markProcessing: function(){
@@ -21962,14 +23720,11 @@ dojo.declare(
var clsName = "_" + lower + "Class";
var nodeName = lower + "Node";
+ var oldCls = this[clsName];
- if(this[clsName]){
- dojo.removeClass(this[nodeName], this[clsName]);
- }
this[clsName] = this.tree["get" + upper + "Class"](item, this.isExpanded);
- if(this[clsName]){
- dojo.addClass(this[nodeName], this[clsName]);
- }
+ dojo.replaceClass(this[nodeName], this[clsName] || "", oldCls || "");
+
dojo.style(this[nodeName], this.tree["get" + upper + "Style"](item, this.isExpanded) || {});
},
@@ -21999,8 +23754,7 @@ dojo.declare(
idx = processing ? 0 : (this.isExpandable ? (this.isExpanded ? 1 : 2) : 3);
// apply the appropriate class to the expando node
- dojo.removeClass(this.expandoNode, styles);
- dojo.addClass(this.expandoNode, styles[idx]);
+ dojo.replaceClass(this.expandoNode, styles[idx], styles);
// provide a non-image based indicator for images-off mode
this.expandoNodeText.innerHTML = _a11yStates[idx];
@@ -22025,7 +23779,9 @@ dojo.declare(
// set when the animation completes instead
this.isExpanded = true;
dijit.setWaiState(this.labelNode, "expanded", "true");
- dijit.setWaiRole(this.containerNode, "group");
+ if(this.tree.showRoot || this !== this.tree.rootNode){
+ dijit.setWaiRole(this.containerNode, "group");
+ }
dojo.addClass(this.contentNode,'dijitTreeContentExpanded');
this._setExpando();
this._updateItemClasses(this.item);
@@ -22187,6 +23943,22 @@ dojo.declare(
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);
@@ -22314,17 +24086,25 @@ dojo.declare(
// One ore more attributes that holds children of a tree node
childrenAttr: ["children"],
- // path: String[] or Item[]
- // Full path from rootNode to selected node expressed as array of items or array of ids.
- // Since setting the path may be asynchronous (because ofwaiting on dojo.data), set("path", ...)
+ // 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: [],
- // selectedItem: [readonly] Item
- // The currently selected item in this tree.
- // This property can only be set (via set('selectedItem', ...)) when that item is already
+ // 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 `path` attribute to set the selected item instead.
+ // 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
@@ -22335,20 +24115,21 @@ 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\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" dojoAttachPoint=\"indentDetector\"></div>\n</div>\n"),
+ 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`
+ // 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".
- dndController: null,
+ // 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"],
@@ -22566,6 +24347,12 @@ dojo.declare(
}));
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);
@@ -22602,104 +24389,103 @@ dojo.declare(
},
_setSelectedItemAttr: function(/*dojo.data.Item or id*/ item){
- // summary:
- // Select a tree node related to passed item.
- // WARNING: if model use multi-parented items or desired tree node isn't already loaded
- // behavior is undefined. Use set('path', ...) instead.
-
- var oldValue = this.get("selectedItem");
- var identity = (!item || dojo.isString(item)) ? item : this.model.getIdentity(item);
- if(identity == oldValue ? this.model.getIdentity(oldValue) : null){ return; }
- var nodes = this._itemNodesMap[identity];
- this._selectNode((nodes && nodes[0]) || null); //select the first item
+ this.set('selectedItems', [item]);
},
- _getSelectedItemAttr: function(){
+ _setSelectedItemsAttr: function(/*dojo.data.Items or ids*/ items){
// summary:
- // Return item related to selected tree node.
- return this.selectedNode && this.selectedNode.item;
+ // 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:
- // Select the tree node identified by passed path.
- // path:
- // Array of items or item id's
+ // 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;
- var d = new dojo.Deferred();
-
- this._selectNode(null);
- if(!path || !path.length){
- d.resolve(true);
- return d;
- }
+ // 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 this is called during initialization, defer running until Tree has finished loading
- this._loadDeferred.addCallback(dojo.hitch(this, function(){
- if(!this.rootNode){
- d.reject(new Error("!this.rootNode"));
- return;
- }
- if(path[0] !== this.rootNode.item && (dojo.isString(path[0]) && path[0] != this.model.getIdentity(this.rootNode.item))){
- d.reject(new Error(this.id + ":path[0] doesn't match this.rootNode.item. Maybe you are using the wrong tree."));
- return;
+ 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");
}
- path.shift();
-
- var node = this.rootNode;
-
- function advance(){
- // summary:
- // Called when "node" has completed loading and expanding. Pop the next item from the path
- // (which must be a child of "node") and advance to it, and then recurse.
-
- // Set item and identity to next item in path (node is pointing to the item that was popped
- // from the path _last_ time.
- var item = path.shift(),
- identity = dojo.isString(item) ? item : this.model.getIdentity(item);
-
- // Change "node" from previous item in path to the item we just popped from path
- dojo.some(this._itemNodesMap[identity], function(n){
- if(n.getParent() == node){
- node = n;
- return true;
- }
- return false;
- });
+ 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){
- // Need to do more expanding
- this._expandNode(node).addCallback(dojo.hitch(this, advance));
+ tree._expandNode(nextNode).addCallback(function(){ selectPath(path, nextNode.getChildren(), def); });
}else{
- // Final destination node, select it
- this._selectNode(node);
-
- // signal that path setting is finished
- d.resolve(true);
+ //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];}));
+ }
+ },
- this._expandNode(node).addCallback(dojo.hitch(this, advance));
+ _setSelectedNodeAttr: function(node){
+ this.set('selectedNodes', [node]);
+ },
+ _setSelectedNodesAttr: function(nodes){
+ this._loadDeferred.addCallback( dojo.hitch(this, function(){
+ this.dndController.setSelection(nodes);
}));
-
- return d;
},
- _getPathAttr: function(){
- // summary:
- // Return an array of items that is the path to selected tree node.
- if(!this.selectedNode){ return; }
- var res = [];
- var treeNode = this.selectedNode;
- while(treeNode && treeNode !== this.rootNode){
- res.unshift(treeNode.item);
- treeNode = treeNode.getParent();
- }
- res.unshift(this.rootNode.item);
- return res;
- },
////////////// Data store related functions //////////////////////
// These just get passed to the model; they are here for back-compat
@@ -22804,7 +24590,7 @@ dojo.declare(
if(!treeNode){ return; }
var key = e.charOrCode;
- if(typeof key == "string"){ // handle printables (letter navigation)
+ 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() } );
@@ -22823,6 +24609,11 @@ dojo.declare(
// 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";
@@ -22838,10 +24629,10 @@ dojo.declare(
}
},
- _onEnterKey: function(/*Object*/ message, /*Event*/ evt){
+ _onEnterKey: function(/*Object*/ message){
this._publish("execute", { item: message.item, node: message.node } );
- this._selectNode(message.node);
- this.onClick(message.item, message.node, evt);
+ this.dndController.userSelect(message.node, dojo.isCopyKey( message.evt ), message.evt.shiftKey);
+ this.onClick(message.item, message.node, message.evt);
},
_onDownArrow: function(/*Object*/ message){
@@ -22993,12 +24784,17 @@ 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);
+ },
_onClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){
// summary:
// Translates click events into commands for the controller to process
var domElement = e.target,
- isExpandoClick = (domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText);
+ 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
@@ -23010,9 +24806,6 @@ dojo.declare(
this.onClick(nodeWidget.item, nodeWidget, e);
this.focusNode(nodeWidget);
}
- if(!isExpandoClick){
- this._selectNode(nodeWidget);
- }
dojo.stopEvent(e);
},
_onDblClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){
@@ -23032,9 +24825,6 @@ dojo.declare(
this.onDblClick(nodeWidget.item, nodeWidget, e);
this.focusNode(nodeWidget);
}
- if(!isExpandoClick){
- this._selectNode(nodeWidget);
- }
dojo.stopEvent(e);
},
@@ -23213,21 +25003,6 @@ dojo.declare(
dijit.focus(node.labelNode);
},
- _selectNode: function(/*_tree.Node*/ node){
- // summary:
- // Mark specified node as select, and unmark currently selected node.
- // tags:
- // protected
-
- if(this.selectedNode && !this.selectedNode._destroyed){
- this.selectedNode.setSelected(false);
- }
- if(node){
- node.setSelected(true);
- }
- this.selectedNode = node;
- },
-
_onNodeFocus: function(/*dijit._Widget*/ node){
// summary:
// Called when a TreeNode gets focus, either by user clicking
@@ -23306,13 +25081,16 @@ dojo.declare(
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];
}
},
@@ -23385,13 +25163,12 @@ dojo.declare(
resize: function(changeSize){
if(changeSize){
dojo.marginBox(this.domNode, changeSize);
- dojo.style(this.domNode, "overflow", "auto"); // for scrollbars
}
// 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.marginBox(this.tree.indentDetector).w;
+ this._nodePixelIndent = dojo._getMarginSize(this.tree.indentDetector).w;
if(this.tree.rootNode){
// If tree has already loaded, then reset indent for all the nodes
@@ -23413,822 +25190,6 @@ dojo.declare(
// For back-compat. TODO: remove in 2.0
-
-
-}
-
-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.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.removeClass(this.node, prefix + this[state]);
- dojo.addClass(this.node, prefix + newState);
- 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};
- };
-};
-
-}
-
-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.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 node = this.selection[key],
- ret = {
- data: dijit.getEnclosingWidget(node),
- 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.rowNode;
- this.currentWidget = widget;
- },
-
- onMouseOut: function(/*TreeNode*/ widget, /*Event*/ evt){
- // summary:
- // Called when mouse is moved away from a TreeNode
- // tags:
- // protected
- this.current = null;
- this.currentWidget = 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.removeClass(this.node, prefix + this[state]);
- dojo.addClass(this.node, prefix + newState);
- 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", "");
- }
-});
-
-}
-
-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.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;
- this.simpleSelection=false;
-
- 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
-
- getSelectedNodes: function(){
- // summary:
- // Returns the set of selected nodes.
- // Used by dndSource on the start of a drag.
- // tags:
- // protected
- return this.selection;
- },
-
- selectNone: function(){
- // summary:
- // Unselects all items
- // tags:
- // private
-
- return this._removeSelection()._removeAnchor(); // self
- },
-
- destroy: function(){
- // summary:
- // Prepares the object to be garbage-collected
- this.inherited(arguments);
- this.selection = this.anchor = null;
- },
-
- // mouse events
- onMouseDown: function(e){
- // summary:
- // Event processor for onmousedown
- // e: Event
- // mouse event
- // tags:
- // protected
-
- if(!this.current){ return; }
-
- if(e.button == dojo.mouseButtons.RIGHT){ return; } // ignore right-click
-
- var treeNode = dijit.getEnclosingWidget(this.current),
- id = treeNode.id + "-dnd" // so id doesn't conflict w/widget
-
- if(!dojo.hasAttr(this.current, "id")){
- dojo.attr(this.current, "id", id);
- }
-
- if(!this.singular && !dojo.isCopyKey(e) && !e.shiftKey && (this.current.id in this.selection)){
- this.simpleSelection = true;
- dojo.stopEvent(e);
- return;
- }
- 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] = this.current;
- }
- }else{
- if(!this.singular && e.shiftKey){
- if(dojo.isCopyKey(e)){
- //TODO add range to selection
- }else{
- //TODO select new range from anchor
- }
- }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] = this.current;
- }
- }
- }else{
- if(!(id in this.selection)){
- this.selectNone();
- this.anchor = this.current;
- this._addItemClass(this.current, "Anchor");
- this.selection[id] = this.current;
- }
- }
- }
- }
-
- dojo.stopEvent(e);
- },
-
- onMouseUp: function(e){
- // summary:
- // Event processor for onmouseup
- // e: Event
- // mouse event
- // tags:
- // protected
-
- // TODO: this code is apparently for handling an edge case when the user is selecting
- // multiple nodes and then mousedowns on a node by accident... it lets the user keep the
- // current selection by moving the mouse away (or something like that). It doesn't seem
- // to work though and requires a lot of plumbing (including this code, the onmousemove
- // handler, and the this.simpleSelection attribute. Consider getting rid of all of it.
-
- 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] = this.current;
- }
- },
- onMouseMove: function(e){
- // summary
- // event processor for onmousemove
- // e: Event
- // mouse event
- this.simpleSelection = false;
- },
-
- _removeSelection: function(){
- // summary:
- // Unselects all items
- // tags:
- // private
- 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(){
- // summary:
- // Removes the Anchor CSS class from a node.
- // According to `dojo.dnd.Selector`, anchor means that
- // "an item is selected, and is an anchor for a 'shift' selection".
- // It's not relevant for Tree at this point, since we don't support multiple selection.
- // tags:
- // private
- if(this.anchor){
- this._removeItemClass(this.anchor, "Anchor");
- this.anchor = null;
- }
- 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;
- for(var id in this.selection){
- console.log("selected item id: " + id);
- f.call(o, this.getItem(id), id, this);
- }
- }
-});
-
}
if(!dojo._hasResource["dojo.dnd.Avatar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -24319,7 +25280,7 @@ dojo.declare("dojo.dnd.Avatar", null, {
var icon = dojo.byId("a11yIcon");
var text = '+'; // assume canDrop && copy
if (this.manager.canDropFlag && !this.manager.copy) {
- text = '< '; // canDrop && move
+ text = '< '; // canDrop && move
}else if (!this.manager.canDropFlag && !this.manager.copy) {
text = "o"; //!canDrop && move
}else if(!this.manager.canDropFlag){
@@ -24420,7 +25381,7 @@ dojo.declare("dojo.dnd.Manager", null, {
dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent)
];
var c = "dojoDnd" + (copy ? "Copy" : "Move");
- dojo.addClass(dojo.body(), c);
+ dojo.addClass(dojo.body(), c);
},
canDrop: function(flag){
// summary:
@@ -24434,8 +25395,7 @@ dojo.declare("dojo.dnd.Manager", null, {
stopDrag: function(){
// summary:
// stop the DnD in progress
- dojo.removeClass(dojo.body(), "dojoDndCopy");
- dojo.removeClass(dojo.body(), "dojoDndMove");
+ dojo.removeClass(dojo.body(), ["dojoDndCopy", "dojoDndMove"]);
dojo.forEach(this.events, dojo.disconnect);
this.events = [];
this.avatar.destroy();
@@ -24468,7 +25428,7 @@ dojo.declare("dojo.dnd.Manager", null, {
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){
+ if(this.copy != copy){
this._setCopyStatus(copy);
}
}
@@ -24502,7 +25462,7 @@ dojo.declare("dojo.dnd.Manager", null, {
switch(e.keyCode){
case dojo.keys.CTRL:
var copy = Boolean(this.source.copyState(true));
- if(this.copy != copy){
+ if(this.copy != copy){
this._setCopyStatus(copy);
}
break;
@@ -24520,7 +25480,7 @@ dojo.declare("dojo.dnd.Manager", null, {
// keyboard event
if(this.avatar && e.keyCode == dojo.keys.CTRL){
var copy = Boolean(this.source.copyState(false));
- if(this.copy != copy){
+ if(this.copy != copy){
this._setCopyStatus(copy);
}
}
@@ -24535,8 +25495,9 @@ dojo.declare("dojo.dnd.Manager", null, {
this.copy = copy;
this.source._markDndStatus(this.copy);
this.updateAvatar();
- dojo.removeClass(dojo.body(), "dojoDnd" + (this.copy ? "Move" : "Copy"));
- dojo.addClass(dojo.body(), "dojoDnd" + (this.copy ? "Copy" : "Move"));
+ dojo.replaceClass(dojo.body(),
+ "dojoDnd" + (this.copy ? "Copy" : "Move"),
+ "dojoDnd" + (this.copy ? "Move" : "Copy"));
}
});
@@ -24694,9 +25655,8 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
// Keeps track of current drop target.
var m = dojo.dnd.manager(),
- oldTarget = this.targetAnchor, // the DOMNode corresponding to TreeNode mouse was previously over
- newTarget = this.current, // DOMNode corresponding to TreeNode mouse is currently over
- newTargetWidget = this.currentWidget, // the TreeNode itself
+ 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
@@ -24705,7 +25665,7 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
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, true);
+ this.targetBox = dojo.position(newTarget.rowNode, true);
}
if((e.pageY - this.targetBox.y) <= this.betweenThreshold){
newDropPosition = "Before";
@@ -24716,23 +25676,23 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
if(newTarget != oldTarget || newDropPosition != oldDropPosition){
if(oldTarget){
- this._removeItemClass(oldTarget, oldDropPosition);
+ this._removeItemClass(oldTarget.rowNode, oldDropPosition);
}
if(newTarget){
- this._addItemClass(newTarget, newDropPosition);
+ 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(newTargetWidget == this.tree.rootNode && newDropPosition != "Over"){
+ }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, m.source, newDropPosition.toLowerCase())
- && !this._isParentChildDrop(m.source, newTarget)){
+ }else if(this.checkItemAcceptance(newTarget.rowNode, m.source, newDropPosition.toLowerCase())
+ && !this._isParentChildDrop(m.source, newTarget.rowNode)){
m.canDrop(true);
}else{
m.canDrop(false);
@@ -24758,12 +25718,23 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
}else{
if(this.mouseDown && this.isSource &&
(Math.abs(e.pageX-this._lastX)>=this.dragThreshold || Math.abs(e.pageY-this._lastY)>=this.dragThreshold)){
- var n = this.getSelectedNodes();
- var nodes=[];
- for(var i in n){
- nodes.push(n[i]);
- }
+ 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)));
}
}
@@ -24781,7 +25752,7 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
this.mouseButton = e.button;
this._lastX = e.pageX;
this._lastY = e.pageY;
- this.inherited("onMouseDown",arguments);
+ this.inherited(arguments);
},
onMouseUp: function(e){
@@ -24793,7 +25764,7 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
// private
if(this.mouseDown){
this.mouseDown = false;
- this.inherited("onMouseUp",arguments);
+ this.inherited(arguments);
}
},
@@ -24919,7 +25890,7 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
this.isDragging = false;
// Compute the new parent item
- var targetWidget = dijit.getEnclosingWidget(target);
+ var targetWidget = target;
var newParentItem;
var insertIndex;
newParentItem = (targetWidget && targetWidget.item) || tree.item;
@@ -24975,7 +25946,7 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
// 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, source);
+ newItemsParams = this.itemCreator(nodes, target.rowNode, source);
}
// Create new item in the tree, based on the drag source.
@@ -25049,16 +26020,13 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
var root = source.tree.domNode;
- var ids = {};
- for(var x in source.selection){
- ids[source.selection[x].parentNode.id] = true;
- }
+ 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 && (!node.id || !ids[node.id])){
+ while(node != root && !ids[node.id]){
node = node.parentNode;
}
@@ -25071,7 +26039,7 @@ dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
// tags:
// private
if(!this.targetAnchor){ return; }
- this._removeItemClass(this.targetAnchor, this.dropPosition);
+ this._removeItemClass(this.targetAnchor.rowNode, this.dropPosition);
this.targetAnchor = null;
this.targetBox = null;
this.dropPosition = null;
@@ -25103,7 +26071,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// { 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
+ // 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){
@@ -25118,7 +26086,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// ...
// typeN: function || object
// }
- // Where if it is a function, it is assumed to be an object constructor that takes the
+ // 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:
// {
@@ -25184,7 +26152,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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.
+ //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,
@@ -25192,19 +26160,19 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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
+ //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:
+ // item:
// The item to test for being contained by the store.
- if(!this.isItem(item)){
+ if(!this.isItem(item)){
throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
}
},
@@ -25212,25 +26180,25 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
_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:
+ // attribute:
// The attribute to test for being contained by the store.
- if(typeof attribute !== "string"){
+ if(typeof attribute !== "string"){
throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");
}
},
- getValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
+ getValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
/* value? */ defaultValue){
- // summary:
+ // 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,
+ getValues: function(/* item */ item,
/* attribute-name-string */ attribute){
- // summary:
+ // summary:
// See dojo.data.api.Read.getValues()
this._assertIsItem(item);
@@ -25240,7 +26208,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
getAttributes: function(/* item */ item){
- // summary:
+ // summary:
// See dojo.data.api.Read.getAttributes()
this._assertIsItem(item);
var attributes = [];
@@ -25255,17 +26223,17 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
hasAttribute: function( /* item */ item,
/* attribute-name-string */ attribute){
- // summary:
+ // 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,
+ containsValue: function(/* item */ item,
+ /* attribute-name-string */ attribute,
/* anything */ value){
- // summary:
+ // summary:
// See dojo.data.api.Read.containsValue()
var regexp = undefined;
if(typeof value === "string"){
@@ -25274,22 +26242,22 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
return this._containsValue(item, attribute, value, regexp); //boolean.
},
- _containsValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
+ _containsValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
/* anything */ value,
/* RegExp?*/ regexp){
- // summary:
+ // 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
+ // 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:
+ // value:
// The value to match.
// regexp:
// Optional regular expression generated off value if value was of string type to handle wildcarding.
@@ -25306,7 +26274,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
isItem: function(/* anything */ something){
- // summary:
+ // summary:
// See dojo.data.api.Read.isItem()
if(something && something[this._storeRefPropName] === this){
if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){
@@ -25317,25 +26285,25 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
isItemLoaded: function(/* anything */ something){
- // summary:
+ // summary:
// See dojo.data.api.Read.isItemLoaded()
return this.isItem(something); //boolean
},
loadItem: function(/* object */ keywordArgs){
- // summary:
+ // summary:
// See dojo.data.api.Read.loadItem()
this._assertIsItem(keywordArgs.item);
},
getFeatures: function(){
- // summary:
+ // summary:
// See dojo.data.api.Read.getFeatures()
return this._features; //Object
},
getLabel: function(/* item */ item){
- // summary:
+ // summary:
// See dojo.data.api.Read.getLabel()
if(this._labelAttr && this.isItem(item)){
return this.getValue(item,this._labelAttr); //String
@@ -25344,7 +26312,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
getLabelAttributes: function(/* item */ item){
- // summary:
+ // summary:
// See dojo.data.api.Read.getLabelAttributes()
if(this._labelAttr){
return [this._labelAttr]; //array
@@ -25352,10 +26320,10 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
return null; //null
},
- _fetchItems: function( /* Object */ keywordArgs,
- /* Function */ findCallback,
+ _fetchItems: function( /* Object */ keywordArgs,
+ /* Function */ findCallback,
/* Function */ errorCallback){
- // summary:
+ // summary:
// See dojo.data.util.simpleFetch.fetch()
var self = this,
filter = function(requestArgs, arrayOfItems){
@@ -25395,8 +26363,8 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}
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
+ // 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.
@@ -25416,11 +26384,11 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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
+ //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: ",
+ 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;
@@ -25431,21 +26399,21 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}
//See if there was any forced reset of data.
- if(this.data != null && this._jsonData == null){
+ 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
+ //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,
+ url: self._jsonFileUrl,
handleAs: "json-comment-optional",
preventCache: this.urlPreventCache,
failOk: this.failOk
@@ -25505,7 +26473,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
_handleQueuedFetches: function(){
- // summary:
+ // summary:
// Internal function to execute delayed request in the store.
//Execute any deferred fetches now.
if(this._queuedFetches.length > 0){
@@ -25514,7 +26482,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
delayedQuery = fData.args,
delayedFilter = fData.filter;
if(delayedFilter){
- delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions));
+ delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions));
}else{
this.fetchItemByIdentity(delayedQuery);
}
@@ -25524,31 +26492,31 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
_getItemsArray: function(/*object?*/queryOptions){
- // summary:
+ // 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._arrayOfAllItems;
}
return this._arrayOfTopLevelItems;
},
close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
- // summary:
+ // summary:
// See dojo.data.api.Read.close()
- if(this.clearOnClose &&
- this._loadFinished &&
+ 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
+ //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) &&
+ 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." +
+ " information has not been provided." +
" Please set 'url' or 'data' to the appropriate value before" +
" the next fetch");
}
@@ -25586,7 +26554,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// | false == valueIsAnItem("Kermit");
// | false == valueIsAnItem(42);
// | false == valueIsAnItem(new Date());
- // | false == valueIsAnItem({_type:'Date', _value:'May 14, 1802'});
+ // | false == valueIsAnItem({_type:'Date', _value:'1802-05-14'});
// | false == valueIsAnItem({_reference:'Kermit'});
// | true == valueIsAnItem({name:'Kermit', color:'green'});
// | true == valueIsAnItem({iggy:'pop'});
@@ -25597,8 +26565,8 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
(!dojo.isArray(aValue) || addingArrays) &&
(!dojo.isFunction(aValue)) &&
(aValue.constructor == Object || dojo.isArray(aValue)) &&
- (typeof aValue._reference === "undefined") &&
- (typeof aValue._type === "undefined") &&
+ (typeof aValue._reference === "undefined") &&
+ (typeof aValue._type === "undefined") &&
(typeof aValue._value === "undefined") &&
self.hierarchical
);
@@ -25648,13 +26616,13 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
item[this._rootItemPropName]=true;
}
- // Step 2: Walk through all the attribute values of all the items,
+ // 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
+ //
+ // 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;
@@ -25688,9 +26656,9 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
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
+ // 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;
@@ -25702,7 +26670,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
item = this._arrayOfAllItems[i];
arrayOfValues = item[identifier];
var identity = arrayOfValues[0];
- if(!this._itemsByIdentity[identity]){
+ if(!Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
this._itemsByIdentity[identity] = item;
}else{
if(this._jsonFileUrl){
@@ -25716,7 +26684,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
this._features['dojo.data.api.Identity'] = Number;
}
- // Step 5: Walk through all the items, and set each item's properties
+ // 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];
@@ -25730,13 +26698,13 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// 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] }
+ // { 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:'July 18, 1918'}] }
+ // { name:['Nelson Mandela'], born:[{_type:'Date', _value:'1918-07-18'}] }
// into this:
- // { name:['Kermit'], born:(new Date('July 18, 1918')) }
+ // { 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){
@@ -25749,7 +26717,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
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){
+ 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);
@@ -25772,12 +26740,12 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
var candidateItem = this._arrayOfAllItems[k],
found = true;
for(var refKey in referenceDescription){
- if(candidateItem[refKey] != referenceDescription[refKey]){
- found = false;
+ if(candidateItem[refKey] != referenceDescription[refKey]){
+ found = false;
}
}
- if(found){
- arrayOfValues[j] = candidateItem;
+ if(found){
+ arrayOfValues[j] = candidateItem;
}
}
}
@@ -25788,7 +26756,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}
}
}else if(this.isItem(value)){
- //It's a child item (not one referenced through _reference).
+ //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){
@@ -25817,7 +26785,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
getIdentity: function(/* item */ item){
- // summary:
+ // summary:
// See dojo.data.api.Identity.getIdentity()
var identifier = this._features['dojo.data.api.Identity'];
if(identifier === Number){
@@ -25832,7 +26800,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
fetchItemByIdentity: function(/* Object */ keywordArgs){
- // summary:
+ // summary:
// See dojo.data.api.Identity.fetchItemByIdentity()
// Hasn't loaded yet, we have to trigger the load.
@@ -25843,11 +26811,11 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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
+ //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: ",
+ 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;
@@ -25870,7 +26838,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}else{
this._loadInProgress = true;
var getArgs = {
- url: self._jsonFileUrl,
+ url: self._jsonFileUrl,
handleAs: "json-comment-optional",
preventCache: this.urlPreventCache,
failOk: this.failOk
@@ -25913,7 +26881,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
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);
@@ -25928,9 +26896,10 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
// summary:
// Internal function to look an item up by its identity map.
var item = null;
- if(this._itemsByIdentity){
+ if(this._itemsByIdentity &&
+ Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
item = this._itemsByIdentity[identity];
- }else{
+ }else if (Object.hasOwnProperty.call(this._arrayOfAllItems, identity)){
item = this._arrayOfAllItems[identity];
}
if(item === undefined){
@@ -25940,15 +26909,15 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
getIdentityAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Identity.getIdentifierAttributes()
+ // 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
+ // spec says we need to return null if the identity is not composed
+ // of attributes
return null; // null
}else{
return [identifier]; // Array
@@ -25956,18 +26925,18 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
},
_forceLoad: function(){
- // summary:
+ // 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.
+ // 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
+ //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: ",
+ 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;
@@ -25978,14 +26947,14 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
}
//See if there was any forced reset of data.
- if(this.data != null && this._jsonData == null){
+ if(this.data != null){
this._jsonData = this.data;
this.data = null;
}
if(this._jsonFileUrl){
var getArgs = {
- url: this._jsonFileUrl,
+ url: this._jsonFileUrl,
handleAs: "json-comment-optional",
preventCache: this.urlPreventCache,
failOk: this.failOk,
@@ -25994,7 +26963,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
var getHandler = dojo.xhrGet(getArgs);
getHandler.addCallback(function(data){
try{
- //Check to be sure there wasn't another load going on concurrently
+ //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.
@@ -26007,7 +26976,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
//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.");
+ throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");
}
}catch(e){
console.log(e);
@@ -26021,7 +26990,7 @@ dojo.declare("dojo.data.ItemFileReadStore", null,{
self._getItemsFromLoadedData(self._jsonData);
self._jsonData = null;
self._loadFinished = true;
- }
+ }
}
});
//Mix in the simple fetch implementation to this class.
@@ -26034,6 +27003,7 @@ 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)
@@ -26044,7 +27014,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// ...
// typeN: function || object
// }
- // Where if it is a function, it is assumed to be an object constructor that takes the
+ // 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:
@@ -26060,8 +27030,8 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// For keeping track of changes so that we can implement isDirty and revert
this._pending = {
- _newItems:{},
- _modifiedItems:{},
+ _newItems:{},
+ _modifiedItems:{},
_deletedItems:{}
};
@@ -26124,8 +27094,8 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
}
}
- // 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,
+ // 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");
@@ -26134,7 +27104,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined");
var newItem = {};
- newItem[this._storeRefPropName] = this;
+ newItem[this._storeRefPropName] = this;
newItem[this._itemNumPropName] = this._arrayOfAllItems.length;
if(this._itemsByIdentity){
this._itemsByIdentity[newIdentity] = newItem;
@@ -26187,14 +27157,14 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// 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
+ // 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:
+ // 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
+ // 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");
}
@@ -26231,17 +27201,17 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
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()
+ // 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
+ //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
+ //Get the attributes list before we generate the backup so it
//doesn't pollute the attributes list.
var attributes = this.getAttributes(item);
@@ -26287,7 +27257,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
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);
+ this._removeReferenceFromMap(item, containingItem, attribute);
if(newValues.length < oldValues.length){
this._setValueOrValues(containingItem, attribute, newValues, true);
}
@@ -26349,11 +27319,11 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
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
+ // 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.
+ // have a record of the original state.
var copyOfItemState = {};
for(var key in item){
if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){
@@ -26374,7 +27344,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
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
+ // 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
@@ -26398,7 +27368,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// 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
+ // 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);
@@ -26406,7 +27376,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
newValueArray = [newValueOrValues];
}
- //We need to handle reference integrity if this is on.
+ //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){
@@ -26433,7 +27403,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
if(map[id.toString()]){
delete map[id.toString()];
}else{
- this._addReferenceToMap(possibleItem, item, attribute);
+ this._addReferenceToMap(possibleItem, item, attribute);
}
}
}, this);
@@ -26463,7 +27433,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// Now we make the dojo.data.api.Notification call
if(callOnSet){
- this.onSet(item, attribute, oldValueOrValues, newValueOrValues);
+ this.onSet(item, attribute, oldValueOrValues, newValueOrValues);
}
return success; // boolean
},
@@ -26498,7 +27468,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
// 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
+ // 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:
@@ -26555,7 +27525,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
_flatten: function(/* anything */ value){
if(this.isItem(value)){
var item = value;
- // Given an item, return an serializable object that provides a
+ // 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"});
@@ -26586,7 +27556,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
},
_getNewFileContentString: function(){
- // summary:
+ // 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
@@ -26627,7 +27597,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
},
_isEmpty: function(something){
- // summary:
+ // summary:
// Function to determine if an array or object has no properties or values.
// something:
// The array or object to examine.
@@ -26656,7 +27626,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
var self = this;
var saveCompleteCallback = function(){
self._pending = {
- _newItems:{},
+ _newItems:{},
_modifiedItems:{},
_deletedItems:{}
};
@@ -26705,7 +27675,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
modifiedItem = this._arrayOfAllItems[identity];
}
- // Restore the original item into a full-fledged item again, we want to try to
+ // 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){
@@ -26746,7 +27716,7 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
}
this._addReferenceToMap(refItem, deletedItem, reference.attr);
}, this);
- delete deletedItem["backupRefs_" + this._reverseRefMap];
+ delete deletedItem["backupRefs_" + this._reverseRefMap];
}
}
@@ -26765,8 +27735,8 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
}
this._pending = {
- _newItems:{},
- _modifiedItems:{},
+ _newItems:{},
+ _modifiedItems:{},
_deletedItems:{}
};
return true; // boolean
@@ -26777,13 +27747,13 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
if(item){
// return true if the item is dirty
var identity = this.getIdentity(item);
- return new Boolean(this._pending._newItems[identity] ||
+ 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) ||
+ if(!this._isEmpty(this._pending._newItems) ||
!this._isEmpty(this._pending._modifiedItems) ||
!this._isEmpty(this._pending._deletedItems)){
return true;
@@ -26794,28 +27764,28 @@ dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
/* dojo.data.api.Notification */
- onSet: function(/* item */ item,
- /*attribute-name-string*/ attribute,
+ 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
+ // 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.
+ // 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.
+ // No need to do anything. This method is here just so that the
+ // client code can connect observers to it.
},
close: function(/* object? */ request){
diff --git a/lib/dojo/uacss.js b/lib/dojo/uacss.js
index 781ab9c36..25b12f4bc 100644
--- a/lib/dojo/uacss.js
+++ b/lib/dojo/uacss.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojo.uacss"]){ //_hasResource checks added by build. Do n
dojo._hasResource["dojo.uacss"] = true;
dojo.provide("dojo.uacss");
+
(function(){
// summary:
// Applies pre-set CSS classes to the top-level HTML node, based on:
@@ -33,6 +34,7 @@ dojo.provide("dojo.uacss");
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,
@@ -61,7 +63,7 @@ dojo.provide("dojo.uacss");
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).
+ // 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()){
diff --git a/lib/dojo/window.js b/lib/dojo/window.js
index c36eb4c23..4e363faba 100644
--- a/lib/dojo/window.js
+++ b/lib/dojo/window.js
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
@@ -9,6 +9,8 @@ if(!dojo._hasResource["dojo.window"]){ //_hasResource checks added by build. Do
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
@@ -62,7 +64,9 @@ dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
return;
}
var backCompat = doc.compatMode == 'BackCompat',
- clientAreaRoot = backCompat? body : html,
+ 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,
@@ -87,14 +91,11 @@ dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
}else{
var pb = dojo._getPadBorderExtents(el);
elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t;
- }
-
- if(el != scrollRoot){ // body, html sizes already have the scrollbar removed
var clientSize = el.clientWidth,
scrollBarSize = elPos.w - clientSize;
if(clientSize > 0 && scrollBarSize > 0){
elPos.w = clientSize;
- if(isIE && rtl){ elPos.x += scrollBarSize; }
+ elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0;
}
clientSize = el.clientHeight;
scrollBarSize = elPos.h - clientSize;
@@ -123,8 +124,9 @@ dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
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 += (isIE >= 8 && !backCompat && rtl)? -s : s;
+ el.scrollLeft += s;
nodePos.x -= el.scrollLeft;
}
if(bot * t > 0){
@@ -133,7 +135,7 @@ dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
nodePos.y -= el.scrollTop;
}
el = (el != scrollRoot) && !fixedPos && el.parentNode;
- }
+ }
}catch(error){
console.error('scrollIntoView: ' + error);
node.scrollIntoView(false);